基地在经纬度坐标为30127692 104628690需要同时前往四川省21个市州配送药物Mi-26 型运输直升机最大航程 为 2000 公里最大载重 12000 公斤飞行速度为 255 公里小时。每个地方所需货物如下城市名称和所需要的医疗物资成都市 2000自贡市 800攀枝花市 500泸州市 500德阳市 500绵阳市 800广元市 500遂宁市 500内江市 800乐山市 500南充市 50
数学模型:
目标函数:最小化所有直升机飞行总距离
约束条件: 1.每个直升机所载货物重量不能超过最大载重 2.每个直升机的航程不能超过最大航程 3.每个城市必须被至少一架直升机送达 4.每架直升机只能飞行一条路径
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('直升机配送路径图'
原文地址: https://www.cveoy.top/t/topic/eqXx 著作权归作者所有。请勿转载和采集!