Optimization CPLEX-优化-按周期最小化生产成本:错误:模型是非凸的 我正在尝试使用CPLEX创建一个优化模型。

Optimization CPLEX-优化-按周期最小化生产成本:错误:模型是非凸的 我正在尝试使用CPLEX创建一个优化模型。,optimization,cplex,docplex,Optimization,Cplex,Docplex,我的问题是: 我有生产产品的需求、生产能力(按天计机器)和生产成本(按天计机器)。 有些机器具有不同的成本和生产能力来生产相同的产品 我试图建立一个优化模型,在生产需求产品的同时最小化生产成本 使用下面的代码,我得到了错误 错误:模型是非凸的 import pandas as pd dmd = { 'TONS_BY_MONTH': {'PRODUCT_A': 27283.781, 'PRODUCT_B': 119.477, 'PRODUCT_C': 4651.003}

我的问题是:

我有生产产品的需求、生产能力(按天计机器)和生产成本(按天计机器)。 有些机器具有不同的成本和生产能力来生产相同的产品

我试图建立一个优化模型,在生产需求产品的同时最小化生产成本

使用下面的代码,我得到了错误 错误:模型是非凸的

import pandas as pd
dmd =  {
        'TONS_BY_MONTH': {'PRODUCT_A': 27283.781, 'PRODUCT_B': 119.477, 'PRODUCT_C': 4651.003}
    }
df_demanda = pd.DataFrame(dmd)
df_demanda

custo = {
     'MC05': {'PRODUCT_A': 1368, 'PRODUCT_B': 1368, 'PRODUCT_C': 1368},
     'MC06': {'PRODUCT_A': 1435, 'PRODUCT_B': 1435, 'PRODUCT_C': 1427},
     'MC07': {'PRODUCT_A': 1189, 'PRODUCT_B': 1207, 'PRODUCT_C': 0},
     'MC08': {'PRODUCT_A': 1221, 'PRODUCT_B': 1209, 'PRODUCT_C': 0},
     'MC09': {'PRODUCT_A': 1905, 'PRODUCT_B': 1907, 'PRODUCT_C': 1965}
     } 

df_custo = pd.DataFrame(custo)
df_custo

produtos = ['PRODUCT_A', 'PRODUCT_B', 'PRODUCT_C']
maquinas = ['MC05','MC06','MC07','MC08','MC09']
dias = list(range(1,30))

capacidade = {
    'MC05': {'PRODUCT_A': 371, 'PRODUCT_B': 371, 'PRODUCT_C': 427},
    'MC06': {'PRODUCT_A': 396, 'PRODUCT_B': 396, 'PRODUCT_C': 435},
    'MC07': {'PRODUCT_A': 547, 'PRODUCT_B': 571, 'PRODUCT_C': 0},
    'MC08': {'PRODUCT_A': 476, 'PRODUCT_B': 497, 'PRODUCT_C': 0},
    'MC09': {'PRODUCT_A': 657, 'PRODUCT_B': 692, 'PRODUCT_C': 790}
    }
df_capacidade = pd.DataFrame(capacidade)
df_capacidade

from docplex.mp.model import Model
mdl = Model(name="DEMANDA_BY_DAY")



x  = {(i,j):
      mdl.continuous_var(name="PRODUCAO_{0}_{1}".format(i,j)) for i in produtos for j in maquinas }


DIAS  = {(d):
         mdl.binary_var(name="DIA_{0}".format(d)) for d in dias}

mdl.minimize(mdl.sum([ DIAS[d] * (df_custo.loc[i,j] * x[(i,j)]) for d in dias for i in produtos for j in maquinas]))



for i in produtos:
             mdl.add_constraint( mdl.sum([x[(i,j)] * DIAS[d] for d in DIAS  for j in maquinas ]) == df_demanda.loc[i,'TONS_BY_MONTH'])

for i in produtos:
             mdl.add_constraint(  mdl.sum([x[(i,j)] * DIAS[d]  for d in DIAS for j in maquinas ]) <= mdl.sum([df_capacidade.loc[i,s] for s in maquinas]))
        
        
mdl.solve(log_output=True)
将熊猫作为pd导入
dmd={
“每月吨”:{“产品A”:27283.781,“产品B”:119.477,“产品C”:4651.003}
}
df_demanda=pd.数据帧(dmd)
德乌德曼达酒店
卡斯托={
'MC05':{'PRODUCT_A':1368,'PRODUCT_B':1368,'PRODUCT_C':1368},
'MC06':{'PRODUCT_A':1435,'PRODUCT_B':1435,'PRODUCT_C':1427},
'MC07':{'PRODUCT_A':1189,'PRODUCT_B':1207,'PRODUCT_C':0},
'MC08':{'PRODUCT_A':1221,'PRODUCT_B':1209,'PRODUCT_C':0},
'MC09':{'PRODUCT_A':1905,'PRODUCT_B':1907,'PRODUCT_C':1965}
} 
df_custo=pd.DataFrame(custo)
德福库斯托酒店
produtos=['产品A'、'产品B'、'产品C']
maquinas=['MC05'、'MC06'、'MC07'、'MC08'、'MC09']
dias=列表(范围(1,30))
己二酸={
'MC05':{'PRODUCT_A':371,'PRODUCT_B':371,'PRODUCT_C':427},
'MC06':{'PRODUCT_A':396,'PRODUCT_B':396,'PRODUCT_C':435},
'MC07':{'PRODUCT_A':547,'PRODUCT_B':571,'PRODUCT_C':0},
'MC08':{'PRODUCT_A':476,'PRODUCT_B':497,'PRODUCT_C':0},
'MC09':{'PRODUCT_A':657,'PRODUCT_B':692,'PRODUCT_C':790}
}
df_capacidade=pd.DataFrame(capacidade)
己酸脱氢酶
从docplex.mp.model导入模型
mdl=模型(name=“按天需求”)
x={(i,j):
maquinas}中j的produtos中i的mdl.continuu变量(name=“PRODUCAO_{0}{1}”.format(i,j))
DIAS={(d):
dias}中d的mdl.binary_var(name=“DIA_{0}”.format(d))
mdl.最小化(mdl.总和([DIAS[d]*(df_custo.loc[i,j]*x[(i,j)])为d,为i,为i,为i,为j,为maquinas]))
对于produtos中的我:
mdl.add_约束(mdl.sum([x[(i,j)]*DIAS[d]代表d,maquinas代表j])==df_demanda.loc[i,'TONS_BY_MONTH')
对于produtos中的我:

mdl.add_constraint(mdl.sum([x[(i,j)]*DIAS[d]表示d在DIAS中表示d在maquinas中表示j])您的模型包含具有x_i*y_u+i形式的项和的约束。 这种约束不是凸的,基本上,两个不同变量X*Y的任何二次乘积都是非凸的。 CPLEX尚未解决非凸QCP问题,因此您需要在没有这些产品的情况下重新表述您的问题。我认为有两种可能的方法:

  • 或者用一个额外维度扩展X变量矩阵(顺便说一句,您可能可以使用Model.continuous\u var\u matrix来简化)几天,并且每三个变量(产品、机器、天)有一个变量

  • 还要检查指标约束:指标约束动态链接二元变量和线性约束的值。换句话说,如果在搜索解决方案期间,二元变量变为1(或0),则会强制执行某些线性约束,否则无论其为真还是假都未定义

例如,下面的代码

mdl.add_indicator(dias[0], x[1,2] ==0, active_value=0)
说明如果二进制变量
dias[0]
的最终值为0(
active_值
),则约束
x[1,2]==0
变为真

请注意,这是单向的:二进制变量的值会影响约束的状态,但不会反过来影响


如果您对模型的重新表述有任何疑问,请告诉我。

你好,Philippe,谢谢您的时间。我知道我需要消除两个不同变量的乘积。但我不确定如果没有这一点,我如何才能建立目标和约束。我将使用您的建议发布版本,并在几天内增加一个维度。我将听取任何意见。尝试@philippe couronne的建议,使用额外维度消除两个不同变量的乘积,持续数天:使用下面的代码,我得到不可行性响应,因为模型无法找到需求的匹配值。我做得对吗?x={(I,j,d):mdl.continuous_var(name=“PRODUCAO_{0}{1}{2}).格式(i,j,d))为i在maquinas中为j在dias中为d在maquinas中为i}#目标:最小生产成本x天mdl.最小化(mdl.sum([(df_custo.loc[i,j]*d)*x[(i,j,d)]i在maquinas中为j在maquinas中为d在dias中为i在maquinas中为d]))###约束:产品中i的产品需求:mdl.添加约束(mdl.sum([x[(i,j,d)]在maquinas中为d在dias中为j])==df#demanda.loc[i,'吨/月')##约束2:产品中i的产品成本:在maquinas中为j:在dias中为d)]==df[i,j]*d)mdl.solve(log_output=True)我建议您在讨论实现之前,首先以文本形式提供问题的规范。