optimization - 多次运行求解
问题描述
我需要运行 3 次求解。每次求解都需要来自元组的不同列的不同输入。这就是为什么我需要访问 OPL 中的循环变量作为参数,并且需要在每个循环中更改该参数。请建议如何在 ODM OPL 中执行此操作。(通过在 dat 文件中引入一个 int 并在每个循环中更改其值,我可以在使用物理 .dat 文件运行独立模型时做到这一点,但在通过 ODM 应用程序运行时也是不可能的)。
解决方案
丹尼尔写的很好。如果您不想拥有不必要的 .dat 文件,您可以编写
子模块
tuple T {
int round1;
int round2;
}
T t = <1, 2>;
int param = ...;
dvar float x;
minimize x;
subject to { x >= param; }
然后在另一个将成为主要模型的模型中:
tuple T {
int round1;
int round2;
}
T t = <1, 2>;
main {
thisOplModel.generate();
var src = new IloOplModelSource("sub.mod");
var def=new IloOplModelDefinition(src);
var data = new IloOplDataElements();;
for (var i = 0; i < 2; ++i) {
if (i == 0)
data.param = thisOplModel.t.round1;
else
data.param = thisOplModel.t.round2;
var opl = new IloOplModel(def, cplex);
opl.addDataSource(data);
opl.generate();
cplex.solve();
writeln("Round " + i + ": " + cplex.getObjValue() + ", " + data.param);
opl.end();
}
}
这会给
Round 0: 1, 1
Round 1: 2, 2
和
tuple T {
int round1;
int round2;
}
T t = <1, 2>;
int solutions[0..1];
main {
thisOplModel.generate();
var src = new IloOplModelSource("sub.mod");
var def=new IloOplModelDefinition(src);
var data = new IloOplDataElements();;
for (var i = 0; i < 2; ++i) {
if (i == 0)
data.param = thisOplModel.t.round1;
else
data.param = thisOplModel.t.round2;
var opl = new IloOplModel(def, cplex);
opl.addDataSource(data);
opl.generate();
cplex.solve();
writeln("Round " + i + ": " + cplex.getObjValue() + ", " + data.param);
thisOplModel.solutions[i]=opl.x.solutionValue;
opl.end();
}
writeln(thisOplModel.solutions);
}
解决您关于填充表格的下一个问题
这使
Round 0: 1, 1
Round 1: 2, 2
[1 2]
推荐阅读
- java - 是java多线程可以优化多文件写入吗
- unity3d - Unity3D 2018 OnInspectorGUI getAssetPath 不起作用
- python - 如何确保服务器使用 python - twisted 从客户端接收到完整数据(如果没有 - 重新发送)?
- android-studio - Android [10/Q/API29] 不支持的路径 /storage/emulated/0/
- sql-server - 找出两列之间的差异
- javascript - 如何将 target="_blank" 添加到 document.write 中?
- python - 根据某些条件拆分大型文本文件
- python - 连接丢失时,Kafka 消费者继续挂起等待消息
- android - Firebase AuthUI 在 android 上无法正常工作
- java - BAD 请求 400 消耗 multipart/form-data jersey clientresponse java