使用Python中的ORTools CP Solver(多背包)进行包裹装运(包裹合并)

2024-06-28 20:49:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用或工具CP Solver实施包合并解决方案(基于护士问题解决方案)。在

有一家工厂生产一些小包装,需要邮寄给客户。 最好将一些mini_包装合并成更大的包装(例如,如果我们遵守总重量限制,我们可以将3个轻型mini_包装合并为一个包装,并支付一次而不是3次的运输费用)。在

Mini_包在数据源中有一些重要的属性(固定目的地、重量、可接受的交货日期范围)。在

我的主0-1整数变量如下所示:

x[mini_package_source_number, destination, optimal_shipment_date, package_number]

如果mini_套餐应在某一天前往某个目的地,则它==1,并合并为某个套餐号码。在

我已经成功构建了大部分模型,除了:

1。主要挑战
如何设置一个约束,以确保当求解器分配了一个最佳包裹编号时,它不能与任何其他目的地或装运日期一起使用?(这意味着它是一个物理上统一的包裹,去到某个地方)

潜在代码:

^{pr2}$

错了,因为分配的包号码可以存在很多次,合并多个迷你包。 它可以存在多次,但必须始终指定给同一个目的地和日期。在

潜在解决方案:

x[1, Place67, 2019-01-01, 8] = 1
x[2, Place124, 2019-01-04, 119] = 1
x[3, Place124, 2019-01-04, 119] = 1

现在还可以,mini_包2和包3合并到包119到同一个目的地(和日期)。在

x[4, Place55, 2019-01-05, 119] = 1

这是错误的,因为mini_套餐4也被合并到119套餐中,之前由solver决定前往另一个目的地(和另一个日期)。在

怎么可能编码?如果有任何解决办法的建议,我将不胜感激。在

2。加法

@Stradivari的感觉(回答如下)是准确的。很有可能我使用了多余的变量。在

3。冲突产品挑战

点2-3移到:
https://or.stackexchange.com/questions/2786/shipments-consolidation-with-or-tools-cp-solver-in-python-multi-knapsack


Tags: or工具numberpackage工厂解决方案cp号码
1条回答
网友
1楼 · 发布于 2024-06-28 20:49:36

为每对[pkg,destination]创建一个boolvar。在

for package_number in range(Packages):
    for destination in destinations:
        model.AddBoolOr(v for k, v in x.items() if k[1] == destination and k[3] == package_number).OnlyEnforceIf(pkg_dest[package_number, destination])
        model.AddBoolAnd(v.Not() for k, v in x.items() if k[1] == destination and k[3] == package_number).OnlyEnforceIf(pkg_dest[package_number, destination].Not())
    model.Add(sum(pkg_dest[package_number, destination] for destination in destinations) == 1)

同样的日期逻辑。在

顺便说一句,我觉得你可能用这个公式创造了很多无用的变量,你真的能决定一个小包装的目的地和/或日期吗?或者只是它的包裹,然后,对于每个包裹,它的目的地和日期?在

相关问题 更多 >