Индексирующий массив "Assign" с типом dexpr int не поддерживается этим алгоритмом - PullRequest
0 голосов
/ 12 апреля 2019

Мой вопрос похож на уже заданный , но ответа не было (по крайней мере, один из них не принят и не подходит).

Я пытаюсь наложить ограничение, которое яУпрощено ниже:

dexpr int startingWeekChanges[p in People] = 7 * y + 1; 

...

for(p in People){
    Assign[startingWeekChanges[p]] == 1;
}

Но я вижу, что это недопустимо (сообщение об ошибке «Назначить индексный массив» с типом dexpr int не поддерживаетсяэтот алгоритм ").

Я не могу перейти к программированию с ограничениями.Есть ли альтернативная стратегия для этого?

Ответы [ 3 ]

3 голосов
/ 14 апреля 2019

Я думаю, что-то подобное может помочь:

forall (i in IndexSetForAssign)
   Assign[i] == (sum (p in People) (startingWeekChanges[p] == i) >= 1);

Устанавливает Assign[i] в 1, если хотя бы один startingWeekChanges[p] имеет значение i.Если нет, тогда для Assign[i] устанавливается значение 0.

Вышеприведенные выражения используют тот факт, что вы можете использовать значение истинности (1, если истинно, 0 в противном случае) ограничения для моделирования.

1 голос
/ 13 апреля 2019

В https://www.ibm.com/developerworks/community/forums/html/topic?id=7bb1e7ff-ec3a-4e79-a8c4-c20050dfad0c&ps=25 Я ответил на тот же вопрос и привел пример.

range r = 1..5;

float value[r]=[2,3,4.5,1,0];
dvar int i in 1..5;
dexpr int j=6-i;

maximize sum(k in r) value[k]*(k==j);
subject to
{

}

execute
{
writeln("i=",i);
}
0 голосов
/ 13 апреля 2019

Кажется, вы хотите определить выражение как значение массива, проиндексированного переменной. Это называется ограничение элемента [1] и доступно только в контексте ограниченного программирования, так как решатель линейного программирования не может справиться с такими ограничениями.

[1] https://www.ibm.com/support/knowledgecenter/SSSA5P_12.9.0/ilog.odms.ide.help/OPL_Studio/opllangref/topics/opl_langref_constraints_types_inCP.html#usropllangref.uss_langref_constraints.1073721__section1319017294580

...