c#逻辑方法调度效率

时间:2013-09-17 11:36:39

标签: c# logic

三辆出租车排队等候他们在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)
            }
    }

}

1 个答案:

答案 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();
    }

您可以使用汽车或工作的所有组合。如果你有更多的汽车或工作,这可能会有所帮助。例如,如果您拥有的汽车多于作业,则可以创建长度等于作业数量的汽车的所有变体。 唯一需要做的就是简单地选择具有最多工作量的变体(或者您可能想要用来衡量“效率”的任何功能。)