CPLE Как установить массив переменных решения динамически - PullRequest
0 голосов
/ 03 ноября 2019

Я хочу сформулировать гибкую задачу планирования работы магазина с помощью MIP вместо CP.

Если есть массив, указывающий количество операций для каждого задания.

num_op = [3, 2, 5]

И Xijk - это переменная решения, указывающая, обрабатывается ли j-я операция задания i на компьютере k или нет.

Мой вопрос заключается в том, что я не знаю, как инициировать массив 3-Dс разным количеством операций для каждого задания.

Я написал это dvar boolean x[i in Jobs][j in][k in Machs];, и я не знаю, как его выполнить.

Пожалуйста, помогите мне. Спасибо !!

1 Ответ

1 голос
/ 04 ноября 2019

Если я правильно понимаю ваш пример, тогда ваше определение num_op означает, что у вас есть три разных задания, первое задание имеет 3 операции, второе - 2, а последнее - 5 операций. Это будет означать, что второе измерение Xijk должно меняться в зависимости от первого измерения. Такой гибкий размер массива невозможен с CPLEX.

Вот альтернативный вариант:

  • Определите M как максимальное количество операций (5 в вашем случае).
  • Определить dvar boolean x[i in Jobs][j in 1..M][k in Machs];
  • Явно зафиксируйте все переменные в 0, которые соответствуют несуществующим операциям: forall (i in Jobs, j in 1..M, k in Machs) if (j > num_op[i]) X[i][j][k] == 0;

Последний шаг даже необязателен: вы можете определитьпеременные для несуществующих операций, но не используйте их где-либо в вашей модели (хотя это может дать предупреждение для неиспользуемых переменных).

Другой вариант - создать кортеж tuple { int i; int j; int k }, а затем создать набор кортежей. который содержит все допустимые комбинации i, j, k и индекса X для этого набора кортежей.

...