基于TSP优化模型的直升机医疗物资配送路线规划
基于TSP优化模型的直升机医疗物资配送路线规划
假设基地位于经纬度坐标为(30.127692, 104.628690),需要同时前往四川省21个市州配送药物。Mi-26型运输直升机最大航程为2000公里,最大载重12000公斤,飞行速度为255公里/小时。每个地方所需货物如下(城市名称和所需要的医疗物资):
| 城市名称 | 所需医疗物资 | |---|---| | 成都市 | 2000 | | 自贡市 | 800 | | 攀枝花市 | 500 | | 泸州市 | 500 | | 德阳市 | 500 | | 绵阳市 | 800 | | 广元市 | 500 | | 遂宁市 | 500 | | 内江市 | 800 | | 乐山市 | 500 | | 南充市 | 500 | | 眉山市 | 500 | | 宜宾市 | 500 | | 广安市 | 500 | | 达州市 | 500 | | 雅安市 | 500 | | 巴中市 | 500 | | 资阳市 | 500 | | 阿坝州 | 200 | | 甘孜州 | 200 | | 凉山州 | 200 |
基地拥有总共有10架直升机。直升机派送完所载的全部货物后需要返回基地。请问基地应该同时派遣几架Mi-26型运输直升机运送医疗物资,使得所有直升机飞行总距离之和最短?
使用优化模型TSP,并且给出每个飞机的路线
数学建模:
-
确定目标函数 需要使得所有直升机飞行总距离之和最短,因此目标函数可以表示为:min Σ(i,j)∈E c(i,j)x(i,j),其中c(i,j)为城市i到城市j的距离,x(i,j)为城市i和城市j之间的路径是否被选择,取值为0或1。
-
确定约束条件 (1)每个城市只能被一个直升机访问,即每个城市在路径中只能被访问一次。因此有约束条件: Σj∈V x(i,j) = 1,i∈V,其中V为城市集合。 (2)每个直升机的载荷不能超过最大载重。因此有约束条件: Σj∈V w(j)x(i,j) ≤ W,i∈V,其中W为最大载重,w(j)为城市j所需的货物重量。 (3)每个直升机需要从基地出发,到达所有城市并返回基地。因此有约束条件: Σj∈V x(0,j) = Σj∈V x(j,0) = m,其中m为直升机数量。 (4)每个直升机的路径必须是一条连通的闭合路径。因此有约束条件: Σj∈U x(i,j) - Σj∈U x(j,i) = 0,i∈U,其中U为除基地外的城市集合。
-
确定模型 综合以上目标函数和约束条件,可以得到优化模型:
min Σ(i,j)∈E c(i,j)x(i,j)
s.t.
Σj∈V x(i,j) = 1,i∈V
Σj∈V w(j)x(i,j) ≤ W,i∈V
Σj∈V x(0,j) = Σj∈V x(j,0) = m
Σj∈U x(i,j) - Σj∈U x(j,i) = 0,i∈U
x(i,j) ∈ {0,1}
- 求解模型 使用TSP算法求解模型,得到每个直升机的路线,使得所有直升机飞行总距离之和最短。
MATLAB实现:
以下是基于MATLAB的优化模型TSP的实现代码:
% 定义城市坐标和需求量
city = ['Chengdu', 'Zigong', 'Panzhihua', 'Luzhou', 'Deyang', 'Mianyang', 'Guangyuan', 'Suining', 'Neijiang', 'Leshan', 'Nanchong', 'Meishan', 'Yibin', 'Guangan', 'Dazhou', 'Yaan', 'Bazhong', 'Ziyang', 'Aba', 'Ganzi', 'Liangshan'];
x = [104.065735, 104.773447, 101.718637, 105.442258, 104.402398, 104.679114, 105.829757, 105.571331, 105.065735, 103.765831, 106.084791, 103.831788, 104.634774, 106.633369, 107.502262, 103.001033, 106.747477, 104.627636, 102.224653, 101.962539, 102.257625];
y = [30.659462, 29.348748, 26.587571, 28.895932, 31.139966, 31.474853, 32.442465, 30.532174, 29.583186, 29.562849, 30.837793, 30.075440, 28.758007, 30.455962, 31.209571, 29.984092, 31.867165, 31.753620, 32.904600, 30.049320, 27.884979];
demand = [2000, 800, 500, 500, 500, 800, 500, 500, 800, 500, 500, 500, 500, 500, 500, 500, 500, 500, 200, 200, 200];
% 计算城市之间的距离
n = length(city);
distance = zeros(n, n);
for i = 1:n
for j = i+1:n
distance(i,j) = sqrt((x(i)-x(j))^2 + (y(i)-y(j))^2);
distance(j,i) = distance(i,j);
end
end
% TSP模型求解
W = 12000; % 最大载重
m = 10; % 直升机数量
U = 2:n; % 除基地外的城市集合
x = binvar(n,n,'full');
f = sum(sum(distance.*x)); % 目标函数
con = [sum(x,2) == 1; % 每个城市只能被一个直升机访问
sum(demand'.*x,2) <= W; % 每个直升机的载荷不能超过最大载重
sum(x(1,:)) == m; % 每个直升机需要从基地出发
sum(x(:,1)) == m; % 每个直升机需要返回基地
sum(x(U,:)-x(:,U)') == 0]; % 每个直升机的路径必须是一条连通的闭合路径
ops = sdpsettings('solver','gurobi','verbose',1);
sol = optimize(con,f,ops);
x = value(x);
% 求解结果可视化
route = cell(m,1);
for k = 1:m
idx = find(x(:,1)==1); % 找到第k个直升机的起始城市
r = idx(1);
q = r;
while true
p = find(x(q,:)==1);
if p == 1 % 返回基地
break;
end
route{k} = [route{k}, p];
x(q,p) = 0;
q = p;
end
route{k} = [route{k}, r]; % 回到起始城市
end
% 画出城市和路线图
figure;
scatter(x,y,50,'filled');
text(x,y,city);
hold on;
for k = 1:m
r = route{k};
plot(x([r,r(1)]),y([r,r(1)]),'-o','LineWidth',2);
end
title('Routes of helicopters for delivering medical supplies');
xlabel('Longitude');
ylabel('Latitude');
axis equal;
grid on;
代码解释:
- 定义城市坐标和需求量:
city:存储城市名称的字符串数组。x:存储每个城市经度的数值数组。y:存储每个城市纬度的数值数组。demand:存储每个城市所需医疗物资重量的数值数组。
- 计算城市之间的距离:
- 使用两点间距离公式计算每个城市之间的距离,并存储在
distance矩阵中。
- TSP模型求解:
- 定义最大载重
W,直升机数量m,以及除基地外的城市集合U。 - 使用
binvar函数定义决策变量x,表示城市之间的路径是否被选择。 - 构建目标函数
f,表示所有直升机飞行总距离之和。 - 构建约束条件
con,包括每个城市只能被访问一次,每个直升机的载荷不能超过最大载重,以及每个直升机必须从基地出发,到达所有城市并返回基地。 - 使用
optimize函数求解模型,并获取最优解x。
- 求解结果可视化:
- 从
x中提取每个直升机的路线,并存储在route单元数组中。 - 使用
scatter函数绘制所有城市的坐标。 - 使用
plot函数绘制每架直升机的飞行路线。 - 添加标题、坐标轴标签、网格线等。
结果:
运行代码后,MATLAB会输出每架直升机的配送路线,并绘制路线图。根据结果,可以确定需要同时派遣多少架直升机,以及每架直升机的配送路线,以最小化直升机飞行总距离之和。
注意:
- 需要安装Gurobi求解器才能运行代码。
- 代码中的城市坐标和需求量是假设的,可以根据实际情况进行调整。
- 代码只提供了一个基本的实现方法,可以根据实际情况进行扩展和优化。
原文地址: https://www.cveoy.top/t/topic/nUgD 著作权归作者所有。请勿转载和采集!