我在这里的第一篇文章 - 希望你能帮我设计一个我一直在考虑一段时间的算法 - 不知道采取什么方法(VRPTW或资源调度或完全不同的东西!?)
将它变成一个真实的例子,我们在少数地方(通常少于5个)有大量的花园垃圾。必须在规定的时间内将废物全部运送到其他地方。为了搬运花园垃圾,我们有拖车,必须用汽车牵引。花园垃圾只能在特定时间(时间窗口)掉落在垃圾场。在某些地方,我们可以放下拖车,由那里的人填满或清空,但在其他地方,汽车的司机必须自己做,汽车必须留在那里。可以计算所有时间(即加载/卸载时间,运输时间等)。汽车可以在没有拖车的地点之间移动,拖车可以拖空,但拖车不能在不同地点之间移动。
我们的目标是确保所有拖车装载的废物都在运输过程中
我想过将此作为一种资源调度算法,但我不确定如何处理预告片的“平衡”。
我考虑的另一种方法是首先考虑汽车。然后我可以选择最早的任务并在此之后构建所有可行任务的图表。如果我然后选择通过图表的最长路径,该路径将服务于最大数量的拖车负载。然后,我可以从任务列表中删除这些任务并重复,直到所有任务都得到服务。然后,我需要检查这些拖车负载列表,以计算出所需的预告片数量。
任何关于接近的想法都将不胜感激!
答案 0 :(得分:4)
我们肯定在这里谈论一个NP完整算法,除了一些汽车和预告片之外,这不是一个任务,你可以从所有可能的解决方案中获得最佳解决方案,然后能够丢弃并重新开始避免你建议的最长路径。如果你以这种方式设计你的算法,很可能有一天你会添加更多的汽车和预告片,它永远不会完成计算解决方案。
您可能希望使用能够合理快速生成足够好的问题解决方案的算法。确保您为解决方案的质量创建度量标准,您可以很好地估算理想解决方案的度量值,然后为自己设置一个%,在此范围内,您希望您的解决方案来自理想的解决方案,并且只需采取在边界内具有度量的第一个解决方案。这具有额外的好处,如果此算法花费太长时间来计算并且您中止它,您仍然可以使用具有最低计算度量的解决方案,即使它不在您预期的范围内。
我不知道采取什么方法来解决问题本身。我建议在搜索acm portal后阅读一些文章。我认为UPS和联邦快递可能有类似的问题,如果你把它们作为关键词添加到谷歌的搜索中,你可以得到一些更有用的结果。
答案 1 :(得分:4)
我同意Jiri ......你想要一个启发式算法,用一个可接受的解决方案快速合理地接近,然后从那里进行精炼。
我之前曾在公司工作过交付路由软件,他们采用的方法是使用遗传算法来解决非常相似但更大规模的问题。如果您不熟悉该方法,请选择look here。从该网站:
[新人口]通过重复以下步骤创建新人口,直到新人口完成
[选择]根据群体的适合度选择两个亲本染色体(适应度越高,选择的机会越大)
[Crossover]以交叉概率跨越父母以形成新的后代(孩子)。如果没有进行交叉,后代就是父母的精确副本。
[突变]突变概率突变每个基因座的新后代(染色体中的位置)。
[接受]将新后代置于新人群中
这方面的诀窍是将约束编码为“染色体”并编写“适应度”函数。适应度函数必须输入潜在解决方案的结果,并在违反任何约束条件的情况下吐出一个有效的解决方案,或将其丢弃。
正如Jiri所说,这个解决方案的优势在于它可以非常快速地提供可行的,但可能不是最好的答案,并且让它运行的时间越长,解决方案就越好。
答案 2 :(得分:1)
我倾向于同意罗伯特的观点。这听起来像是他所描述的遗传算法实现的进化优化技术的非常好的候选者。
我在粒子群优化(PSO)的某些问题上也取得了很好的成功。基本上,你可以将每个基因组视为某个多维空间中的粒子。粒子的坐标是计算的参数(适应度函数)。每个粒子以随机速度随机启动。对于模拟的每次迭代,您使用其当前行进向量更新每个粒子的位置,然后添加其他向量的组件,例如:到目前为止最佳粒子的方向,到最佳粒子的方向,到本地组的方向最好等...
最初实现GA或PSO似乎相当令人生畏,但我向您保证,编写一个从您尝试优化的实际问题域中抽象出算法(GA / PSO)的小框架很容易。您可以随时回到Wikipedia了解算法的详细信息。
一旦我有了一个框架,我通常会从一个2参数问题开始(可能是你的问题的简化,或者图像上的X和Y位置),这样我就可以轻松地对算法进行可视化和调整,以便我变得更好蜂拥而至的行为。然后我将它扩展到更多维度。
我喜欢这种方法,因为它可以让我轻松地针对实际问题陈述(如汽车和预告片)中具有相当复杂和复杂部分的问题进行优化。
此外,为什么进化技术具有吸引力是因为你可以将固定的时间用于模拟,并在你决定停止时获得最佳答案。
根据我的经验,您倾向于花费尽可能多的时间将参数调整到GA或PSO(一旦实现),就像编写硬编码启发式解决方案一样,但好处是改变查找策略解决方案通常只需要参数更改或者使用其他实现更换非常好的算法,而不是编写完全不同的策略以从头开始解决问题。
如果您需要有关为两种算法中的任何一种设计通用框架的指导,请给我一个大喊。我必须指出,你也有很多好的免费第三方框架。我有时喜欢编写自己的代码,因为我了解算法的各个方面,然后我知道我可以在哪里调整策略。
答案 3 :(得分:1)
一般方法:
由于问题很小,我会建议你添加汽车和拖车的方法,直到你得到一个可行的解决方案,而不是试图最小化汽车和拖车。
解决:
我在带有约束的GAs上取得的成功较少,而且对整数变量约束的GA(即某个位置的预告片数量)的成功甚至更少。可能是约束编程是一种更好的方法,因为您只想为给定数量的汽车和拖车生成可行的解决方案,而不是试图最小化行进距离。
观察:
您正在解决网络上的问题,最后一步可能是重新定位空预告片。
祝你好运!答案 4 :(得分:1)
本地搜索是遗传算法的替代方案。在2007年国际时间表竞赛中,局部搜索算法(例如禁忌搜索和模拟退火)明显优于遗传算法条目(LS的1到4位与第1位的GA中的第5位) 80个竞争者IIRC)。
另外,看一下那里的一些库,例如OptaPlanner(禁忌搜索,模拟退火,后期验收,开源,java),JGap(遗传算法,开源,java), OpenTS(禁忌搜索,......