将元组中的集合全部使用

问题描述 投票:0回答:1

我正在尝试执行以下操作。我想获取对应于Pbd.pitblockSet的所有BlockBelow的连续变量Xbdt的总和:

forall(i in Pbd.pitblockSet , d in DumpBlocks, t in TimePeriods ) {
 sum(j in BlockBelow[i] ) Xbdt[j.id][d][t] == 0;
}

似乎我没有正确编写Pbd.pitblockSet。关于如何写这个有什么建议吗?

我遇到一些错误:不能将类型{blockType} [Pbd]与“ in”一起使用无法在{blockType}中将类型用作索引。需要元组类型,请找到{Path}。

其中Pbd是Path类型的元组,并从Excel数据中读取

tuple Path {
int id;
string source;
string dest;
{string} pitblockSet;
{string} roadPoints; 
{string} dumpblockSet;
{string} others;
float dist;
};

{Path} Pbd={}; // set of paths from block b to dump d

DumpBlocks和PitBlocks是从excel读取的,类型为{String}

BlockBelow的计算如下:

tuple blockType {
    key string id;
    int i;
    int j;
    int k;
 };

{blockType} PitBlocksType = ...; //read from excel

//find one block below each block
{blockType} BlockBelow[b1 in PitBlocksType] =
     {b | b in PitBlocksType: b1.i == b.i -1 &&
                        (b1.k  == b.k ) &&
                         (b1.j  == b.j) };

Xbdt是决策变量

dvar float+ Xbdt[PitBlocks][DumpBlocks][TimePeriods];
cplex opl
1个回答
1
投票
如果您希望每个路径都具有此约束,这是编写它的方法

forall (p in Pdb) { forall(i in p.pitblockSet , d in DumpBlocks, t in TimePeriods ) { sum(j in BlockBelow[i] ) Xbdt[j.id][d][t] == 0; } }

© www.soinside.com 2019 - 2024. All rights reserved.