Использование forall для набора в кортеже - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь сделать что-то вроде ниже. Я хочу получить сумму непрерывной переменной 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};

1 Ответ

1 голос
/ 30 марта 2020

Ошибка Pdb.pitblockSet. Согласно вашему определению, Pdb - это набор кортежей, поэтому он не имеет свойства pitblockSet. Вам нужен конкретный кортеж, чтобы иметь возможность ссылаться на свойство pitblockSet.

Если вам нужно это ограничение для каждого пути, это способ написать его

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;
  }
}
...