MATLAB 利用YALMIP+Gurobi 求解线性规划 -多无人机扫描覆盖

使用要点

  1. 创建决策变量
  2. 设置目标函数
  3. 添加约束条件
  4. 参数配置
  5. 求解问题

问题描述

假设M个无人机的任务是尽快覆盖一组由 P 顶点表示的多边形凸区域,假设每架无人机的最大飞行时间是有限的,并且是预先知道的。每架无人机的都配备了一个指向下方的机载摄像头,无人机需要使用它来感知 P 指定的整个区域。具体问题如下:

  1. 最大限度减少覆盖区域 P 所需时间的无人机数量 m <= M
  2. 以最短完成任务时间为目标规划每个 UAV 路径
变量定义

C i j C_{ij} Cij represents the traversing cost of the edge ( i , j ) (i,j) (i,j) between nodes i i i and j j j.

for  i=1:numberOfVertices
	for j=1:numberOfVertices
		if i~=j
			C(i,j)=norm(V(i,:)-V(j,:))/(uavSpeed*1000/60);
		end
	end	
end

X i j k ∈ { 0 , 1 } {X_{ij}^{k}}\in\{0,1\} Xijk{0,1} represents whether or not the k k k-th UAV is going to fly from vertex i i i to vertex j j j.

V i j k ∈ R {V_{ij}^{k}}\in\R VijkR represent the flight speed of the k k k-th UAV while flying from vertex i i i to vertex j j j.

t s ∈ R {t_{s}}\in\R tsR be the individual setup time.

L k {L_k} Lk be the battery duration of UAV number k k k.

m ∈ N {m}\in\N mN be the variable that represents the number of UAVs designed for a mission

M ∈ N {M}\in\N MN be the total number of UAVs available.

O ∈ N {O}\in\N ON be the constant number of UAV operators.

N ∈ N {N}\in\N NN be the number of nodes of the graph.

d k d_{k} dk represents the extra time necessary to launch UAV k k k.

每个无人机的最短时间可表示为:
T k = ∑ i = 1 N ∑ j = 1 N C i j V i j k X i j k + d k T_{k}=\sum_{i=1}^{N} \sum_{j=1}^{N} \frac{C_{i j}}{V_{i j}^{k}} X_{i j}^{k}+d_{k} Tk=i=1Nj=1NVijkCijXijk+dk
线性规划问题定义:
m i n ( V ) min(\mathcal{V}) min(V)
∑ i = 1 N ∑ j = 1 N C i j V i j k X i j k + d k ≤ V , k = 1 , … , M \sum_{i=1}^{N} \sum_{j=1}^{N} \frac{C_{i j}}{V_{i j}^{k}} X_{i j}^{k}+d_{k} \leq \mathcal{V}, k =1, \ldots, M i=1Nj=1NVijkCijXijk+dkV,k=1,,M
t s ⌈ k O ⌉ ∑ j = 1 N X 1 j k = d k , k = 1 , … , M t_{s} {\lceil\frac{k}{O}\rceil \sum_{j=1}^{N} X_{1 j}^{k}=d_{k}, k=1, \ldots, M } tsOkj=1NX1jk=dk,k=1,,M

01 | 创建决策变量

变量设置常用的三种形式:

  • sdqvar() 设置实型变量
  • intvar() 设置整型变量
  • binvar() 设置0-1变量

举例:P = sdqvar(n,m) 表示用 n 行 m 列定义一个矩阵(或标量)P

v = sdpvar(1,1);
X = binvar(numberOfVertices,numberOfVertices,uavNumber,'full');
u = sdpvar(numberOfVertices,1);
m = intvar(1,1);
for k = 1:uavNumber
	for i = 1:numberOfVertices
		X(i,i,k) = 0;
	end
	if uav(k) == 0
		X(:,:,k) = zeros(numberOfVertices);
	end
end
02 | 设置目标函数

YALMIP 默认求解最小值问题,如果问题的目标函数是求解最大值,则需要在目标函数前加负号
目标函数即求最小值 v

03 | 添加约束条件

先初始化约束条件为空,再逐个将约束条件添加

