- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
尊敬的 OptaPlanner 专家们!
我想使用 OptaPlanner(或类似的开源 Java 框架)来优化自行车信使服务的路线。假设 5 名信使必须从某个来源提取 30 个信封并将它们运送到某个目的地:
X(FROM) Y(FROM) X(TO) Y(TO)
envelope 1 13745 55419 13883 55756
envelope 2 8406 53246 13937 55854
envelope 3 15738 57396 35996 79499
envelope 4 12045 60418 19349 57118
envelope 5 13750 56416 35733 78403
envelope 6 13190 57068 11860 59749
envelope 7 15021 55768 14098 57379
envelope 8 11513 58543 11501 59683
envelope 9 12013 64155 14120 59301
envelope 10 15006 57578 35511 78426
envelope 11 11450 58819 11916 58338
envelope 12 13728 56304 35524 79013
envelope 13 15104 60923 17937 57066
envelope 14 11373 58388 13983 53804
envelope 15 18575 55186 18718 54381
envelope 16 11639 50071 17363 58375
envelope 17 11273 53410 10860 60441
envelope 18 13766 59041 13963 57769
envelope 19 16138 55801 16183 56024
envelope 20 13728 56146 14301 61694
envelope 21 12848 57059 13586 59734
envelope 22 13645 56488 13955 55859
envelope 23 12896 56838 13937 55908
envelope 24 13341 58150 35709 78924
envelope 25 13483 57303 13614 57820
envelope 26 12741 63478 15230 59838
envelope 27 14676 51691 16501 48361
envelope 28 13748 54933 14120 56110
envelope 29 17875 59565 20453 61903
envelope 30 9772 56424 6404 55601
我的五个信使分布在整个城市(所以我没有一个仓库)而且他们不必回到他们开始的地方:
X Y
messenger A 13750 57578
messenger B 15104 53410
messenger C 13728 55801
messenger D 12741 63478
messenger E 14676 18575
我会使用以下硬约束:
还有这些软约束:
我想我必须调整车辆路线示例,但由于我是新手,我不知道从哪里开始。我如何确保在信使尝试投递信封之前已将其取走?如果你能在这里帮助我,那就太好了......
谢谢!
最佳答案
我不是 OptaPlanner 专家。但我想选择你在括号中提到的内容(或类似的开源框架)。但是,如果 OptaPlanner 已经为您提供了合理的解决方案,您可以忽略这一点。如果没有,或者您只是想比较结果,这对您来说可能会很有趣。
首先,您描述的问题听起来很简单,但却是一个更具挑战性的问题。它基本上是一个具有取货和交付、多个仓库、开放路线和时间窗口/限制的容量 VRP。对于此类问题,您可能找不到很多开源解决方案。
我创建了一个名为 jsprit 的项目. jsprit 可以解决你的问题。它既不类似于 OptaPlanner,也不是框架。它非常关注车辆路径问题,是一个 Java 工具包(即一组库)。我实现了你的问题。 Here你可以找到注释代码。
我稍微更改了您的一个限制条件(“信封行进的方式应小于直接路线的三倍,以便交付不会花费太长时间”)。如果您想确保交付速度相对较快,我相信您最好相对于“最佳”信使进行此限制。因此,我将其替换为(“信封行进的方式应小于具有最佳信使的直接路线的三倍,即直接路线上最快的信使”)。
查看结果(您可以绘制它并获得一份简短的报告)并尝试使用其他约束或算法配置以使其适应您的要求。如果您有任何疑问,请随时与我联系。
jsprit 是绝对意义上的,与 OptaPlanner 相比是一个非常年轻的项目,最终您会发现错误或约束定义并不像它应该的那样舒服。但好处是,您可以通过报告错误、批评和建议替代解决方案等来帮助改进它。:)。
关于java - 带 OptaPlanner 的自行车信使/TSPPD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19080537/
这个问题更多的是关于在正确的方向上找到一个点。我继承并开发了一个项目来创建汽车选择数据库(匹配用户偏好)。它已经运行得比较好,但可能会更好(存在一些问题),所以我想研究其他人使用的其他一些算法。我正在
我有一个单词列表,例如 [bike, motorbike, copyright]。现在我想检查这个词是否由子词组成,这些子词也是独立的词。这意味着我的算法输出应该类似于:[bike, motor, m
我仍在努力思考前端状态。是否有为资源设置商店的通用最佳实践?例如,我的 web api 有: GET /bikes GET /bikes/:id 我开始时只有一个 BikeStore 和 bikes:
我是一名优秀的程序员,十分优秀!