Создание кортежа в пост-процессе выполнения команды OPL - PullRequest
0 голосов
/ 06 ноября 2018

У меня проблема с назначением работника, когда задания имеют три компонента (вспомогательные навыки), чтобы идентифицировать их:

{job} Jobs = { | c1 в Cat1, c2 в Cat2, c3 в Cat3};

Из пула рабочих я сейчас создаю кортежи возможностей для назначения работника на работу, если они соответствуют критериям:

{ableTuple} = Возможные = { | в Jobs, n в Workers};

Двоичный массив onTeam [Возможные варианты] указывает, назначен ли работник n команде.

Моя модель работает нормально, и я получаю ощутимые результаты. Тем не менее, я невозможно распечатать их красиво в пост-обработке "execute" команда. Я хотел бы вывести команду работников для каждой работы с что-то вроде:

for (var j in Jobs)
{
   for (var n in Workers)
   {
     if onTeam[<n,c1,c2,c3>] == 1, output n
   }
}

Именно с этой внутренней логикой у меня возникают трудности. я не могу воссоздать кортеж для индексации набора onTeam.

Кто-нибудь может помочь, пожалуйста?

Большое спасибо, Патрик Хили

1 Ответ

0 голосов
/ 07 ноября 2018

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

{string} Cat1={"A","B"};
{string} Cat2={"C","D"};
{string} Cat3={"E","F"};

tuple job
{
string j1;
string j2;
string j3;
}

{job} Jobs = { < c1, c2, c3 > | c1 in Cat1, c2 in Cat2, c3 in Cat3 };

{string} Workers={"Albert","Bob","Charles"};

tuple possibleTuple
{
string n;

string j1;
string j2;
string j3;
}

{possibleTuple} Possibles = { < n, c1, c2, c3 > | < c1,c2,c3> in Jobs, n in Workers };

dvar boolean onTeam[Possibles];

subject to
{
onTeam[<"Albert","A","C","E">]==1;
onTeam[<"Bob","A","C","E">]==1;
onTeam[<"Charles","A","C","F">]==1;
}

{string} workersPerJob[j in Jobs]=
{w | w in Workers : onTeam[<w,j.j1,j.j2,j.j3>]==1};

execute
{
for(var j in Jobs) if ( workersPerJob[j].size!=0)
{
writeln("for job ",j," workers : ", workersPerJob[j]);
}
}

, что дает

for job  <"A" "C" "E"> workers :  {"Albert" "Bob"}
for job  <"A" "C" "F"> workers :  {"Charles"}
...