如何编写CPLEX中产品收发货量平衡约束?
CPLEX 产品提货-配送量平衡约束编写方案
首先需要明确:你的变量定义里缺少产品维度,因为要按产品统计总提货和总配送量,所以需要把变量调整为带产品索引的形式:
UI[p][i][v][t]:产品p,车辆v在时段t从提货节点i提取的货物量W[p][i][v][t]:产品p,车辆v在时段t给配送节点i配送的货物量
1. 集合定义(OPL语言)
先在CPLEX OPL中定义所需集合:
// 产品集合 {int} P = {1, 2}; // 提货节点集合 {int} PickupNodes = {1, 2, 3, 4}; // 配送节点集合 {int} DeliveryNodes = {5, 6, 7, 8, 9, 10}; // 时段集合 {int} T = {1, 2, 3}; // 车辆集合 {int} V = {1, 2};
2. 变量定义
dvar float+ UI[P][PickupNodes][V][T]; // 提货量,非负 dvar float+ W[P][DeliveryNodes][V][T]; // 配送量,非负
3. 核心平衡约束
对每个产品p,所有提货节点、车辆、时段的总提货量,等于该产品所有配送节点、车辆、时段的总配送量:
// 产品提货-配送量平衡约束 forall(p in P) { sum(i in PickupNodes, v in V, t in T) UI[p][i][v][t] == sum(i in DeliveryNodes, v in V, t in T) W[p][i][v][t]; }
补充说明
如果你的原始变量确实没有产品维度(比如W和UI是按产品分别定义的不同变量),也可以针对单个产品单独写约束:
// 针对产品1的约束 sum(i in PickupNodes, v in V, t in T) UI_1[i][v][t] == sum(i in DeliveryNodes, v in V, t in T) W_1[i][v][t]; // 针对产品2的约束 sum(i in PickupNodes, v in V, t in T) UI_2[i][v][t] == sum(i in DeliveryNodes, v in V, t in T) W_2[i][v][t];
但更推荐用带产品索引的统一变量形式,便于扩展和维护。
内容的提问来源于stack exchange,提问作者Tiến Nguyễn
相关产品推荐
相关产品推荐

