使用数组中的索引求和
Using index in an array to make a sum
我被扔进了一个 Cplex 并且完全没有使用它的经验。我可能遗漏了一些明显的信息。
我们正在尝试建立一个关于港口列车处理能力的简单优化模型。每个经过处理的产品都有自己的路径,使用多个铁路段。我正在寻找一种方法来获取我的段数组中的当前索引以求和。
简而言之,我正在寻找 Cplex 中的“.getindex()”的等效项。我环顾四周没有结果。
这里是相关参数的简化版。
int amountSegments=6;
int products=1..2;
int time=15;
int path[products][segments]=[[2,1,4,5],[2,1,3,6,4,5]];
这里是相关约束条件之一
forall(l in products)
forall(i in path)
sum(t in XXXX)
x[i][l][t]==d[l];
如果 x 是 [时间] 包含 [产品] 的每个 [段] 上的货车数量:对于两个产品中的每一个以及该产品路径中的每个段,我在这里尝试做的是想在 i.getindex() .. time-amountSegments+i.getindex().
中对 t 求和
提前谢谢你,我希望这是可以理解的。
编辑:我会尽力解决我的问题。
我们有两个产品,1 和 2。产品一路径由路径 2、1、4、5 组成,产品二由路径 2、1、3、6、4、5 组成。对于该特定约束,对于产品 1,模型需要为细分市场 2、1、4 和 5 生成总和。顺序对于模型的其余部分很重要。
对于第 2 段,我需要 t 从 1 到 12 的总和(路径上的第一个段是 15-4+1)
对于第 1 段,我需要 t 从 2 到 13 的总和(路径上的第二段所以 15-4+2)
对于第 4 段,我需要 t 从 3 到 14 的总和(路径上的第三段所以 15-4+3)
对于第 5 段,我需要 t 从 4 到 15 的总和(路径上的第四段所以 15-4+4)
第二个产品:
对于第 2 段,我需要 t 从 1 到 10 的总和(路径上的第一段所以 15-6+1)
对于第 1 段,我需要 t 从 2 到 11 的总和(路径上的第二段所以 15-6+2)
对于第 3 段,我需要 t 从 2 到 12 的总和(路径上的第三段所以 15-6+3)
对于第 6 段,我需要 t 从 3 到 13 的总和(路径上的第四段所以 15-6+4)
对于第 4 段,我需要 t 从 4 到 14 的总和(路径上的第五段所以 15-6+5)
对于第 5 段,我需要 t 从 2 到 15 的总和(路径上的第六段,所以 15-6+6)
简而言之,对于 [i],我需要模型读取正确产品的路径数组。
对于 [l],我认为这非常简单。
对于 [t] 上的总和,我需要从我在路径数组中的位置(索引+1)到(路径中段的总时间量+路径数组中的位置)
我希望这能更好地解释我的问题!
鉴于每个产品的段数不同,我认为你必须使用元组
dvar boolean x[1..10];
int time=0;
range products=1..2;
{int} paths[products]=[ {2,1,4,5},
{2,1,3,6,4,5} ];
minimize (0);
subject to {
forall(p in products)
sum(t in paths[p]) x[time+t]==0;
}
p
将从 1 到 2。对于 p == 1
,t
将迭代 paths[1]
,即元组 {2, 1, 4, 5}
。你可以在索引x
时将任何常量time
添加到t
...所以你将得到x[2]
,x[1]
,[=21=的总和], x[5]
, 如此处 t == 0
.
诀窍在于数组 paths
中的元组不需要具有相同的大小。虽然在你的问题中矩阵必须是规则的:你不能有一行有 4 个元素,而另一行有 6 个元素。
我被扔进了一个 Cplex 并且完全没有使用它的经验。我可能遗漏了一些明显的信息。
我们正在尝试建立一个关于港口列车处理能力的简单优化模型。每个经过处理的产品都有自己的路径,使用多个铁路段。我正在寻找一种方法来获取我的段数组中的当前索引以求和。
简而言之,我正在寻找 Cplex 中的“.getindex()”的等效项。我环顾四周没有结果。
这里是相关参数的简化版。
int amountSegments=6;
int products=1..2;
int time=15;
int path[products][segments]=[[2,1,4,5],[2,1,3,6,4,5]];
这里是相关约束条件之一
forall(l in products)
forall(i in path)
sum(t in XXXX)
x[i][l][t]==d[l];
如果 x 是 [时间] 包含 [产品] 的每个 [段] 上的货车数量:对于两个产品中的每一个以及该产品路径中的每个段,我在这里尝试做的是想在 i.getindex() .. time-amountSegments+i.getindex().
中对 t 求和提前谢谢你,我希望这是可以理解的。
编辑:我会尽力解决我的问题。 我们有两个产品,1 和 2。产品一路径由路径 2、1、4、5 组成,产品二由路径 2、1、3、6、4、5 组成。对于该特定约束,对于产品 1,模型需要为细分市场 2、1、4 和 5 生成总和。顺序对于模型的其余部分很重要。
对于第 2 段,我需要 t 从 1 到 12 的总和(路径上的第一个段是 15-4+1)
对于第 1 段,我需要 t 从 2 到 13 的总和(路径上的第二段所以 15-4+2)
对于第 4 段,我需要 t 从 3 到 14 的总和(路径上的第三段所以 15-4+3)
对于第 5 段,我需要 t 从 4 到 15 的总和(路径上的第四段所以 15-4+4)
第二个产品: 对于第 2 段,我需要 t 从 1 到 10 的总和(路径上的第一段所以 15-6+1)
对于第 1 段,我需要 t 从 2 到 11 的总和(路径上的第二段所以 15-6+2)
对于第 3 段,我需要 t 从 2 到 12 的总和(路径上的第三段所以 15-6+3)
对于第 6 段,我需要 t 从 3 到 13 的总和(路径上的第四段所以 15-6+4)
对于第 4 段,我需要 t 从 4 到 14 的总和(路径上的第五段所以 15-6+5)
对于第 5 段,我需要 t 从 2 到 15 的总和(路径上的第六段,所以 15-6+6)
简而言之,对于 [i],我需要模型读取正确产品的路径数组。 对于 [l],我认为这非常简单。 对于 [t] 上的总和,我需要从我在路径数组中的位置(索引+1)到(路径中段的总时间量+路径数组中的位置)
我希望这能更好地解释我的问题!
鉴于每个产品的段数不同,我认为你必须使用元组
dvar boolean x[1..10];
int time=0;
range products=1..2;
{int} paths[products]=[ {2,1,4,5},
{2,1,3,6,4,5} ];
minimize (0);
subject to {
forall(p in products)
sum(t in paths[p]) x[time+t]==0;
}
p
将从 1 到 2。对于 p == 1
,t
将迭代 paths[1]
,即元组 {2, 1, 4, 5}
。你可以在索引x
时将任何常量time
添加到t
...所以你将得到x[2]
,x[1]
,[=21=的总和], x[5]
, 如此处 t == 0
.
诀窍在于数组 paths
中的元组不需要具有相同的大小。虽然在你的问题中矩阵必须是规则的:你不能有一行有 4 个元素,而另一行有 6 个元素。