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

在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已被占用,不知如何建立两者的关联。


解决方案

核心是建立工作中心与对应工序的映射关系,避开符号冲突同时解决类型不匹配问题:

  1. 新增映射集合:定义OperationsAtWorkshop替代原L(k),存储每个工作中心对应的工序集合:

    {int} OperationsAtWorkshop[Workshops] = ...;
    

    比如OperationsAtWorkshop["WorkshopA"] = {1,3}就表示WorkshopA负责工序1和3。

  2. 修改约束逻辑:将求和范围限定为当前工作中心对应的工序集合,替换原有的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:03:30