Periksa Semua - Scala
Perkiraan skor: 2m ^ n
Saya mulai dari setiap mesin dan beralih ke semua tugas untuk membuat semua permutasi melalui tugas dengan mesin yang berbeda yang memenuhi tenggat waktu. Berarti jika semuanya dalam waktu saya akan mendapatkan 9 kemungkinan jalur dengan 2 mesin dan 3 tugas. (m ^ n) Setelah itu, saya mengambil jalur dengan biaya terendah.
Input disusun seperti ini (-> menjelaskan bagian-bagiannya dan karenanya tidak boleh dimasukkan):
M_1:5 3 5 4;M_2:4 2 7 5 --> time
M_1:5 4 2 6;M_2:3 7 3 3 --> cost
M_1:M_1}0 M_2}1;M_2:M_1}2 M_2}0 --> switch itme
M_1:M_1}0 M_2}2;M_2:M_1}1 M_2}0 --> switch cost
5 10 15 20 --> deadlines
Dan ini kodenya:
package Scheduling
import scala.io.StdIn.readLine
case class Cost(task: Map[String, List[Int]])
case class Switch(machine: Map[String, Map[String, Int]])
case class Path(time: Int, cost: Int, machine: List[String])
object Main {
def main(args: Array[String]) {
val (machines, cost_time, cost_money, switch_time, switch_money, deadlines) = getInput
val s = new Scheduler(machines, cost_time, cost_money, switch_time, switch_money, deadlines)
s.schedule
}
def getInput(): (List[String], Cost, Cost, Switch, Switch, List[Int]) = {
val cost_time = Cost(readLine("time to complete task").split(";").map{s =>
val parts = s.split(":")
(parts(0) -> parts(1).split(" ").map(_.toInt).toList)
}.toMap)
val cost_money = Cost(readLine("cost to complete task").split(";").map{s =>
val parts = s.split(":")
(parts(0) -> parts(1).split(" ").map(_.toInt).toList)
}.toMap)
val switch_time = Switch(readLine("time to switch").split(";").map{s =>
val parts = s.split(":")
(parts(0) -> parts(1).split(" ").map{t =>
val entries = t.split("}")
(entries(0) -> entries(1).toInt)
}.toMap)
}.toMap)
val switch_money = Switch(readLine("time to switch").split(";").map{s =>
val parts = s.split(":")
(parts(0) -> parts(1).split(" ").map{t =>
val entries = t.split("}")
(entries(0) -> entries(1).toInt)
}.toMap)
}.toMap)
val deadlines = readLine("deadlines").split(" ").map(_.toInt).toList
val machines = cost_time.task.keys.toList
(machines, cost_time, cost_money, switch_time, switch_money, deadlines)
}
}
class Scheduler(machines: List[String], cost_time: Cost, cost_money: Cost, switch_time: Switch, switch_money: Switch, deadlines: List[Int]) {
def schedule() {
var paths = List[Path]()
var alternatives = List[(Int, Path)]()
for (i <- machines) {
if (cost_time.task(i)(0) <= deadlines(0)) {
paths = paths ::: List(Path(cost_time.task(i)(0), cost_money.task(i)(0), List(i)))
}
}
val allPaths = deadlines.zipWithIndex.tail.foldLeft(paths)((paths, b) => paths.flatMap(x => calculatePath(x, b._1, b._2)))
if (allPaths.isEmpty) {
println("It is not possible")
} else {
println(allPaths.minBy(p=>p.cost).machine)
}
}
def calculatePath(prev: Path, deadline: Int, task: Int): List[Path] = {
val paths = machines.map(m => calculatePath(prev, task, m))
paths.filter(p => p.time <= deadline)
}
def calculatePath(prev: Path, task: Int, machine: String): Path = {
val time = prev.time + switch_time.machine(prev.machine.last)(machine) + cost_time.task(machine)(task)
val cost = prev.cost + switch_money.machine(prev.machine.last)(machine) + cost_money.task(machine)(task)
Path(time, cost, prev.machine :+ machine)
}
}
Saya juga punya ide untuk memulai dari belakang. Karena Anda selalu dapat memilih mesin dengan biaya terendah jika waktunya lebih kecil maka selisih dari tenggat waktu sebelumnya ke yang baru. Tapi itu tidak akan mengurangi runtime maksimal jika tugas dengan biaya yang lebih baik membutuhkan waktu lebih lama dari batas waktu terakhir.
Memperbarui
======
Berikut ini adalah pengaturan lainnya. waktu:
M_1 2 2 2 7
M_2 1 8 5 10
biaya:
M_1 4 4 4 4
M_2 1 1 1 1
beralih waktu:
M_1 M_2
M_1 0 2
M_2 6 0
biaya beralih:
M_1 M_2
M_1 0 2
M_2 2 0
tenggat waktu:
5 10 15 20
Sebagai masukan ke dalam program saya:
M_1:2 2 2 7;M_2:1 8 5 10
M_1:4 4 4 4;M_2:1 1 1 1
M_1:M_1}0 M_2}2;M_2:M_1}6 M_2}0
M_1:M_1}0 M_2}2;M_2:M_1}2 M_2}0
5 10 15 20
Yang ini memiliki dua solusi: waktu: 18, biaya: 15, jalur: Daftar (M_1, M_1, M_1, M_2) waktu: 18, biaya: 15, jalur: Daftar (M_2, M_1, M_1, M_1, M_1)
Yang menimbulkan pertanyaan bagaimana ini harus ditangani. Haruskah semua dicetak atau hanya satu? Dan bagaimana jika waktunya akan berbeda? Apakah satu dengan biaya terendah dan tidak ada tenggat waktu yang terlewat atau haruskah itu juga dengan waktu terendah?