三辆出租车排队等候他们在1区的下一份工作 这些出租车的呼号分别为1,2和3; 到达1区的出租车首先排队。
出租车1如果先出租车2是第二出租车,出租车3是第三出。
然而,出租车3有一份他之前被分配到的工作,这项工作将在30分钟内完成,但这项工作在第2区;
出租车3决定在1区等待,看看是否预定了一份工作,将他带到zone2,以便在30分钟内连接他在2区的工作。
然后中央办公室一个接一个地在区域1中取3个工作岗位。一旦所有工作都被预定,出租车计算机就会派遣工作。 job1去出租车1这个工作在2区完成 job2去滑行2这个工作在25区完成 job3不能去出租车3,因为它在22区完成,并且会让他在30分钟内在第2区的工作上迟到。
在job1上发送car3和在job3发送car1是有意义的。
使用c#编程我怎样才能完成调度汽车/工作的最有效方式。因此,Job 1进入Car 3 Job 2进入Car 2,jJob 3进入Car 1。
ForEach (myJobObj job in JobsToBedispatched)
{
ForEach (myTaxiObj taxi in taxisQued)
{
if(TaxiCanDoThisJob(job,taxi))
{
DispatchThisJobToThisTaxi(job,taxi)
}
else
{
MarkThisJobNoGoodForThisTaxi(job,taxi)
}
}
}
答案 0 :(得分:0)
如果您被允许使用外部库(我假设一些家庭作业),您应该使用Combinatorics库(通过NuGet)。如果没有,自己做组合的东西;)
这个想法:
您需要汽车和区域的所有可能(非重复)组合来找到完成大部分工作的组合。使用上面的lib中的Variations
,您已经为您提供了这种二维分配,因为您获得了一个具有索引的值。
请注意,我不是C#家伙,但更喜欢VB ......
private string[] jobs = { "Zone 2", "Zone 4", "Zone 45" };
private string[] cars = {"Frank", "John", "Mary"};
private void CheckJobs(){
var k = new Combinatorics.Collections.Variations<string>(jobs.ToList(),3);
foreach (var c in k)
{
int count = 0;
for (int i = 0; i < 3; i++)
{
if(IsPossible(cars[i],c[i])) count++;
Console.Write("Driver {0} takes {1} ", cars[i], c[i]);
}
Console.WriteLine("Jobs done = {0}", count);
}
}
private Boolean IsPossible(string car, string job)
{
if (car == "Mary") {
return (job == "Zone 2");
}
return true;
}
private void button1_Click(object sender, EventArgs e)
{
CheckJobs();
}
您可以使用汽车或工作的所有组合。如果你有更多的汽车或工作,这可能会有所帮助。例如,如果您拥有的汽车多于作业,则可以创建长度等于作业数量的汽车的所有变体。 唯一需要做的就是简单地选择具有最多工作量的变体(或者您可能想要用来衡量“效率”的任何功能。)