Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调度效率的c#逻辑方法_C#_Logic - Fatal编程技术网

调度效率的c#逻辑方法

调度效率的c#逻辑方法,c#,logic,C#,Logic,三辆出租车在1区排队等待下一份工作 这些出租车的呼号分别为1、2和3; 到达1区的出租车排在第一位 如果先出的士2是第二出的士3是第三出的士1 但是,出租车3有一个他以前分配的工作,该工作将在30分钟内准备好,但该工作在2区 出租车3决定在1区等待,看看是否有工作预约,30分钟后将他带到2区,与2区的工作衔接 然后,中央办公室一个接一个地在1区做了3份工作。一旦所有的工作都预定好了,计程车计算机就会分派这些工作。 作业1到出租车1此作业在2区完成 作业2去出租车2此作业在25区完成 job3不能

三辆出租车在1区排队等待下一份工作 这些出租车的呼号分别为1、2和3; 到达1区的出租车排在第一位

如果先出的士2是第二出的士3是第三出的士1

但是,出租车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#编程,我如何实现最有效的车辆/作业调度方式。作业1到3号车,作业2到2号车,作业3到1号车

ForEach (myJobObj job in JobsToBedispatched)
{
    ForEach (myTaxiObj taxi in taxisQued)
    {
    if(TaxiCanDoThisJob(job,taxi))
            {
                DispatchThisJobToThisTaxi(job,taxi)
            }
            else
            {
                MarkThisJobNoGoodForThisTaxi(job,taxi)
            }
    }

}

如果你被允许使用外部库(我假设有一些家庭作业),你应该使用组合库(通过NuGet)。如果不是,你自己做组合运算;)

这个想法: 您需要所有可能的(非重复的)汽车和区域组合,才能找到完成最多工作的组合。使用上述库中的
变体
,您已经提供了这种二维分配,因为您得到了一个具有索引的值。 请注意,我不是一个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();
    }
private string[]jobs={“2区”、“4区”、“45区”};
私人字符串[]车={“弗兰克”、“约翰”、“玛丽”};
私有void CheckJobs(){
var k=新的组合学.集合.变体(jobs.ToList(),3);
foreach(k中的变量c)
{
整数计数=0;
对于(int i=0;i<3;i++)
{
if(IsPossible(cars[i],c[i])计数++;
Write(“驱动程序{0}取{1}”,cars[i],c[i]);
}
WriteLine(“作业完成={0}”,计数);
}
}
私有布尔值是可能的(字符串车、字符串作业)
{
如果(汽车=“玛丽”){
返回(作业=“区域2”);
}
返回true;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
CheckJobs();
}
您可以使用汽车或作业的所有组合。如果你有更多的汽车或工作,这可能会很有帮助。例如,如果您的汽车数量多于工作数量,则可以创建长度等于工作数量的所有汽车变体。
除此之外,唯一需要做的就是简单地选择完成作业数量最多的变体(或您可能想要用来衡量“效率”的任何函数)。

您自己尝试过任何事情吗?一般来说,您将一个作业分配给一辆出租车,然后将剩余的一个作业分配给下一辆出租车,依此类推。最后,您将获得“可以完成的工作”。你可以为任何可能的工作/出租车组合(或直到jobsdone等于出租车数量)这样做,然后选择“最好”的一个。尽管问题可能是“np难”?我希望我有更高的智商!