Kiểm tra tất cả - Scala
Điểm ước tính: 2m ^ n
Tôi bắt đầu từ mỗi máy và lặp lại tất cả các nhiệm vụ để tạo ra tất cả các hoán vị thông qua các tác vụ với các máy khác nhau đáp ứng thời hạn. Có nghĩa là nếu mọi thứ đúng lúc tôi sẽ nhận được 9 đường dẫn có thể với 2 máy và 3 nhiệm vụ. (m ^ n) Sau đó, tôi đi theo con đường với chi phí thấp nhất.
Đầu vào được cấu trúc như thế này (-> giải thích các phần và do đó không nên nhập):
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
Và đây là mã:
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)
}
}
Tôi cũng có một ý tưởng để bắt đầu từ phía sau. Vì bạn luôn có thể chọn một máy có chi phí thấp nhất nếu thời gian nhỏ hơn nên chênh lệch từ thời hạn trước đó đến máy mới. Nhưng điều đó sẽ không làm giảm thời gian chạy tối đa nếu tác vụ với chi phí tốt hơn mất nhiều thời gian hơn thì thời hạn cuối cùng được tính.
Cập nhật
======
Đây là một thiết lập khác. thời gian:
M_1 2 2 2 7
M_2 1 8 5 10
Giá cả:
M_1 4 4 4 4
M_2 1 1 1 1
thời gian chuyển đổi:
M_1 M_2
M_1 0 2
M_2 6 0
chi phí chuyển đổi:
M_1 M_2
M_1 0 2
M_2 2 0
thời hạn
5 10 15 20
Khi nhập vào chương trình của tôi:
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
Giải pháp này có hai giải pháp: thời gian: 18, chi phí: 15, đường dẫn: Danh sách (M_1, M_1, M_1, M_2) thời gian: 18, chi phí: 15, đường dẫn: Danh sách (M_2, M_1, M_1, M_1)
Điều này đặt ra câu hỏi làm thế nào điều này nên được xử lý. Tất cả nên được in hoặc chỉ một? Và nếu thời gian sẽ khác thì sao? Là một trong những chi phí thấp nhất và không có thời hạn bỏ lỡ đủ hay nó cũng nên là một trong những thời gian thấp nhất?