Я пытаюсь сделать что-то вроде ниже. Я хочу получить сумму непрерывной переменной Xbdt для всех BlockBelow, соответствующих Pbd.pitblockSet:
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];
------------ - ДОБАВЛЕНО ПОСЛЕ ОТВЕТА -----------------------
Спасибо за ответ, Даниил, я попробовал следующее:
forall (p in Pbd) {
forall(i in p.pitblockSet , d in DumpBlocks, t in TimePeriods ) {
sum(j in BlockBelow[i] ) Xbdt[j.id][d][t] == 0;
}
}
Я получаю ошибку Невозможно использовать строку типа для
Затем я попытался:
forall (p in Pbd) {
forall(i in PitBlocksInPathD[p] , d in DumpBlocks, t in TimePeriods ) {
sum(j in BlockBelow[i] ) Xbdt[j.id][d][t] == 0;
}
}
Что, похоже, сработало. Я создал PitBlocksInPathD, как показано ниже:
{blockType} PitBlocksInPathD[p in Pbd] = union(b in p.pitblockSet) {b2 | b2 in PitBlocksType : b2.id == b};