У меня есть задание, в котором я должен планировать переговоры на основе предпочтений участников во временных блоках, которые могут быть запланированы в 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);
введите описание изображения здесь