首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CPLEX优化工作室-无可行方案-二次约束

CPLEX优化工作室-无可行方案-二次约束
EN

Stack Overflow用户
提问于 2019-02-14 21:31:25
回答 1查看 79关注 0票数 1

我尝试实现一个有两辆车的车辆路径问题。

一辆车是载体,另一辆是可以从载体出发的无人机。

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

因此,无人机在航母上发射和着陆的地点要进行最佳选择,以最小化航母的巡航。

我对这个问题有一个直观的了解:visualization

我的代码看起来像这样:

代码语言:javascript
运行
复制
//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的最大飞行时间。

当我调试程序时,我得不到可行的解决方案,我也不知道为什么。

我非常感谢每一个提示!提前感谢!

斯文

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-14 23:45:10

我将您的问题移植到MiniZinc,并添加了一些距离和时间的域限制:

代码语言:javascript
运行
复制
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);

这会导致以下情况:

代码语言:javascript
运行
复制
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是防止无人机独奏的一种简单方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54691625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档