设施选址问题包括一组潜在的设施位置和一组需要由设施提供服务的消费点。目标是选择潜在设施地点的子集,尽量减少从消费者到其指定设施的距离之和,并尽量减少建立选定设施的总成本。
你可以在下面的图片中看到一个示例设施选址问题。蓝色圆圈代表消费者,灰色大头针代表潜在的设施位置。
为了更好地理解这个问题,让我们用一个具体的用例来说明它。想象一下,你正在建立一个咖啡烘焙店网络,目标是在全国范围内提供咖啡。咖啡屋是消费者,咖啡屋是设施。
一家烘焙店的生产能力只能覆盖一定数量的咖啡店,所以你必须建立一定数量的烘焙店。你已经得到了一个地方的名单,你可以购买和经营一个烘焙。这些是你可以安置设施的潜在地点。每个地方都有一个不同的价格,你需要支付在那里开一个烘焙厂。价格代表设施建设成本。
挑战在于如何选择一系列可以购买的地方,如何通过选择更便宜的地方来尽量减少总的购买成本,同时尽量减少烘焙店和他们提供的咖啡馆之间的距离总和。
快速上手
工程项目结构
图2. Quickstart 项目结构
服务器端代码位于 src/main/java 目录中,被组织成四个包。
bootstrap 引导程序
生成一个随机的(但是可重复的)数据集,并在应用程序启动时用它填充存储库。
领域
包含 OptaPlanner 使用的域模型。@planningsolution、@planningentity 和 ConstraintProvider 在域包中。
持久性
负责持久化设施位置问题数据集。
restful
包含客户端代码用于启动和停止解决方案以及检索最佳解决方案的 restapi。
客户机代码位于 src/main/resources/META-INF/resources/目录中。它有一个包含基本 HTML 结构的 index. HTML 文件,并加载 app.js 文件,该文件调用服务器的 REST API,使网页动态。
规划领域模型
图3. 规划领域图
约束
约束是使用 Constraint Streams API 实现的。您可以在 org.acme.facilitylocation.domain 中找到它们。类。它定义了以下限制:
设施容量
如果总需求超过设施的能力,则处罚分配给设施的消费者的需求的严格限制。
软约束,惩罚安装成本使用的设施位置。
远程办公设备
消费者与其指定设施之间的距离的软约束。
请注意,有两个软约束彼此“竞争”,因为它们影响相同的分数水平。您可以通过调整 org.acme.facilitylocation.domain 中的约束权重来控制每个约束如何影响分数。简化位置/约束/配置。你对一个约束施加的重量越多,当它被破坏时,它对分数的影响就越大,而且 OptaPlanner 试图避免它的次数也就越多。
@ConstraintConfiguration
public class FacilityLocationConstraintConfiguration {
...
@ConstraintWeight(FACILITY_SETUP_COST)
HardSoftLongScore facilitySetupCost = HardSoftLongScore.ofSoft(2);
@ConstraintWeight(DISTANCE_FROM_FACILITY)
HardSoftLongScore distanceFromFacility = HardSoftLongScore.ofSoft(5);
}
使用约束权重在最小化消费者到设施的距离和最小化总安装成本之间找到一个平衡。如果你过分强调距离限制,最终可能会使用不必要的昂贵设施。如果你过于看重安装成本限制,那么从设施到消费者的服务车辆可能会花费太多的时间旅行。
平衡解决方案
图4. 平衡的解决方案
这个快速启动应用程序的屏幕截图显示了一个平衡的解决方案。注意在设施和总距离上花费的总设置成本,并将这些值与其他解决方案进行比较,其中您只对其中一个软约束施加了极大的权重。
优先考虑最小的安装成本
图5. 解决方案集中在最小的安装成本
我们选择了最便宜的设施位置,它们被利用到100% 的能力,所以我们使用最少数量的设施,可以服务所有的消费者。
距离也是最小的,但距离约束的权重是可以忽略的相比,安装成本约束,所以它不影响选择设施位置。您可以通过将设置成本作为中等约束,而将距离约束留在较低的、柔软的级别上来实现相同的结果。
最小距离优先
https://www.optaplanner.org/blog/2020/10/09/facilityLocationProblemPriorityDistance.png
图6. 最小距离的解决方案
消费者被分配到最近的设施,只有很少的关注设施成本和利用效率。如果你仔细观察,你会发现有些地方距离可以缩短得更多。这只是一个确定距离约束权重的问题。
快速启动
上手实践启动一个项目:
Git clone https://github.com/kiegroup/optaplanner-quickstarts.
Https://github.com/kiegroup/optaplanner-quickstarts.
Descend into the directory quarkus-facility-location.
下载到目录 quarkus-facility-location。
运行 mvn quarkus: dev。
在你的浏览器中打开 网址 http://localhost:8080,点击 Solve 按钮。