我正在尝试解决一个AMPL模型,它使用minos运行,使用cplex和积分变量。
我解决的大多数问题(我认为)。从这里用“比例技巧”帮助自己:http://lpsolve.sourceforge.net/5.5/ratio.htm,但现在我得到“QP Hessian不是半正定的。”来自我的一个约束的错误。
我知道错误意味着什么,但我不确定为什么会出现这种限制:/
#S
set SOURCE;
#D
set HALFPROD;
#K
set HALFPRODU;
#P
set PROD;
param surmax {SOURCE} >= 0;
param prodmin {PROD} >= 0;
param prodprofit {PROD} >= 0;
param convSDmax >= 0;
param convDKmax >= 0;
param convSD {SOURCE, HALFPROD} >= 0;
param convDK {HALFPROD, HALFPRODU} >= 0;
param convDP {HALFPROD, PROD} >= 0;
param convKP {HALFPRODU, PROD} >= 0;
var xs {SOURCE} >= 0, integer;
var xu {HALFPROD} >= 0, integer;
var xpd {PROD, HALFPROD} >= 0, integer;
var xpk {PROD, HALFPRODU} >= 0, integer;
var isKUsed binary;
var quantityD {j in HALFPROD} = sum {i in SOURCE} convSD[i,j] * xs[i];
var costSur = sum {i in SOURCE} xs[i]*12;
var quantityK {k in HALFPRODU} = (sum {j in HALFPROD} xu[j] * convDK[j,k]) * isKUsed;
var costK = isKUsed * 13000;
var quantityProdD {l in PROD} = sum {j in HALFPROD} xpd[l,j] * convDP[j,l];
var quantityProdK {l in PROD} = sum {k in HALFPRODU} xpk[l,k] * convKP[k,l];
var quantityProd {l in PROD} = quantityProdD[l] + quantityProdK[l];
var profitProd = sum {l in PROD} prodprofit[l] * quantityProd[l];
var balance = profitProd - costSur - costUwod;
subject to OgrSurMax {i in SOURCE}: xs[i] <= surmax[i];
subject to OgrconvSDMax: (sum {i in SOURCE} xs[i]) <= convSDmax;
subject to OgrconvDKMax: (sum {j in HALFPROD} xu[j]) <= convDKmax;
subject to OgrProdMin {l in PROD}: quantityProd[l] >= prodmin[l];
subject to OgrHALFPRODXPD {j in HALFPROD}: (sum {l in PROD} xpd[l,j]) + xu[j] - quantityD[j] <= 0;
#------------------TRAITOR!
subject to OgrHALFPRODXPK {k in HALFPRODU}: (sum {l in PROD} xpk[l,k]) - quantityK[k] <= 0;
#--------------------------
maximize balanceMax: balance;
这是我的模特。
“conv”代表转换:
此模型中的主要参与者是xpd和xpk - 他们说明转换HALFPROD或HALFPRODU需要多少PROD。由于多次转换,我必须跟踪D的量 - 用于D-> K和D-> P的D的数量必须小于或等于来自S-> D的D'。这是有效的,但由于某种原因,相同(甚至更容易)的约束不起作用:/
关于可能存在什么问题或如何解决问题的任何线索?
更新
根据Erwin Kalvelagens的回答,我试图将其线性化。除了bigM方法之外,找不到一种简单的线性化方法。 我把我的数量D部分改为:
param quantityKMAX = 490860;
var quantityK {k in HALFPRODU} >= 0;
s.t. ogrK1 {k in HALFPRODU}: quantityK[k] <= quantityKMAX * isKUsed;
s.t. ogrK2 {k in HALFPRODU}: quantityK[k] <= (sum {j in HALFPROD} xu[j] * convDK[j,k]);
s.t. ogrK3 {k in HALFPRODU}: quantityK[k] <= (sum {j in HALFPROD} xu[j] * convDK[j,k]) - quantityKMAX * (1 - isKUsed);
quantityKMAX 是从转换中获得的最大数量(将最大可能的D数转换为“最给定的”K时),但我实际上尝试过具有大量数字,这是肯定的大于 quantityK 的任何可能值。
作品!
答案 0 :(得分:1)
Cplex只能处理某些类型的二次约束(一般情况下 - 除了一些例外情况 - 事物必须保持凸起)。在您对变量quantityK
的定义中,您引入了Cplex无法处理的二次表达式。
一种简单的方法就是两次解决问题:一次使用isKUsed=0
,一次使用isKUsed=1
。然后选择最佳解决方案。
否则你可以线性化事物。二进制变量乘以连续(或整数)非负变量并不是很难线性化。