Доступ к элементам кортежа на основе другого элемента кортежа в Cplex OPL - PullRequest
0 голосов
/ 03 марта 2019

Я внедряю модель 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. Ноэтот метод дает ошибки.

Так что моя проблема в том, что я не знаю, как получить доступ к элементам из одного набора кортежей (работников) с помощью суммирования по другому набору кортежей(Задания).

...