CPLEX Optimization Studio - нереальное решение - квадратичные ограничения - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь реализовать проблему маршрутизации транспортных средств с двумя транспортными средствами.

Один автомобиль - перевозчик, другой - дрон, который может стартовать с носителя.

Оба транспортных средства стартуют в точке (0/0).Затем оба транспортных средства движутся к точке, где беспилотник должен начать с авианосца, чтобы последовательно посетить некоторые целевые местоположения.В начале я предполагаю только две цели, расположенные в t1 (2/8) и t2 (5/8).После посещения целей дрон должен приземлиться на авианосец, и оба транспортного средства должны вернуться к начальной точке (0/0).

Таким образом, точки, где дрон запускается и приземляется на авианосце, должны быть оптимально выбраны, чтобы минимизировать обход авианосца.

У меня есть визуализация проблемы здесь: визуализация

enter image description here

Мой код выглядит следующим образом:

//Data

int start[1..2]=[0,0]; //start

int R=10; //max drone flight time
int a=2;  //speed of drone

int z1A1[1..2]=[2,8]; //target1
int z2A1[1..2]=[7,8]; //target2

float intraDist1=sqrt(((z2A1[1]-z1A1[1])^2)+(z2A1[2]-z1A1[2])^2); //distance between targets
float intraFlugDist1;

float wegFlugDist1;
float hinFlugDist1; 

float kombiniertZeit0;
float kombiniertZeit1;
float getrenntZeit1;

//Dvar

dvar int+ sA1[1..2];
dvar int+ lA1[1..2];

//Model

minimize kombiniertZeit0+getrenntZeit1+kombiniertZeit1;

subject to{

E1:
kombiniertZeit0>=0;
(((sA1[1]-start[1])^2)+(sA1[2]-start[2])^2)<=kombiniertZeit0^2;

E2:
getrenntZeit1>=0;
(((lA1[1]-sA1[1])^2)+(lA1[2]-sA1[2])^2)<=getrenntZeit1^2;

E3:
kombiniertZeit1>=0;
(((start[1]-lA1[1])^2)+(start[2]-lA1[2])^2)<=kombiniertZeit1^2;

E4:
wegFlugDist1>=0;
(((z1A1[1]-sA1[1])^2)+(z1A1[2]-sA1[2])^2)<=wegFlugDist1^2;

E5:
hinFlugDist1>=0;
(((lA1[1]-z2A1[1])^2)+(lA1[2]-z2A1[2])^2)<=hinFlugDist1^2;

E6:
intraDist1<=intraFlugDist1;

E7:
(wegFlugDist1+intraFlugDist1+hinFlugDist1)/a<=getrenntZeit1;

E8:
R>=getrenntZeit1;

}

E1 гарантирует, что kombiniertZeit0 будет по меньшей мере таким же, как расстояниеот старта до точки запуска дрона.

E2 гарантирует, что getrenntZeit1, по крайней мере, будет таким же, как расстояние от точки запуска до точки приземления дрона.

E3 гарантирует, чтоkombiniertZeit1 по меньшей мере так же велико, как расстояние от наземной точки беспилотника до старта.

E4 гарантирует, что wegFlugDist1 по меньшей мере равно расстоянию от точки запуска беспилотника до первой цели.

E5 гарантирует, что hinFlugDist1 будет по крайней мере таким же большим, как расстояние от последней цели до точки приземления дрона.

E7 гарантирует, что getrenntZeit1 будет по крайней мересумма hinFlugDist1, intraFlugDist1 и wegFlugDist1, деленная на скорость дрона a.

E8 гарантирует, что getrenntZeit1 не больше максимального времени полета дрона R.

КогдаЯ отлаживаю программу, но не могу найти решение, и не могу понять, почему.

Я очень благодарен за каждую подсказку!Заранее спасибо!

Свен

1 Ответ

0 голосов
/ 14 февраля 2019

Я перенес вашу проблему в MiniZinc и добавил некоторые ограничения домена для расстояний и времени:

array[1..2] of int: start = [0,0]; % start location

int: R=10; % max drone flight time
int: vDrone=2;    % speed of drone
int: vCarrier=1;  %  speed of carrier
float: minDist = 0.0;
float: maxDist = 100.0;
float: minTime = 0.0;
float: maxTime = 20.0;

array[1..2] of int: z1A1=[2,8]; %  target1
array[1..2] of int: z2A1=[7,8]; %  target2

function var float: sqr(float: x) = x * x;
function var float: sqr(var float: x) = x * x;
function var int:   sqr(var int: x) = x * x;

float: intraDist1=sqrt((z2A1[1]-z1A1[1])*(z2A1[1]-z1A1[1]) + 
                       (z2A1[2]-z1A1[2])*(z2A1[2]-z1A1[2])); % distance between targets
var minDist .. maxDist: intraFlugDist1;

var minDist .. maxDist: wegFlugDist1;
var minDist .. maxDist: hinFlugDist1; 

var minTime .. maxTime: kombiniertZeit0;
var minTime .. maxTime: kombiniertZeit1;
var minTime .. maxTime: getrenntZeit1;

array[1..2] of var 0..100: sA1;
array[1..2] of var 0..100: sA2;


solve minimize kombiniertZeit0 + getrenntZeit1 + kombiniertZeit1;

% E1:
constraint ((sqr(sA1[1]-start[1])+sqr(sA1[2]-start[2])) <= sqr(kombiniertZeit0)*vCarrier);

% E2:
constraint ((sqr(sA1[1]-sA2[1]) + sqr(sA1[2]-sA2[2])) <= sqr(getrenntZeit1)*vCarrier);

% E3:
constraint ((sqr(start[1]-sA2[1]) + sqr(start[2]-sA2[2])) <= sqr(kombiniertZeit1)*vCarrier);

% E4:
constraint ((sqr(z1A1[1]-sA1[1]) + sqr(z1A1[2]-sA1[2])) <= sqr(wegFlugDist1)*vDrone);

% E5:
constraint ((sqr(sA2[1]-z2A1[1]) + sqr(sA2[2]-z2A1[2])) <= sqr(hinFlugDist1)*vDrone);

% E6:
constraint (intraDist1 <= intraFlugDist1);

% E7:
constraint ((wegFlugDist1 + intraFlugDist1 + hinFlugDist1) <= getrenntZeit1*vDrone);

% E8:
constraint (R >= getrenntZeit1);

Это приводит к следующему:

intraFlugDist1 = 5.0;
wegFlugDist1 = 5.8309518948453;
hinFlugDist1 = 7.51664818918645;
kombiniertZeit0 = 0.0;
kombiniertZeit1 = 0.0;
getrenntZeit1 = 9.173800042015881;
sA1 = array1d(1..2, [0, 0]);
sA2 = array1d(1..2, [0, 0]);

Это означает, что перевозчик остается встартовая позиция и дрон путешествует в одиночку.Ограничения должны быть изменены для обеспечения менее тривиального поведения.R = 6 - это простой способ предотвратить беспилотный соло.

...