基于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,并且给出每个飞机的路线

数学建模:

  1. 确定目标函数 需要使得所有直升机飞行总距离之和最短,因此目标函数可以表示为:min Σ(i,j)∈E c(i,j)x(i,j),其中c(i,j)为城市i到城市j的距离,x(i,j)为城市i和城市j之间的路径是否被选择,取值为0或1。

  2. 确定约束条件 (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为除基地外的城市集合。

  3. 确定模型 综合以上目标函数和约束条件,可以得到优化模型:

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}
  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;

代码解释:

  1. 定义城市坐标和需求量:
  • city:存储城市名称的字符串数组。
  • x:存储每个城市经度的数值数组。
  • y:存储每个城市纬度的数值数组。
  • demand:存储每个城市所需医疗物资重量的数值数组。
  1. 计算城市之间的距离:
  • 使用两点间距离公式计算每个城市之间的距离,并存储在distance矩阵中。
  1. TSP模型求解:
  • 定义最大载重W,直升机数量m,以及除基地外的城市集合U
  • 使用binvar函数定义决策变量x,表示城市之间的路径是否被选择。
  • 构建目标函数f,表示所有直升机飞行总距离之和。
  • 构建约束条件con,包括每个城市只能被访问一次,每个直升机的载荷不能超过最大载重,以及每个直升机必须从基地出发,到达所有城市并返回基地。
  • 使用optimize函数求解模型,并获取最优解x
  1. 求解结果可视化:
  • x中提取每个直升机的路线,并存储在route单元数组中。
  • 使用scatter函数绘制所有城市的坐标。
  • 使用plot函数绘制每架直升机的飞行路线。
  • 添加标题、坐标轴标签、网格线等。

结果:

运行代码后,MATLAB会输出每架直升机的配送路线,并绘制路线图。根据结果,可以确定需要同时派遣多少架直升机,以及每架直升机的配送路线,以最小化直升机飞行总距离之和。

注意:

  • 需要安装Gurobi求解器才能运行代码。
  • 代码中的城市坐标和需求量是假设的,可以根据实际情况进行调整。
  • 代码只提供了一个基本的实现方法,可以根据实际情况进行扩展和优化。

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

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