constraints = [];
% 限制1 - 总成本
for k = 1:uavNumber
    sum1 = 0;
    for i = 1:numberOfVertices
        for j = 1:numberOfVertices
            if i ~= j
                sum1 = sum1 + C(i,j)*sum(X(i,j,k));
            end
        end
    end
    constraints = [constraints, v >= sum1 + sum(X(1,:,k))*ceil(k/O)*uavSetupTime];
    % 限制9 - 飞行时间
    constraints = [constraints, sum1 <= uavFlightTime];
end
% 限制2 - 每个顶点必须被访问一次
for j = 2:numberOfVertices
    constraints = [constraints, sum(sum(X(:,j,:))) == 1];
end
% 限制3 - 到达给定节点的节点与离开该节点的节点相同。
for k = 1:uavNumber
    for p = 1:numberOfVertices
        constraints = [constraints, sum(X(:,p,k)) - sum(X(p,:,k)) == 0];
    end
end
% 限制4&5 - 无人机数量
constraints = [constraints, sum(sum(X(1,:,:))) == m];
constraints = [constraints, m <= sum(uav)];
% 限制7 - 循环
for i = 2:numberOfVertices
    for j = 2:numberOfVertices
        if i ~= j
            constraints = [constraints, u(i) - u(j) + numberOfVertices*sum(X(i,j,:)) <= numberOfVertices - 1];
        end
    end
end
% 限制 8 - 强制每条线路仅由一架无人机沿一个方向穿越
for i = 2:2:numberOfVertices
   constraints = [constraints, 1 == sum(X(i,i+1,:)) + sum(X(i+1,i,:))];
end
% 限制 10 - 避免 UA Vs 沿着不平行于覆盖范围的边缘穿过覆盖区域行
for i = 2:2:numberOfVertices
    constraints = [constraints, sum(X(i,i+1,:)) == sum(sum(X(i,3:2:numberOfVertices,:)))];
    constraints = [constraints, sum(X(i+1,i,:)) == sum(sum(X(i+1,2:2:numberOfVertices,:)))];
end
04 | 参数设置

使用 sdpsetting() 函数进行参数设置

% 使用 gurobi 最小化 v 受限于约束变量中包含的约束
options = sdpsettings('verbose',1,'gurobi.Threads',4);
05 | 求解问题

首先使用 solvesdp() 函数求解
再使用 double() 函数将求解的变量转换为实数

solvesdp(constraints,v,options);
X = round(double(X));
  • 7
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,关于GurobiMATLAB的使用教程,我可以为您提供一些基本的指导。 首先,您需要安装MATLABGurobi软件。Gurobi提供了一个免费的学术许可证,可以在其官方网站上申请。安装好Gurobi后,您需要将其与MATLAB连接起来。您可以通过在MATLAB命令窗口中输入以下命令来测试是否成功连接: ``` gurobi_test() ``` 如果您看到一些关于Gurobi的信息,那么就说明连接成功了。 接下来,您可以使用YALMIP来建模和求解TSP问题YALMIP是一个MATLAB工具箱,可以帮助您轻松地建模各种优化问题。以下是一个使用YALMIPGurobi求解TSP问题的示例代码: ```matlab % 生成TSP问题的数据 n = 5; % 城市数量 x = randn(n,1); y = randn(n,1); % 定义变量 u = sdpvar(n,1); v = binvar(n,n); % 定义目标函数 obj = sum(sum(v.*repmat(sqrt((x-x').^2+(y-y').^2),1,1))); % 添加约束条件 con = [sum(v,2)==1, sum(v,1)==1, u(1)==1, 2<=u<=n+1]; for i = 2:n con = [con, 2 <= u(i) <= n+1, u(i) <= u(find(v(i,:))) + (n-2)*(1-v(i,:)))]; end % 求解问题 ops = sdpsettings('solver','gurobi'); sol = optimize(con,obj,ops); % 输出结果 if sol.problem == 0 disp('Optimal solution found'); disp(value(obj)); else disp('Error'); end ``` 上述代码中,我们首先生成了一个包含5个城市的TSP问题的数据,然后定义了变量和目标函数。接下来,我们添加了约束条件来确保每个城市只能被访问一次,并且每个城市都必须在一条路径中出现。最后,我们使用Gurobi求解了该问题,并输出了最优解。 希望这个简单的示例可以帮助您入门GurobiMATLAB的使用。如果您需要更多的帮助,请随时联系我。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值