You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python Z3求解物流调度SAT问题时遇到困惑,请求建模指导

使用Python Z3求解物流调度SAT问题时遇到困惑,请求建模指导

问题描述

有5辆卡车(包含2辆冷藏车)需要向布里斯班的一家杂货店运送总计131件商品,最多使用20个托盘。具体商品明细如下:

  • 21串香蕉,每串2kg
  • 20串番茄,每串1.8kg
  • 25袋坚果,每袋1.2kg
  • 30袋糖果,每袋1kg
  • 35包牛奶,每包0.2kg

所有解决方案必须满足以下约束条件:

  • 每个托盘最多装8件商品,重量上限为10kg
  • 糖果和坚果不能放在同一个托盘上
  • 每辆卡车最多装30件商品,重量上限为40kg
  • 牛奶必须由冷藏车运输
  • 香蕉价值高,每辆卡车最多装5串香蕉

我的困惑与当前尝试

我很难找到这个问题的可行求解器,现在特别困惑:应该把每件商品单独映射为对象来建模,还是只聚焦于托盘和卡车的整体分配逻辑?我是Z3和可满足性问题的纯新手。

以下是我目前写的代码片段:

from z3 import *

total_quantity = 131
max_trucks = 5
max_pallets = 20

items = {
    "bananas": (21, 2),
    "tomatoes": (20, 1.8),
    "nuts": (25, 1.2),
    "candies": (30, 1),
    "milk": (35, 0.2)
}

p = Function('p', IntSort(), IntSort(), BoolSort()) #confirms if item is in pallet
fridge = Function('fridge', IntSort(), BoolSort()) #confirms if its a fridge truck

s = Solver()

# Set Fridge Trucks
constraint_data = [fridge(i) for i in range(max_trucks)]
s.add(Sum(constraint_data) == 2)

# Set Maximum number of pallets as 20
constraint_data = Or([p(item,pallet) for item in range(total_quantity) for pallet in range(max_pallets)])
s.add(Sum(constraint_data) <= max_pallets)

# Constraint1 - Set Pallet Capacity
for pallet in range(max_pallets):
    quantity_constraint_data = [p(item, pallet) for item in range(total_quantity)]
    weight_constraint_data = []

备注:内容来源于stack exchange,提问作者Kiran CJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:20:29