基于遗传算法的 Mi-26 型运输直升机多点医疗物资配送路线优化
基于遗传算法的 Mi-26 型运输直升机多点医疗物资配送路线优化
假设基地位于经纬度坐标为 (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 型运输直升机运送医疗物资,使得所有直升机飞行总距离之和最短?
数学建模
- 将基地和 21 个市州看作 22 个节点,构成一张完全图(任意两个节点之间都有边连接)。
- 计算每两个节点之间的距离(即直线距离),作为边的权值。
- 将问题转化为 TSP 问题,即求解从起点出发经过所有节点且回到起点的最短路径。
- 由于每个节点都需要被访问一次,因此问题可以转化为求解 22 个节点的排列,使得总路径长度最短。
- 使用遗传算法求解 TSP 问题,得到最优解,即最短路径长度和路径。
- 根据每个城市所需货物量和每架直升机的最大载重,计算每个直升机需要运送的货物量。
- 根据最优路径和每架直升机需要运送的货物量,确定每个直升机的路线,保证在最短路径的前提下,每个直升机都运送到足够的货物。
- 画出每个直升机的路线图。
Matlab 代码
% 城市名称和所需货物量
city_name = {'成都市','自贡市','攀枝花市','泸州市','德阳市','绵阳市',...
'广元市','遂宁市','内江市','乐山市','南充市','眉山市',
'宜宾市','广安市','达州市','雅安市','巴中市','资阳市',
'阿坝州','甘孜州','凉山州'};
city_goods = [2000,800,500,500,500,800,500,500,800,500,500,500,500,500,500,500,500,500,200,200,200];
% 基地经纬度
base_lat = 30.127692;
base_lon = 104.628690;
% 城市经纬度
city_lat = [30.5702,29.3392,26.5828,28.8718,31.1269,31.4675,32.4354,30.5329,29.5875,29.5521,30.8373,30.0754,28.7513,30.4559,31.2086,29.9804,31.8679,30.7591,31.8998,30.0493,27.8816];
city_lon = [104.0648,104.7784,101.7187,105.4400,104.3978,104.6791,105.8298,105.5927,105.0584,103.7654,106.1107,103.8487,104.6419,106.6333,107.5023,103.0130,107.2220,104.6419,102.2214,101.7168,102.2675];
% 计算城市之间的距离
n = length(city_name);
dist = zeros(n,n);
for i = 1:n
for j = 1:n
lat1 = city_lat(i);
lon1 = city_lon(i);
lat2 = city_lat(j);
lon2 = city_lon(j);
dist(i,j) = sqrt((lat1-lat2)^2 + (lon1-lon2)^2);
end
end
% TSP 问题求解
pop_size = 200; % 种群大小
gen_num = 200; % 迭代次数
mutation_rate = 0.05; % 变异率
[opt_path,opt_dist] = tsp_ga(dist,pop_size,gen_num,mutation_rate);
% 每架直升机需要运送的货物量
max_load = 12000; % 最大载重
n_heli = 10; % 直升机数量
goods_per_heli = ceil(sum(city_goods)/n_heli); % 平均每架直升机需要运送的货物量
load_per_heli = zeros(1,n_heli); % 每架直升机需要运送的货物量
for i = 1:n_heli
load_per_heli(i) = min(goods_per_heli,max_load); % 每架直升机最多运载 max_load 的货物
end
% 确定每个直升机的路线
heli_path = cell(1,n_heli);
heli_path{1} = opt_path;
load_idx = 1;
for i = 2:n_heli
heli_dist = zeros(1,n_heli); % 每架直升机到达每个城市的距离
for j = 1:n_heli
heli_path{j} = opt_path((j-1)*n_heli+1:j*n_heli); % 第 j 架直升机的路径
% 计算第 j 架直升机到达每个城市的距离
for k = 1:n
if k == 1 % 基地到第一个城市
heli_dist(j,k) = dist(1,heli_path{j}(k));
elseif k == n % 最后一个城市到基地
heli_dist(j,k) = dist(heli_path{j}(k-1),1);
else % 中间城市
heli_dist(j,k) = dist(heli_path{j}(k-1),heli_path{j}(k));
end
end
end
% 找到当前最短路径的直升机
[~,idx] = min(sum(heli_dist,2));
% 将当前最短路径的直升机的路径中的最后一个城市和下一个直升机需要运送的货物连接起来
heli_path{idx}(n) = load_idx+1;
% 更新下一个直升机需要运送的货物
load_per_heli(i) = load_per_heli(i) - sum(city_goods(load_idx:heli_path{idx}(n-1)));
% 更新下一个直升机需要运送的路径
opt_path = [opt_path(1:(load_idx-1)*n_heli+heli_path{idx}(n-1)),...
(load_idx+1)*ones(1,n_heli),opt_path((load_idx-1)*n_heli+heli_path{idx}(n):end)];
% 更新下一个直升机需要运送的货物的索引
load_idx = heli_path{idx}(n-1) + 1;
end
% 画出每个直升机的路线图
figure;
hold on;
plot(base_lon,base_lat,'ro','MarkerSize',10,'LineWidth',2);
for i = 1:n
plot(city_lon(i),city_lat(i),'bo','MarkerSize',10,'LineWidth',2);
text(city_lon(i),city_lat(i),city_name{i});
end
for i = 1:n_heli
heli_lat = [base_lat,city_lat(heli_path{i}),base_lat];
heli_lon = [base_lon,city_lon(heli_path{i}),base_lon];
plot(heli_lon,heli_lat,'-','LineWidth',2);
end
xlabel('经度');
ylabel('纬度');
title('直升机路线图');
axis equal;
hold off;
补充说明
tsp_ga.m函数是遗传算法求解 TSP 问题的 Matlab 代码,需要自行编写或从网上获取。- 该代码仅供参考,实际应用中需要根据具体情况进行调整。
- 可以根据实际需求添加直升机航程限制、飞行时间限制等约束条件。
- 可以根据实际情况选择不同的优化算法,例如模拟退火算法、粒子群算法等。
原文地址: https://www.cveoy.top/t/topic/nSV2 著作权归作者所有。请勿转载和采集!