我尝试用两辆车实施一个车辆路线问题。
一辆车是运载工具,另一辆是可以从运载工具开始的无人机。
两辆车均从(0/0)点开始。然后,两辆车都移动到无人机应从航母出发的位置,并连续拜访一些目标位置。一开始我只假设两个目标分别位于t1(2/8)和t2(5/8)。到达目标后,无人机应降落在航母上,两辆车都应返回起点(0/0)。
因此,无人机的最佳发射点和降落点应进行最佳选择,以最大程度地减少航母的飞行行程。
我在这里对问题有一个直观的印象:visualization
我的代码如下:
//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的最大飞行时间。
当我调试程序时,我找不到可行的解决方案,而且我也找不到原因。
我非常感谢每一个提示!预先感谢!
斯文
答案 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
是防止无人机独奏的简便方法。