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 型运输直升机。派送完所载的全部货物后(中途不能加油),需要返回基地。

问题:

请问基地应该同时派遣几架 Mi-26 型运输直升机运送医疗物资,使得所有直升机飞行总距离之和最短?

解决方案:

使用优化模型,并给出每个飞机的路线。

1. 数学模型

目标函数: 最小化所有直升机飞行总距离

约束条件:

  1. 每个直升机所载货物重量不能超过最大载重
  2. 每个直升机的航程不能超过最大航程
  3. 每个城市必须被至少一架直升机送达
  4. 每架直升机只能飞行一条路径

2. MATLAB 代码

clear
clc

%城市位置和需求
city_loc = [30.67 104.06; 29.36 104.77; 26.58 101.71; 28.87 105.44; 31.13 104.39; 31.47 104.68; 32.43 105.82; 30.52 105.59; 29.59 103.76; 29.56 103.76; 30.84 106.13; 29.99 103.83; 28.78 104.62; 30.46 106.63; 31.22 107.50; 30.01 103.01; 30.80 106.76; 28.77 105.73; 31.90 102.22; 31.62 102.23; 27.90 102.26];
city_dem = [2000; 800; 500; 500; 500; 800; 500; 500; 800; 500; 500; 500; 500; 500; 500; 500; 500; 500; 200; 200; 200];

%基地位置
base_loc = [30.12 104.63];

%直升机参数
max_range = 2000; %最大航程
max_load = 12000; %最大载重
speed = 255; %飞行速度

%计算城市间距离矩阵
n_city = size(city_loc, 1);
dist_mat = zeros(n_city, n_city);
for i = 1:n_city
    for j = 1:n_city
        dist_mat(i,j) = norm(city_loc(i,:) - city_loc(j,:));
    end
end

%优化模型
cvx_begin

variable x(n_city, n_city, 'binary') %x(i,j)=1表示第i架直升机经过路径(i,j)
variable y(n_city, 'nonnegative') %y(i)表示第i个城市的需求
variable z(n_city, 'nonnegative') %z(i)表示第i架直升机的飞行距离

minimize sum(z) %最小化总飞行距离

subject to

%每个城市必须被至少一架直升机送达
for i = 1:n_city
    sum(x(:,i)) >= 1;
end

%每个直升机所载货物重量不能超过最大载重
for i = 1:n_city
    for j = 1:n_city
        if i ~= j
            sum(y(i) * x(i,j)) <= max_load;
        end
    end
end

%每个直升机的航程不能超过最大航程
for i = 1:n_city
    for j = 1:n_city
        if i ~= j
            z(i) + dist_mat(i,j) * x(i,j) <= max_range;
        end
    end
end

%每架直升机只能飞行一条路径
for i = 1:n_city
    for j = 1:n_city
        if i ~= j
            x(i,j) + x(j,i) <= 1;
        end
    end
end

%约束条件
y <= city_dem;
sum(y) <= max_load * n_city;

cvx_end

%输出结果
disp(['最小总飞行距离:', num2str(sum(z)), ' 公里'])
for i = 1:n_city
    for j = 1:n_city
        if i ~= j && x(i,j) == 1
            disp(['第', num2str(i), '架直升机飞行路径:'])
            disp(['起点:基地,终点:', num2str(j)])
        end
    end
end

%画出图形
figure
hold on
plot(base_loc(2), base_loc(1), 'ro', 'MarkerSize', 10, 'LineWidth', 2)
for i = 1:n_city
    plot(city_loc(i,2), city_loc(i,1), 'bo', 'MarkerSize', 10, 'LineWidth', 2)
    for j = 1:n_city
        if i ~= j && x(i,j) == 1
            line([city_loc(i,2), city_loc(j,2)], [city_loc(i,1), city_loc(j,1)], 'Color', 'g', 'LineWidth', 2)
        end
    end
end
legend('基地', '城市', '路径')
xlabel('经度')
ylabel('纬度')
title('直升机配送路径图')

3. 路径可视化

代码会生成一个图形,展示基地、城市和直升机飞行路径。

注: 由于数据量较大,运行时间较长,建议将数据量缩小后运行。

Mi-26 型运输直升机配送医疗物资优化方案:数学模型、MATLAB 代码和路径可视化

原文地址: https://www.cveoy.top/t/topic/nRJq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录