我在这里的第一篇文章 - 希望您能帮助我设计我已经考虑了一段时间的算法 - 不确定要采用哪种方法(VRPTW或资源计划或其他其他方法!?

将其列入一个真实的词例子,我们在少数位置(通常小于5)有很多花园浪费。废物必须在给定时间范围内运输到其他位置。要移动花园垃圾,我们有拖车,必须由汽车拖走。花园垃圾只能在某些时间(时间窗)放在废物仓库上。在某些地点,我们可以放下拖车以被人们填充或清空,但是在其他位置,汽车的驾驶员必须自己做,汽车必须留在那里。所有时间都可以计算(即加载 /卸载时间,运输时间等)。汽车可以在没有拖车的情况下在站点之间移动,可以将拖车拖曳,但拖车不能在位置之间移动。

我们的目标是确保所有拖车的废物都在运输时运输

  • 最小化使用的拖车和汽车数量
  • 满足所有时间丢失废物的窗户
  • “平衡”预告片 - 即一天结束时,我们在每个位置都有尽可能多的预告片

我认为将其作为一种资源调度算法,但我不确定如何处理拖车的“平衡”。

我认为的另一种方法是首先考虑汽车。然后,我可以选择最早的任务,并在此之后构建所有可行任务的图。如果然后我选择了最长的路径,以服务最大数量的拖车负载。然后,我可以从任务列表中删除这些任务,然后重复直到服务所有任务。然后,我需要在这些拖车负载列表中运行以确定所需的拖车数量。

任何关于接近的想法都将不胜感激!

有帮助吗?

解决方案

我同意Jiri ...您想要一种启发式算法,该算法可以快速使用可接受的解决方案,然后从那里进行完善。

在此之前,我已经在公司工作过,他们采用的方法是使用遗传算法来解决非常相似的问题,尽管规模更大,但问题。服用 看这里 如果您不熟悉这种方法。从该站点:

  1. start]生成n染色体的随机群体(适合该问题的解决方案)
  2. 适应性]评估种群中每个染色体X的适应性F(x)
  3. 新人群]通过重复以下步骤来创建新的人群,直到新人口完成

    选择]根据人口的健康选择两个父染色体(健康状况更好,选择更大的机会)

    跨界]跨父母的交叉概率交叉形成一个新的后代(孩子)。如果没有进行跨界,后代是父母的确切副本。

    突变]具有突变概率可突变在每个基因座(染色体中的位置)的新后代。

    接受]将新后代放在新的人群中

  4. 替换]使用新生成的总体进行进一步的算法运行
  5. 测试]如果满足最终条件,请停止并返回当前人口中的最佳解决方案
  6. 循环]转到步骤2

这样做的诀窍是将您的约束编码为“染色体”并编写“健身”功能。健身函数必须采取潜在解决方案的结果的输入,并吐出一分数,即如果违反任何约束,则可以将解决方案的良好或抛弃。

正如Jiri所提到的那样,该解决方案的优点是它具有可行的,尽管不是最好的,但答案很快,您让它运行的时间越长,解决方案就越好。

其他提示

我们在这里肯定会在这里谈论NP完整的算法,除了一些汽车和拖车之外,这不是您从所有可能的解决方案中获得最佳解决方案的任务,然后能够丢弃它并再次避免您建议的最长道路。如果您以这种方式设计算法,那么有一天,您很可能会添加更多的汽车和拖车,并且永远无法完成计算解决方案。

您可能想处理可以合理地快速生成足够好的问题解决方案的算法。确保创建解决方案质量的度量标准,您可以获得一个很好的方法来估算理想解决方案的度量值,然后将自己设置为您希望解决方案来自理想解决方案的百分比采用第一个在范围内具有度量的解决方案。这具有额外的好处,即如果该算法花费太长计算并中止它,那么您仍然可以使用具有最低计算度量的解决方案,即使它不在您的预期范围内。

我不确定哪种方法可以解决问题本身。我建议在搜索后阅读几篇文章 ACM门户. 。我认为UPS和FedEx可能会遇到类似的问题,如果将它们添加为Google中的搜索中的关键字,您可能会获得一些有用的结果。

我倾向于同意罗伯特。对我来说,这听起来像是他描述的遗传算法实现的进化优化技术的绝佳候选者。

在粒子群优化(PSO)的某些问题上,我也取得了非常出色的成功。基本上,您可以将每个基因组视为在某些多维空间中的粒子。粒子的坐标是您计算的参数(健身函数)。每个粒子以随机速度随机启动。对于模拟的每次迭代,您可以使用其当前的旅行向量更新每个粒子的位置,然后添加其他向量的组件,例如:到目前为止最佳粒子的方向,到目前最好的等...

起初实现GA或PSO似乎很艰巨,但是我向您保证,很容易编写一个小框架,该框架从您试图优化的实际问题域中抽象算法(GA/PSO)。有关算法的详细信息,您总是可以回到Wikipedia。

一旦有了一个框架,我通常会从2个参数问题开始(可能简化了您的问题,或图像上的X和Y位置),这样我就可以轻松地可视化和调整算法,从而使我获得良好的蜂群行为。然后,我将其扩展到更大的尺寸。

我喜欢这种方法,因为它使我可以轻松地针对实际问题陈述具有相当复杂且复杂的问题(例如汽车和拖车)进行优化。

另外,为什么进化技术很有吸引力,因为您可以将固定时间的时间用于模拟,并在决定停止时取得最佳答案。

根据我的经验,您倾向于花费尽可能多的时间来调整参数到GA或PSO(一旦实现实现),就像编写硬编码的启发式解决方案一样,但是好处是更改通常找到解决方案的策略需要参数更改或与其他实现交换非常定义的算法,而不是编码完全不同的策略来从头开始解决问题。

如果您需要为两种算法中的任何一种设计通用框架设计的指导,请给我大喊大叫。我必须指出,您也获得了几个好的免费第三方框架。有时我喜欢编码自己的编码,因为我了解算法的各个方面,而且我知道可以在哪里调整策略。

一般的做法:

由于问题很小,我建议您添加汽车和拖车的方法,直到获得可行的解决方案,而不是试图最大程度地减少汽车和拖车。

解决:

我的汽油成功率较小,在整数变量上的限制(例如位置的拖车数量)上的气体成功率较小,甚至较少的成功。可能是约束编程是一种更好的方法,因为您只想为给定数量的汽车和拖车生成可行的解决方案,而不是试图最大程度地减少行驶的距离。

观察:

您正在在网络上解决该问题,其中最后一个动作可能是重新安置空的拖车。

祝你好运 !

本地搜索 是遗传算法的替代方法。在里面 国际时间表竞赛2007, ,本地搜索算法(例如禁忌搜索和模拟退火)清楚地击败了遗传算法条目(LS在LS中排名第1,而GA在轨道1中排名第五,在80个竞争对手IIRC中,大约有80位)。

另外,看看那里的一些图书馆,例如 Optaplanner (禁忌搜索,模拟退火,迟到,开源,Java),JGAP(遗传算法,开源,Java),Opents(Tabu Search,...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top