我试图在C ++中使用cplex(IloCplex
)来构建和解决几个模型。我在纸上随机构建了这三个模型,但我无法在for循环中构造它们。
Minimize 2x1 + 5x2
S.t. 3x1 + 2x2<=5
x1,x2 >= 0
Minimize x1 + 3x2
S.t. 2x1 + 5x2 >= 3
x1,x2>=0
Minimize 4x1+2x2
s.t. x1 – x2 <= 0
x1,x2>=0
这是我尝试做的简短而简单的摘录。
我正在调试,错误发生在cplex.extract(model);
我也尝试过(代替那条线)IloCplex cplex(model)
;然而,这也是同样的错误。我也尝试将IloEnv
和env.end()
放入和转出for循环,并且没有任何变化。
#include <iostream>
#include <sstream>
#include <vector>
#include <fstream>
#include <string>
#include <ilcplex/ilocplex.h>
ILOSTLBEGIN
using namespace std;
int main()
{
int a[3] = {3,2,1};
int b[3] = {2,5,-1};
int c1[3] = {2,1,4};
int c2[3] = {5,3,2};
cout << "Hi" <<endl;
//a = {3,2,1};
//b = [2,5,-1];
//c1 = [2,1,4];
//c2 = [5,3,2];
IloEnv env;
IloCplex cplex;
for(int r=0;r<3;r++){
cout << "Good" << endl;
IloModel model(env);
IloNumVarArray x(env);
x.add(IloNumVar(env));
x.add(IloNumVar(env));
model.add(a[r]*x[0]+b[r]*x[1]);
model.add(IloMinimize(env, c1[r]*x[0]+c2[r]*x[1]));
cplex.extract(model);
cplex.solve();
cout << "Min= " << cplex.getObjValue() << endl;
cplex.clear();
model.end();
}
env.end();
}
这是我在调试时得到的错误消息(如果有任何帮助的话)[如果我没有调试,它就会中止]:< / p>
Unhandled exception at at 0x00007FFA8B667788 in DebugTemplate.exe: Microsoft C++ exception: IloEmptyHandleException at memory location 0x00000003886FF510.
提前致谢。
答案 0 :(得分:0)
您的计划存在一些问题。对于初学者,您需要使用cplex
初始化IloEnv
变量:
IloCplex cplex(env);
另外,用这一行:
model.add(a[r]*x[0]+b[r]*x[1]);
您需要为约束定义IloRangeArray
并将其添加到(您也缺少右侧)。例如:
IloRangeArray c(env);
c.add(a[r]*x[0]+b[r]*x[1] <= 1);
model.add(c);
我会留下它作为练习,让你弄清楚如何根据r
定义不同的右侧(我已将其硬编码为“&lt; = 1”)。 / p>
最后,在调试时,在调用exportModel
之前添加对solve
的调用总是一个好主意(以LP格式写出模型):
cplex.exportModel("test.lp");
我还建议查看CPLEX中包含的示例(例如,ilolpex1.cpp等)。