【问题标题】:AMPL Cplex error: QP Hessian is not positive semi-definiteAMPL Cplex 错误:QP Hessian 不是半正定的
【发布时间】:2017-11-04 13:37:34
【问题描述】:

我目前正在尝试求解一个 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”代表转换:

  • 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。这可行,但由于某种原因,相同(甚至更容易)的约束不起作用:/

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


更新:

根据 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 的任何可能值。

有效!

【问题讨论】:

    标签: optimization cplex ampl


    【解决方案1】:

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

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

    否则你可以线性化。二进制变量乘以连续(或整数)非负变量并不是很难线性化。

    【讨论】:

    • 非常感谢!众所周知,我的问题看起来像是一项任务——它是一个。我必须说,你的答案是人们应该希望的最好的堆栈溢出答案——不要太多,但足够了。两次解决问题确实很容易,但我认为我需要尝试将其线性化。 Imma 尝试一下,然后返回给你结果 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 2020-12-30
    • 2019-01-11
    • 1970-01-01
    相关资源
    最近更新 更多