如何在CPLEX中编写含i、p、m对应关系的索引约束?
约束编写方案
首先明确给定的<i,m,p>绑定关系:
<1,1,1>:提货节点1 ↔ 制造商1、产品1<2,2,1>:提货节点2 ↔ 制造商2、产品1<3,1,2>:提货节点3 ↔ 制造商1、产品2<4,2,2>:提货节点4 ↔ 制造商2、产品2
1. 核心平衡约束(提货量与产量匹配)
这类约束保证每个提货节点的总提货量,等于对应制造商生产对应产品的总产量(假设w代表生产线/生产单元,对所有w求和得到总产量)。
对于每个周期t:
- 节点1的总提货量 = 制造商1生产产品1的总产量:
\sum_{v} U[t][1][v] = \sum_{w} QT[t][1][1][w] - 节点2的总提货量 = 制造商2生产产品1的总产量:
\sum_{v} U[t][2][v] = \sum_{w} QT[t][1][2][w] - 节点3的总提货量 = 制造商1生产产品2的总产量:
\sum_{v} U[t][3][v] = \sum_{w} QT[t][2][1][w] - 节点4的总提货量 = 制造商2生产产品2的总产量:
\sum_{v} U[t][4][v] = \sum_{w} QT[t][2][2][w]
2. 无效组合的零约束(可选但建议添加)
为了严格禁止非指定<i,m,p>组合产生流量,避免模型出现逻辑漏洞,可以添加以下约束:
针对提货变量U
对于所有周期t、车辆v,如果节点i对应的<m,p>组合与当前约束的<m,p>不匹配,则约束该节点对应提货量为0:
\sum_{v} U[t][i][v] = 0 \quad \text{当<i,m,p>不在指定集合中时}
针对产量变量QT
对于所有周期t、生产线w,如果<m,p>对应的提货节点不存在指定绑定关系,则约束该产量为0(不过本次所有<m,p>都有对应节点,此约束可省略,若后续扩展场景可复用):
QT[t][p][m][w] = 0 \quad \text{当<m,p>无对应提货节点时}
建模语言示例(以Python PuLP为例)
如果用PuLP库实现,可先定义绑定关系字典,再批量添加约束:
# 定义<i: (m,p)>的绑定关系 node_mapping = { 1: (1, 1), 2: (2, 1), 3: (1, 2), 4: (2, 2) } # 添加核心平衡约束 for t in periods: for i in nodes: m, p = node_mapping[i] prob += pulp.lpSum(U[t][i][v] for v in vehicles) == pulp.lpSum(QT[t][p][m][w] for w in workstations) # 添加无效组合的零约束 for t in periods: for i in nodes: m_expected, p_expected = node_mapping[i] for m in manufacturers: for p in products: if (m, p) != (m_expected, p_expected): prob += pulp.lpSum(U[t][i][v] for v in vehicles) == 0
内容的提问来源于stack exchange,提问作者Tiến Nguyễn
相关产品推荐
相关产品推荐

