Optimization AMPL Cplex错误:QP Hessian不是半正定的

Optimization AMPL Cplex错误:QP Hessian不是半正定的,optimization,cplex,ampl,Optimization,Cplex,Ampl,我目前正在尝试解决一个AMPL模型,它使用minos为我运行,带有cplex和积分变量 我想我解决的大部分问题。从这里开始我用了一个比率技巧:,但现在我得到了QP Hessian不是半正定的。来自我的一个约束的错误 我有点了解错误的含义,但我不确定为什么会显示此约束:/ #S set SOURCE; #D set HALFPROD; #K set HALFPRODU; #P set PROD; param surmax {SOURCE} >= 0; param prodmin {PROD

我目前正在尝试解决一个AMPL模型,它使用minos为我运行,带有cplex和积分变量

我想我解决的大部分问题。从这里开始我用了一个比率技巧:,但现在我得到了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代表转换:

S->D和D->K是我从转换S中得到多少D的比率? D->P和K->P是表示D或K是否可以转换为P的二元矩阵 这个模型中的主要参与者是xpd和xpk——他们说从转换HALFPROD或HALFPRODU中获得了多少PROD。由于多次转换,我必须跟踪D的数量-用于D->K和D->P的D数量必须小于或等于s->D中的D数量。这是可行的,但出于某种原因,相同的更简单的约束不起作用:/

关于什么可能是问题或如何解决问题的任何线索

更新:

根据欧文·卡韦拉根的回答,我试图将其线性化。除了bigM方法,找不到一种简单的线性化方法。 我已将quantityD部分更改为:

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的任何可能值都大


工作

Cplex通常只能处理某些类的二次约束——除了一些例外——事物必须保持凸。在变量quantityK的定义中,引入了Cplex无法处理的二次表达式

一种简单的方法是只解决问题两次:一次使用isKUsed=0,一次使用isKUsed=1。然后选择最好的解决方案


否则你可以把事情线性化。二元变量乘以连续或整数非负变量并不难线性化

非常感谢!这不是秘密,我的问题看起来像是一项任务——这是一项任务。我必须说,你的答案是最好的堆栈溢出的答案,一个人应该希望-不太多,但足够。两次解决这个问题确实很容易,但我想我需要试着把它线性化。伊玛尝试一下&带着结果返回给你;