CPLEX C ++二次目标函数

时间:2014-10-15 13:51:05

标签: visual-c++ mathematical-optimization cplex

我刚开始使用cplex和它的c ++ API,当我尝试做一个简单的二次规划时,我遇到了这种不寻常的遭遇。

IloEnv   env;
IloNumVarArray x(env, 3, 0, IloInfinity, ILOINT);
IloModel model(env);
IloExpr obj(env);

obj= x[0]*x[1] ;

model.add(IloMaximize(env, obj - 120*x[2] ));

model.add(x[0] <= 200);
model.add(x[1] >= 4500);
model.add(x[1] <= 5500);
model.add(x[2] >= 100);
model.add(x[2] <= 300);

Cplex解决并向我提供以下解决方案:x [0] = 200,x [1] = 5500&amp; x [2] = 100.这对我来说似乎是完全合理的。但是,当我对如何配制iloexpr执行以下更改时,上述代码不起作用:

obj= x[0]*x[1] - 120*x[2];
model.add(IloMaximize(env, obj ));

解决它,我得到x [0] = 0,x [1] = 4500,x [2] = 300.实际上,目标值= 36000对我来说没有意义。

有谁知道我的配方有什么问题?谢谢!

1 个答案:

答案 0 :(得分:1)

你的最大化目标不是凹的。实际上它既不是凹面也不是凸面。 Cplex仅支持最大化凹函数或线性函数。 Cplex不会验证您的目标函数是否在其范围内。它留下了作为建模者的责任,部分原因是它几乎在计算上难以验证,因为它实际上是计算最佳解决方案。