首页 > 解决方案 > 一个文件夹中的不同文件作为 opl 模型的多个数据

问题描述

我在 IBM ILOG CPLEX 优化工作室中有一个 opl 模型。每次在此模型中导入两个 CSV 文件。有 272 个文件,所以这个模型应该运行 136 次。每次导出一个 CSV 输出作为结果。我需要一个解决方案来每次自动读取这两个文件中的每一个,获取结果并导入接下来的两个文件,直到所有文件都被读取。我添加了一些文件的图片,以便您查看它们的命名方式。我怎样才能自动做到这一点。另外,我的问题的第二部分是:例如,我的文件名之一是: pmed1_DP=10_P=5_n=100 ,我需要获取 DP、P 和 n 作为我的代码的输入。有什么方法可以使用文件名并获得我们所需的输入?文件名

标签: filedirectorycplexopl

解决方案


对于您的第一个问题,您可以使用 main 设置不同的输出 csv 文件。让我给你一个小例子:

测试模块

tuple t
{
  string firstname;
  int number;
}

{t} s={<"Nicolas",2>,<"Alexander",3>};

string csvOutput=...;

execute
{
 var f=new IloOplOutputFile(csvOutput);
 for(var i in s)
 {
  f.writeln(i.firstname,";",i.number,";");
 }
f.close();
}

然后是 main.mod

{string} csvOutputs={"csv1.csv","csv2.csv"};

    main {
      var source = new IloOplModelSource("test.mod");
      var cplex = new IloCplex();
      var def = new IloOplModelDefinition(source);



      for(var o in thisOplModel.csvOutputs)
      {
      var opl = new IloOplModel(def,cplex);

      var data2= new IloOplDataElements();
      data2.csvOutput=o;
      opl.addDataSource(data2);
      opl.generate();

      if (cplex.solve()) {  
         opl.postProcess();
         writeln("OBJ = " + cplex.getObjValue());
      } else {
         writeln("No solution");
      }
     opl.end();
    }  

    }

这将生成 2 个 csv 文件,csv1 和 csv2。

对于您的第二个问题,您可以通过这样的 main 发送参数,也可以多次调用 oplrun 并使用参数更改-D参数:

oplrun -DcsvOutput="csv3.csv" test.mod

这将生成csv3.csv.


推荐阅读