我正在嘗試使用 MATLAB(使用 quadprog 函式)和 CPLEX 解決以下二次問題。問題是 MATLAB 和 CPLEX 提供了可行的解決方案,但兩種解決方案都不匹配。事實上,CPLEX 聲稱獲得的解決方案是最優的,而使用 MATLAB 獲得的解決方案在目標方面更好。
Minimize obj= 0.5*(1100*x^2 509*y^2 33*z^2 1060*x*y 252*y*z 260*z*x)- 60*x- 36*y - 11*z
Subject to:
-x-y z <= 10
-x y-z <= 10
-x y z <= 10
x-y-z <= 10
x-y z <= 10
x y-z <= 10
x y z <= 10
-x-y-z <= 10
x,y and z are real numbers.
In matlab, I got: obj=-3, x=0.0436, y=-0.2670, z=1.1830
In CPLEX, I got: obj=-2.07, x=0.028, y=0.000, z=0.222
我不明白為什么。
我嘗試使用 MATLAB 和 CPLEX 解決問題,但解決方案不匹配。
uj5u.com熱心網友回復:
您嘗試過哪個 cplex 版本?
我寫
dvar float x;
dvar float y;
dvar float z;
minimize 0.5*(1100*x^2 509*y^2 33*z^2 1060*x*y 252*y*z 260*z*x)- 60*x- 36*y - 11*z;
subject to
{
-x-y z <= 10;
-x y-z <= 10;
-x y z <= 10;
x-y-z <= 10;
x-y z <= 10;
x y-z <= 10;
x y z <= 10;
-x-y-z <= 10;
}
在 OPL CPLEX 中并得到 obj -3
x = 0.043662;
y = -0.26761;
z = 1.1831;
并且使用 docplex python 我也得到了同樣的結果
from docplex.mp.model import Model
mdl = Model(name='quad')
x=mdl.continuous_var(name='x',lb=-10,ub=10)
y=mdl.continuous_var(name='y',lb=-10,ub=10)
z=mdl.continuous_var(name='z',lb=-10,ub=10)
mdl.minimize(0.5*(1100*x*x 509*y*y 33*z*z 1060*x*y 252*y*z 260*z*x)- 60*x- 36*y - 11*z)
mdl.add(-x-y z <= 10)
mdl.add(-x y-z <= 10)
mdl.add(-x y z <= 10)
mdl.add(x-y-z <= 10)
mdl.add(x-y z <= 10)
mdl.add(x y-z <= 10)
mdl.add(x y z <= 10)
mdl.add(-x-y-z <= 10)
mdl.solve(log_output=True,)
decisionVars=[x,y,z]
for v in decisionVars:
print(v.name," = ",v.solution_value)
print(mdl.objective_value)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/451146.html
下一篇:克羅內克產品引數
