【问题标题】:c# logic approach to dispatch efficiency [closed]调度效率的c#逻辑方法[关闭]
【发布时间】:2013-09-21 19:57:16
【问题描述】:

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

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

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

出租车 3 决定在 1 区等待,看看是否有工作预订,以便在 30 分钟内将他带到 2 区,以便与他在 2 区的工作联系起来。

然后一个接一个地,中心办公室在 1 区接 3 个工作。一旦所有工作被预订,出租车计算机就会调度这些工作。 工作 1 去出租车 1 这个工作在 2 区完成 工作 2 去出租车 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)
            }
    }

}

【问题讨论】:

  • 你自己尝试过什么吗?
  • 一般?您将工作分配给一辆出租车,然后将剩余工作之一分配给下一辆,依此类推。最后,您会得到“可以完成的工作”的计数。您为工作/出租车的任何可能组合(或直到jobsdone 等于taxicaount)执行此操作,然后选择“最佳”一个。虽然问题可能是“np-hard”?
  • 我希望我有更高的智商!

标签: c# logic


【解决方案1】:

如果允许您使用外部库(我假设一些家庭作业),您应该使用 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();
    }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多