Я внедряю модель IP в Cplex OPL, и для начала я сформулировал модель очень неэффективно.Было около 120 000 переменных решения x_ij
, из которых действительными являются только около 2000.(Это проблема назначения рабочих мест работникам, имеющим около 200 работников, 500 рабочих мест, и каждый работник имеет право на максимум 5 рабочих мест. Поскольку для запуска и решения программы потребовались часы, я попытался создать более эффективную модель с использованием кортежейследуя этому руководству: https://www.ibm.com/developerworks/community/forums/atom/download/attachment_14941147_Efficient_OPL_Modeling.PDF?nodeId=f3b70168-871b-4d8f-b457-4641a488bdf4
Я создал следующие три кортежа:
tuple Worker{
key string WorkerID;
float Wage;
}
tuple Job{
key string JobID;
int RelImportance;
}
tuple Assignment{
string WorkerID;
string JobID;
float Utility;
}
{Worker} Workers = ...;
{Job} Jobs = ...;
{Assignment} Assignments = ...;
Переменная решения объявлена следующим образом:
dvar boolean x[Assignments];
Теперь яЯ столкнулся с проблемой при попытке выразить следующее: я хочу создать переменную y для каждой пары «работник-работа», которая подсчитывает количество работников с более низкой заработной платой, которым было назначено это задание в решении.
У меня естьпопытался добиться этого следующим образом:
dexpr int y[<i,j,u> in Assignments] = sum(k in Workers : k.Wage < Workers.find(<i>).Wage) x[<k.UserID,j,u>];
Таким образом, для каждой пары работник-работа (i, j) я пытаюсь суммировать переменную решения по всем работникам, которые имеют более низкую заработную плату, чем работник I. Ноэтот метод дает ошибки.
Так что моя проблема в том, что я не знаю, как получить доступ к элементам из одного набора кортежей (работников) с помощью суммирования по другому набору кортежей(Задания).