-5

三辆出租车在 1 区排队等待下一个工作,这些出租车的呼号分别是 1,2 和 3;到达 1 区的出租车排在最前面。

出租车 1 如果先出出租车 2 是第二出而出租车 3 是第三出。

但是,出租车 3 有一个他之前被分配的工作,这个工作将在 30 分钟内准备好,但这个工作在区域 2;

出租车 3 决定在 1 区等待,看看是否有工作预订,以便在 30 分钟内将他带到 2 区,以便与他在 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)
            }
    }

}
4

1 回答 1

0

如果您被允许使用外部库(我假设一些家庭作业),您应该使用 Combinatorics 库(通过 NuGet)。如果没有,请自己做组合的东西;)

这个想法:你需要所有可能的(非重复的)汽车和区域组合来找到完成最多工作的组合。从上面的库中使用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();
    }

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

于 2013-09-17T14:04:02.307 回答