在CPLEX中建模产能约束的技术实现问题
产能约束(Capacity constraint)
以下是我尝试编码实现的约束:
已知:
- L为所有工序l的集合
- K为所有工作中心k的集合
- L(k)为在工作中心k上加工的工序l的集合
float ProcessingTime[Products][Operations] = ...; float Capacity[Workshops] = ...; dvar int+ Y[Products][0..NbOperations][Periods]; {string} Products = ...; {string} Workshops = ...; int NbOperations = ...; range Operations = 1..NbOperations; int NbPeriods = ...; range Periods = 1..NbPeriods; subject to { forall(t in Periods,k in Workshops) ct5: sum(p in Products,l in Operations) (ProcessingTime[p][l]*Y[p][l][t]) <= Capacity[k]; }
原本求和部分应基于L(k)实现,但我无法完成编码:一方面l为整数类型而k为字符串类型,另一方面符号L已被占用,不知如何建立两者的关联。
解决方案
核心是建立工作中心与对应工序的映射关系,避开符号冲突同时解决类型不匹配问题:
新增映射集合:定义
OperationsAtWorkshop替代原L(k),存储每个工作中心对应的工序集合:{int} OperationsAtWorkshop[Workshops] = ...;比如
OperationsAtWorkshop["WorkshopA"] = {1,3}就表示WorkshopA负责工序1和3。修改约束逻辑:将求和范围限定为当前工作中心对应的工序集合,替换原有的
l in Operations:
float ProcessingTime[Products][Operations] = ...; float Capacity[Workshops] = ...; // 新增:工作中心-工序映射集合 {int} OperationsAtWorkshop[Workshops] = ...; dvar int+ Y[Products][0..NbOperations][Periods]; {string} Products = ...; {string} Workshops = ...; int NbOperations = ...; range Operations = 1..NbOperations; int NbPeriods = ...; range Periods = 1..NbPeriods; subject to { forall(t in Periods,k in Workshops) ct5: sum(p in Products,l in OperationsAtWorkshop[k]) (ProcessingTime[p][l]*Y[p][l][t]) <= Capacity[k]; }
这样修改后,约束会只对每个工作中心负责的工序计算总加工时间,完全符合L(k)的定义,同时解决了类型不匹配和符号冲突的问题。
内容的提问来源于stack exchange,提问作者Lew Xin Yan
相关产品推荐
相关产品推荐

