সমস্ত পরীক্ষা করুন - স্কেলা
আনুমানিক স্কোর: 2 মি। N
আমি প্রতিটি মেশিন থেকে শুরু করি এবং নির্ধারিত সময়সীমার সাথে মেলে এমন বিভিন্ন মেশিনের সাহায্যে কার্যের মাধ্যমে সমস্ত ক্রিয়াকলাপ তৈরি করতে সমস্ত কার্যগুলিতে পুনরাবৃত্তি করি। মানে সবকিছু যদি সময় মতো হয় তবে আমি 2 টি মেশিন এবং 3 টি কার্য সহ 9 টি সম্ভাব্য পাথ পাব। (m ^ n) এর পরে, আমি সর্বনিম্ন ব্যয় নিয়ে পথ ধরি।
ইনপুটটি এর মতো কাঠামোযুক্ত (-> অংশগুলি ব্যাখ্যা করে এবং এভাবে প্রবেশ করা উচিত নয়):
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
এবং এখানে কোড:
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)
}
}
আমি পিছন থেকে শুরু করার একটি ধারণা ছিল। যেহেতু আপনি সর্বদা সর্বনিম্ন ব্যয় সহ একটি মেশিন চয়ন করতে পারেন যদি সময়টি কম হয় তবে পূর্বের সময়সীমা থেকে নতুনের মধ্যে পার্থক্য। তবে এটি সর্বাধিক রানটাইম হ্রাস করবে না যদি আরও ভাল ব্যয়ের সাথে টাস্কটি আরও বেশি সময় নেয় তবে শেষ সময়সীমা নির্ধারিত হয়।
হালনাগাদ
======
এখানে আরও একটি সেট আপ আছে। সময়:
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_2
M_1 0 2
M_2 6 0
সুইচ ব্যয়:
M_1 M_2
M_1 0 2
M_2 2 0
সময়সীমা:
5 10 15 20
আমার প্রোগ্রামের ইনপুট হিসাবে:
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
এটির দুটি সমাধান রয়েছে: সময়: 18, মূল্য: 15, পথ: তালিকা (এম_1, এম_1, এম_1, এম 2) সময়: 18, ব্যয়: 15, পথ: তালিকা (এম 2, এম_1, এম_1, এম_1)
এটি কীভাবে পরিচালনা করা উচিত তা প্রশ্ন উত্থাপন করে। সব কি এক ছাপানো উচিত? আর সময় যদি অন্যরকম হত? সর্বনিম্ন ব্যয় সহ একটি কি যথেষ্ট পরিমাণে মিস হয়নি এবং এটিও সর্বনিম্ন সময়ের সাথে এক হওয়া উচিত?