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