Как использовать индекс как индекс (подмножество) и Как рассчитать значение индекса, используя внутренние данные в cplex - PullRequest
0 голосов
/ 13 января 2019

Я использую CPLEX для решения проблемы с отправкой грузовиков MILP, и обнаружил две проблемы, которые не могу решить.

Сначала я пытаюсь использовать переменную с несколькими индексами как

 int p=...;     //plant index
 int r=...;     //request index
 int k=...;     //truck index
 int t=...;     //concrete type index

 range plant        =   1..p;
 range request      =   1..r;
 range truck        =   1..k;

 int m=...;
 int j=...;

 range deliveries   =   1..m; //total number of delivery each customer
 range jobs         =   1..j; //total jobs in a day each truck

dvar boolean    x[plant][request][deliveries][truck][jobs]

но индексные поставки (m) и задания (j) являются подмножеством запроса (r) и грузовика (k) соответственно. Максимальное количество доставок «m» зависело от спроса на запрос, а максимальное количество заданий зависело от времени в пути. Затем он изменился согласно запросу и грузовику.

Во-вторых, значения «m» и «j» получают путем вычисления:

m [r] = сводка (max {Q [r] [t]} / мин {C [k]})

j [k] = сводка (длина рабочего дня / минимальная длина задачи для каждого грузовика [k])

для моего "m" моего текущего кода, который я пытался использовать, но он не работает, потому что не может применить индекс (первый вопрос):

 float maxQ = maxl(demand[r][t]);
 float minC = minl(capacity[k]);

 int m = ftoi(ceil(maxQ/minC));

 range deliveries   =   1..m;

но для расчета "минимальной длины задачи для каждого грузовика", полученного из ограничений времени в пути, рассчитанных после запуска модели, следует ли вводить значение "j" в качестве константы, а затем обновлять его при запуске модели? или это можно сделать другим способом? Заранее спасибо.

PS. извините за мой плохой английский.

1 Ответ

0 голосов
/ 14 января 2019

вы можете использовать наборы кортежей вместо полных евклидовых произведений.

См. IDE и OPL> Язык программирования оптимизации (OPL)> Руководство пользователя по языку> Введение в OPL> Советы по моделированию> Разреженность

в документации CPLEX

https://www.ibm.com/support/knowledgecenter/SSSA5P_12.8.0/ilog.odms.ide.help/OPL_Studio/opllanguser/topics/opl_languser_modelingtips_sparsity_first.html

По второму вопросу приведу небольшой пример:

range R=1..3;
range T=1..2;
range K=1..4;

float demand[r in R][t in T]=1+r*t;
float capacity[k in K]=k;


float maxQ = max(r in R,t in T)(demand[r][t]);
float minC = min(k in K)(1/capacity[k]);

 int m = ftoi(ceil(maxQ/minC));

 range deliveries   =   1..m;

 execute
 {
 writeln(deliveries); 
 }

что дает

1..28
...