#cplex #traveling-salesman #opl
#cplex #коммивояжер #opl
Вопрос:
Я пытаюсь закодировать модель Nourinejad et al 2005 «Перемещение транспортных средств и перебалансировка персонала в системах одностороннего каршеринга».
В моей модели нет ошибок, но я получаю только упрощенное решение. Я не понимаю, почему.
int n = 4;
range user = 1..n;
int vehicle_relocation_time[user][user]=...;
int staff_rebalance_time[user][user]=...;
tuple User{
int origin;
int destination;
int departure_time;
int arrival_time;
}
{User} Users = ...;
int c_reloc = 40;
int c_rebal = 40;
dvar boolean x1[user][user];
dvar boolean x2[user][user][user][user];
minimize
sum(i,j in Users) vehicle_relocation_time[i.destination][j.origin]*x1[i.destination,j.origin]*c_reloc
sum(i,j,p,q in Users)staff_rebalance_time[j.origin][p.destination]*c_rebal;
subject to {
forall (j in Users)ctConstraint2:
sum (i in Users) x1[i.destination,j.origin] == 1;
forall(i in user)
x1[i,i] == 0;
forall (j in Users)ctConstraint:
sum(i in Users: i != j) x1[i.destination,j.origin] - sum(i in Users: i != j) x1[j.destination,i.origin] == 0;
forall (i,j in Users : i != j amp;amp; i.destination != j.origin)ctConstraint4:
x1[i.destination,j.origin] * (j.departure_time - vehicle_relocation_time[i.destination][j.origin] - i.arrival_time) >= 0 ;
forall (i,j,p,q in Users: i != j amp;amp; p!=q)ctConstraint5:
x2[i.destination,j.origin,p.destination,q.origin] * (p.arrival_time-i.arrival_time
- vehicle_relocation_time[i.destination][j.origin] - staff_rebalance_time[j.origin][p.destination]) >= 0;
forall (p,q in Users: p!=q)ctConstraint6:
sum(i,j in Users: i != j) x2[i.destination,j.origin,p.destination,q.origin] == sum(r,s in Users: r != s) x2[p.destination,q.origin,r.destination,s.origin];
forall(i,j in Users: i != j)ctConstraint7:
x1[i.destination,j.origin]*vehicle_relocation_time[i.destination][j.origin] <= sum(p,q in Users: p!=q) x2[i.destination,j.origin,p.destination,q.origin];
forall(i,j in Users: i != j) ctConstraint8:
sum(p,q in Users: p!=q) x2[i.destination,j.origin,p.destination,q.origin] <= x1[i.destination,j.origin];
forall(p,q in Users: p!=q) ctConstraint9:
sum(i,j in Users: i != j) x2[i.destination,j.origin,p.destination,q.origin] <= x1[p.destination,q.origin];
}
Комментарии:
1. В каком смысле решение, которое вы получаете, «расслаблено»? Публикация журналов решателя также может помочь.
Ответ №1:
Если под «смягченным» решением вы подразумеваете, что учитываются не все ограничения, это может быть связано с тем, что ваша модель на самом деле неосуществима, и некоторые ограничения были автоматически смягчены, чтобы в любом случае предоставить решение.
Это поведение по умолчанию при решении моделей в IDE или использовании oplrun
.