Cplex Optimization Studio: застрял в «Извлечение конфигурации» - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть задание, в котором я должен планировать переговоры на основе предпочтений участников во временных блоках, которые могут быть запланированы в 3 параллельных каналах. Цель состоит в том, чтобы получить как можно больше удовлетворения (участников, посещающих предпочтительные переговоры). Это занимает некоторое время, так как 3 параллельных пути вызывают симметрию (пути взаимозаменяемы без потери удовлетворения). Когда я пытаюсь нарушить симметрию, устанавливая ограничение на то, что путь 1 должен содержать наименьший индексированный разговор, путь 2 наименьший и путь 3 наивысший индексированный разговор, мой профилировщик показывает мне, что я не могу завершить фазу «извлечения - конфигурирования». Он работает, когда ввод небольшой, но при вызове кажется, что он застревает здесь. Я добавил принт-экран того, как он выглядит, когда работает дольше, он остается таким. Когда я удаляю ограничение, все снова работает (из-за симметрии требуется всего несколько лет). Кто-нибудь имел эту проблему раньше или знает, как ее решить? Я использую Cplex Optimization studio Версия: 12.10.0.0.

Заранее спасибо,

Идо

Мой код:

.mod

// ************* DATA

 int TotParallel=...; //Amount of possible parallel talks
 range Parallel=1..TotParallel;


{int} Talks=...; // Set of talks with int index
{int} Parts=...; // Set of particpants with int index
{int} Times=...; // Set of timeblocks with int index

int PREF[Parts][Talks]=...; // Preference of a part for certain talk

// for writing to excel
string writeConnectionEnroll="A1:D";
string writeConnectionSchedule="F1:I";


execute
{

writeConnectionEnroll+=Parts.size*Talks.size*Times.size;
writeConnectionSchedule+=Talks.size*Times.size*Parallel.size;
}



//************* Decision Variables

dvar boolean Enroll[Parts][Talks][Times]; // Enroll dv of participant for talk at timeslot
dvar boolean Schedule[Talks][Times][Parallel]; // Schedulling dv for talk at timeslot at parallel pathway


//************* Objective

maximize sum(p in Parts, x in Talks, t in Times) PREF[p][x]*Enroll[p][x][t];


// ************* Constraints
subject to{

    forall( p in Parts){
       sum(x in Talks)PREF[p][x] >= sum(t in Times, x in Talks)Enroll[p][x][t]; }
    // Participants only enroll in requested talks

    forall(p in Parts, x in Talks, t in Times){
       Enroll[p][x][t] <= sum(n in Parallel) Schedule[x][t][n];
      }
      // Participants can only be enrolled in scheduled sessions

    forall(x in Talks){
      sum(t in Times, n in Parallel) Schedule[x][t][n] ==1;
    }
    // Every talk scheduled at least once

    forall(x in Talks){
      forall(t in Times){
      sum(n in Parallel) Schedule[x][t][n] <=1;
    }
    // Every talk can be scheduled in at most 1 timeslot
       forall(t in Times, n in Parallel){
      sum(x in Talks) Schedule[x][t][n] <= 1;
    }
    // At most 1 talk per timeslot. 

    forall(p in Parts, t in Times){
      sum(x in Talks) Enroll[p][x][t] <= 1;
    }// Every participant can only be enrolled at max 1 talk at a time



     forall(t in Times){
     forall(p,q,r in Talks){
       forall(n in Parallel){
         ((Schedule[p][t][1]==1) && (Schedule[q][t][2]==1) && (Schedule[r][t][3] == 1)) => (p<q<r);
       }}}

    // Constraint to break symmetry: when 3 talks are scheduled in parallel, the talk with lowest index
    // is placed in pathway 1, second talk in pathway 2 and highest in pathway 3. When only 2 pathways are used nothing happens.
    /*
    forall(t in Times){
      forall(p,q,r in Talks:p<q<r){
        forall(m,n,o in Parallel){
          if((Schedule[p][t][m]==1) && (Schedule[q][t][n]==1) && (Schedule[r][t][o] == 1))  (m==1 && n==2 && o==3);
        }}}*/
    // Alternative constraint. Also doesn't work
    }}

     tuple xTuple{
       int a;
       int b;
       int c;
       int value;
     }

     {xTuple} EnrollT = {<p,x,t,Enroll[p][x][t]> | p in Parts, x in Talks, t in Times};
     {xTuple} ScheduleT = {<x,t,n,Schedule[x][t][n]> | x in Talks, t in Times, n in Parallel};

     // Tuple used to write to excel

.dat:

TotParallel=3;
Times= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
SheetConnection my_sheet("1sand0s.xlsx"); 
// Reading from Excel. It contains preferences of 100 participants for 70 talks. A 1 is given if the participant prefers certain talk, 0 otherwise.
Talks from SheetRead(my_sheet,"B1:BS1");// Komt overeen met deel dat 'Talks' heet in excel
Parts from SheetRead(my_sheet,"A2:A101");// Komt overeen met deel dat 'Parts' heet in excel
PREF from SheetRead(my_sheet,"B2:BS101");//  


SheetConnection sheet("Solutions2.xlsx");
EnrollT to SheetWrite(sheet,writeConnectionEnroll);
ScheduleT to SheetWrite(sheet,writeConnectionSchedule);

введите описание изображения здесь

...