【问题标题】:Model building in a for loop in C++ (with Cplex Concert Technology)在 C++ 中的 for 循环中构建模型(使用 Cplex Concert 技术)
【发布时间】:2017-03-15 08:42:25
【问题描述】:

我正在尝试在 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);但是,这也会引发同样的错误。我也尝试过将IloEnvenv.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();
}

这是我在调试时收到的错误消息(如果有帮助的话)[如果我不调试,它只是中止]:

Unhandled exception at at 0x00007FFA8B667788 in DebugTemplate.exe: Microsoft C++ exception: IloEmptyHandleException at memory location 0x00000003886FF510.

提前致谢。

【问题讨论】:

    标签: c++ for-loop environment-variables cplex


    【解决方案1】:

    您的程序存在几个问题。对于初学者,您需要使用 IloEnv 初始化 cplex 变量:

    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 定义不同的右侧(我已将其硬编码为上面的“

    最后,在调试时,最好在调用solve 之前添加对exportModel 的调用(以LP 格式写出模型):

    cplex.exportModel("test.lp");
    

    我还建议查看 CPLEX 中包含的示例(例如 ilolpex1.cpp 等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多