我的方法工作得非常好,但速度很慢,有时我需要等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;
}
答案 0 :(得分:1)
现在你正在进行一次详尽的搜索(从我从你的嵌套for循环中看到的,我对代码的运行方式有点不清楚)对舰队机长组合进行判断运行时是一个很大的搜索空间。如果您想要运行速度更快但不能保证为您提供最佳解决方案的东西,您可能需要查看元启发式算法,如禁忌搜索,模拟退火或遗传算法。我不推荐使用Ant-Colony Optimization,因为我不确定如何将其转换为图表,而我的一位朋友也遇到了同样类型的问题(飞机和飞行员)没有看到它表现得非常好。
对于这方面的研究,请查看以下论文:
或者,您可能希望查看并行详尽搜索,但问题更适合CodeReview。