CPLEX Optimization Studio-没有可行的解决方案-二次约束

时间:2019-02-14 13:31:25

标签: optimization constraints cplex quadratic

我尝试用两辆车实施一个车辆路线问题。

一辆车是运载工具,另一辆是可以从运载工具开始的无人机。

两辆车均从(0/0)点开始。然后,两辆车都移动到无人机应从航母出发的位置,并连续拜访一些目标位置。一开始我只假设两个目标分别位于t1(2/8)和t2(5/8)。到达目标后,无人机应降落在航母上,两辆车都应返回起点(0/0)。

因此,无人机的最佳发射点和降落点应进行最佳选择,以最大程度地减少航母的飞行行程。

我在这里对问题有一个直观的印象:visualization

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 :(得分:0)

我将您的问题移植到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是防止无人机独奏的简便方法。