【问题标题】:how to solve multiple math model using CPLEX concert in one code file?如何在一个代码文件中使用 CPLEX Concert 解决多个数学模型?
【发布时间】:2021-05-10 00:23:53
【问题描述】:

这可能是一个简单的问题,但我从未做过。我在 C++ 中有两个不同的数学模型代码,并在两个不同的代码文件中使用 CPLEX Concert 解决。基本上,这两个代码是两个子程序,在求解模型后,将所需的结果存储在两个 3 维向量中。这两个向量将用于为主要启发式算法制定初始可行的解决方案。我的问题是如何在一个代码文件中解决这两个模型以获取这两个向量并将它们用于下一步?

我最初的想法是当我定义模型时,它们可以像这样编号: 对于第一个模型:

    //building the model in CPLEX 
    IloEnv env1;

    //Construct Model 
    IloModel mod1(env);

对于第二个模型:

    //bilding the model in CPLEX 
    IloEnv env2;

    //Construct Model 
    IloModel mod2(env);

【问题讨论】:

  • 那么,您是否尝试创建一个包含创建和求解这两个独立模型的单个 C++ 源文件?它是否有效?如果它不起作用,出了什么问题?另请注意,它们不必位于同一源代码文件中,以便能够将它们的结果组合成单个值数组以热启动主模型。
  • 是的,我刚刚尝试过,经过一天的努力,它奏效了

标签: c++ cplex


【解决方案1】:

要在第二个模型中使用第一个模型的解决方案,您可以使用warmstart

让我引用文档:

没有从多维数组开始创建 MIP 的方法 的变量。为了从多维开始创建 MIP 变量数组,您首先必须将所有这些变量复制到一个平面中 大批。以下示例假设一个 m x n 维矩阵,其中 start[i][j] 中 x[i][j] 的起始值。

 IloNumVarArray startVar(env);
 IloNumArray startVal(env);
 for (int i = 0; i < m; ++i)
     for (int j = 0; j < n; ++j) {
         startVar.add(x[i][j]);
         startVal.add(start[i][j]);
     }
 cplex.addMIPStart(startVar, startVal);
 startVal.end();
 startVar.end();

【讨论】:

  • 两种模型的解决方案互不相关。但是这两种解决方案都将在主要算法中用于解决主要启发式算法。
【解决方案2】:

我最初的想法是正确的,并且奏效了。我唯一需要补充的是,由于有两个目标,IloObjective 也需要有不同的名称。

【讨论】:

  • 对很多人来说,一个大问题是“CPLEX”往往在人们的脑海中扮演着重要的角色。请记住,它只是软件——实际上它作为一种工具使用起来比人们预期的要容易得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
相关资源
最近更新 更多