如何优化这种机组调度组合方法?

时间:2014-08-03 18:57:30

标签: c# performance algorithm

我的方法工作得非常好,但速度很慢,有时我需要等15分钟才能得到一个好的结果,这没关系,但是我想知道我是否可以让它更快。

基本上我运行最佳的舰队模拟,并且我预先计算了特定航程的可能船只组合,但是我必须为多次航行获得最佳的舰队组合。

显然,我不能在不同的船上使用相同的船长或船员,因为航行同时进行,这就是为什么每个内循环都有更多条件的原因。&n / p>

非常感谢任何帮助或指示。

private static Ship[] GetBestFleet3(IList<Voyage> voyages)
{
    var totalRate = 0;
    var previousStdDev = 100.0;
    Ship[] fleet = null;
    foreach (var ship0 in voyages[0].Ships)
    {
        foreach (var ship1 in voyages[1].Ships.Where(s => s.Captain != ship0.Captain && !s.Crew.Intersect(ship0.Crew).Any()))
        {
            foreach (var ship2 in voyages[2].Ships.Where(s => s.Captain != ship0.Captain && s.Captain != ship1.Captain && !s.Crew.Intersect(ship0.Crew).Any() && !s.Crew.Intersect(ship1.Crew).Any()))
            {
                var stdDev = Statistics.Variance(ship0, ship1, ship2);
                if (ship0.Rate + ship1.Rate + ship2.Rate > totalRate || ship0.Rate + ship1.Rate + ship2.Rate == totalRate && stdDev < previousStdDev)
                {
                    totalRate = ship0.Rate + ship1.Rate + ship2.Rate;
                    previousStdDev = stdDev;
                    fleet = new[] { ship0, ship1, ship2 };

                    if (ship0.Rate >= 100 && ship1.Rate >= 100 && ship1.Rate >= 100)
                    {
                        return fleet;
                    }
                }
            }
        }
    }
    return fleet;
}

1 个答案:

答案 0 :(得分:1)

现在你正在进行一次详尽的搜索(从我从你的嵌套for循环中看到的,我对代码的运行方式有点不清楚)对舰队机长组合进行判断运行时是一个很大的搜索空间。如果您想要运行速度更快但不能保证为您提供最佳解决方案的东西,您可能需要查看元启发式算法,如禁忌搜索,模拟退火或遗传算法。我不推荐使用Ant-Colony Optimization,因为我不确定如何将其转换为图表,而我的一位朋友也遇到了同样类型的问题(飞机和飞行员)没有看到它表现得非常好。

对于这方面的研究,请查看以下论文:

  • 多目标机组排班问题的模拟退火
  • 多目标遗传算法求解列车乘务员调度问题

或者,您可能希望查看并行详尽搜索,但问题更适合CodeReview