Excel 工作表中的可变数据范围
Variable Range of Data in Excel Sheets
我将 CPLEX model 实现为 .mod,它使用 .dat 文件中的数据。
.dat 文件中的三个示例集如下所示:
Set1 from SheetRead(Data1, "Sheet1!A2:A5");
Set2 from SheetRead(Data2, "Sheet1!A2:A3");
Set3 from SheetRead(Data3, "Sheet1!A2:A250");
现在我正在使用相同的 model 调查不同的数据。这意味着在一种情况下 Set1 有 4 个数据条目,因此来自 A2:A5,但在另一种情况下,它可能包含来自 A2:A100 的数据。有没有可能让我不必每次都手动输入 excel 范围?
我试图设置一个非常高的上限,以便在每种情况下都包含所有数据,但随后 CPLEX 在集合中包含一个零,以防实际范围较小。
非常感谢!
最好的问候
加法:
我尝试使用 opl运行 -D 选项,但它还没有真正解决问题,但我无法找出原因,因为没有错误消息或其他内容。
假设在名为 RCPLEX.mod 的 .mod 文件中写入了以下内容:
tuple TEST{
key int i;
key int j;
}
{TEST} A=...;
float p[A]=...;
...它遵循使用集合 A 和参数 p 的优化。
A是R中多次运算的结果,是一个data.frame。 p代表这个data.frameA.
的第二列
所以我做的是:
Result <- system("oplrun -DA=A -Dp=A[,2] RCPLEX.mod")
这给出了值 5。但这不是 CPLEX 的正确结果。mod。它也确实随着输入而改变。我认为它不会 运行 CPLEX .mod 因为它也只需要 1 秒的时间。 CPLEX .mod 通常需要 10 分钟。我做错什么了吗?也许在数据上应用 -D 选项。frames/sets?
你可以这样在主(流量控制)
参见 How to SheetRead in Cplex with variable column length?
但是,如果您像在
中那样从 R 调用 oplrun
那么我推荐 oplrun -D 选项
oplrun -D 可以帮助您向 oplrun 发送正确的 SheetRead 字符串
PS:
这里是 oplrun -D 的例子
取https://github.com/AlexFleischerParis/zooopl/blob/master/zoodat.mod
int nbKids=...;
float costBus40=...;
float costBus30=...;
dvar int+ nbBus40;
dvar int+ nbBus30;
minimize
costBus40*nbBus40 +nbBus30*costBus30;
subject to
{
40*nbBus40+nbBus30*30>=nbKids;
}
execute DISPLAY_After_SOLVE
{
writeln("The minimum cost is ",cplex.getObjValue());
writeln("We will use ",nbBus40," 40 seats buses and ",nbBus30," 30 seats buses ");
}
那么如果你在命令行中这样做
oplrun -DnbKids=300 -DcostBus30=400 -DcostBus40=500 zoodat.mod
你会得到
OBJECTIVE: 3800
The minimum cost is 3800
We will use 6 40 seats buses and 2 30 seats buses
我将 CPLEX model 实现为 .mod,它使用 .dat 文件中的数据。 .dat 文件中的三个示例集如下所示:
Set1 from SheetRead(Data1, "Sheet1!A2:A5");
Set2 from SheetRead(Data2, "Sheet1!A2:A3");
Set3 from SheetRead(Data3, "Sheet1!A2:A250");
现在我正在使用相同的 model 调查不同的数据。这意味着在一种情况下 Set1 有 4 个数据条目,因此来自 A2:A5,但在另一种情况下,它可能包含来自 A2:A100 的数据。有没有可能让我不必每次都手动输入 excel 范围? 我试图设置一个非常高的上限,以便在每种情况下都包含所有数据,但随后 CPLEX 在集合中包含一个零,以防实际范围较小。
非常感谢! 最好的问候
加法: 我尝试使用 opl运行 -D 选项,但它还没有真正解决问题,但我无法找出原因,因为没有错误消息或其他内容。
假设在名为 RCPLEX.mod 的 .mod 文件中写入了以下内容:
tuple TEST{
key int i;
key int j;
}
{TEST} A=...;
float p[A]=...;
...它遵循使用集合 A 和参数 p 的优化。
A是R中多次运算的结果,是一个data.frame。 p代表这个data.frameA.
的第二列所以我做的是:
Result <- system("oplrun -DA=A -Dp=A[,2] RCPLEX.mod")
这给出了值 5。但这不是 CPLEX 的正确结果。mod。它也确实随着输入而改变。我认为它不会 运行 CPLEX .mod 因为它也只需要 1 秒的时间。 CPLEX .mod 通常需要 10 分钟。我做错什么了吗?也许在数据上应用 -D 选项。frames/sets?
你可以这样在主(流量控制) 参见 How to SheetRead in Cplex with variable column length?
但是,如果您像在
那么我推荐 oplrun -D 选项
oplrun -D 可以帮助您向 oplrun 发送正确的 SheetRead 字符串
PS:
这里是 oplrun -D 的例子
取https://github.com/AlexFleischerParis/zooopl/blob/master/zoodat.mod
int nbKids=...;
float costBus40=...;
float costBus30=...;
dvar int+ nbBus40;
dvar int+ nbBus30;
minimize
costBus40*nbBus40 +nbBus30*costBus30;
subject to
{
40*nbBus40+nbBus30*30>=nbKids;
}
execute DISPLAY_After_SOLVE
{
writeln("The minimum cost is ",cplex.getObjValue());
writeln("We will use ",nbBus40," 40 seats buses and ",nbBus30," 30 seats buses ");
}
那么如果你在命令行中这样做
oplrun -DnbKids=300 -DcostBus30=400 -DcostBus40=500 zoodat.mod
你会得到
OBJECTIVE: 3800
The minimum cost is 3800
We will use 6 40 seats buses and 2 30 seats buses