2018年第七届数学建模国际赛小美赛A题空中加油飞行计划解题全过程文档及程序

2018年第七届数学建模国际赛小美赛

A题 空中加油飞行计划

原题再现:

  太平洋中部一个小岛上的居民被自然灾害困住。救援人员需要派遣一架轻型飞机运送少量急救药品到岛上,并运送一名重伤者到医疗基地求救。岛上有一个无人值守的简易机场,可以使用,但没有飞机或燃料储备。飞机从距离该岛615海里的基地起飞。在正常载荷条件下,飞机最大航程为680海里。为了返回,我们必须进行空中加油。
  这种飞机能够在空中接收油。经过简单的改装,同一型号的飞机可以完成合作伙伴空中加油的任务,即将自己的燃油分配给合作伙伴。该类型飞机的最大燃油容量为155kg。空中加油设备安装后,最大载油量增加至170kg,其他载油量无法承载。基地拥有一支机队和足够的装备,可以在短时间内改装成油轮。

  问题:
  1、请设计可行的空中加油方案,使救援人员能够完成任务。
  2、空中加油属于高风险作业,有失败的可能。运输和加油飞机也有发生故障的概率。请考虑工程各部分的失败概率。当我们需要保证总成功率时,请给出相应的最优解决方案。

整体求解过程概述(摘要)

  在特定情况下,救援人员需要派遣轻型飞机将伤员从岛上运送到医疗基地进行救援。在本文中,我们设计了一个可行的空中加油方案,使救援人员能够完成任务,然后考虑失败的概率,得到一个最优解。
  首先,我们假设往返途中分别有m个加油点和n个加油点,每个加油点允许一个加油机为飞机加油。在救援成功的前提下,引入决策变量0和1来确定需要加油的点。确保剩余油足以支持飞机在最后一次加油后到达下一个加油点并安全返回基地,其油量不得超过最大容量。此外,我们考虑为油轮和飞机留下少量的安全油。以油船总油耗最小为目标函数,建立了混合整数非线性规划模型。利用Lingo软件,采用分枝定界法对模型进行求解。最后得出合理的加油方案:配备4艘加油船,2艘加油船分别在离岛90海里和270海里加油20.51471kg和40.58824kg;另外两艘加油船分别在距基地310海里和200海里处加油23.67647kg和45.58824kg。
  为了改进我们的模型,我们考虑了爬升、平层和着陆三个阶段的不同石油消耗比例。在加油过程中设置了一个恒定的距离,并尝试了三级距离和油耗比的不同参数组。通过敏感性分析发现,我国主要需要4艘油船,总油耗在467kg~555kg之间,说明了模型和加油方案的可行性。具体程序如表2和图4所示。
  其次,将换料过程分为交会、对接、换料和解体四个阶段。我们考虑前三个阶段的不同情况,其中有相应的失效概率。本文建立了以成功率最大、总油耗最小为目标函数的双目标规划模型。然后选择遗传算法对规划模型进行求解,分别以总成功率为85%和90%为一个成功任务。最后选取八组三阶段失效概率在相应情况下进行灵敏度分析。表3和表4的结果表明,该方案合理可行。
  由于故障事件的增加将导致空中加油的不确定性,因此需要更多的加油机来确保较高的成功率。在相同的事件概率下,较高的成功率阈值迫使我们派遣更多的油轮。保证更高的成功率,成功率越低,我们为更省油的目的派出的飞机就越少。

模型假设:

  1、为了简化我们的模型,不考虑轻型飞机和油轮的起飞时间,假设油轮和飞机是同步的,这样就可以在需要的时候立即接收燃油。

  2、不考虑油轮向其他油轮供油的情况。

  3、每辆加油车完成一次加油任务后返回。

  4、不考虑天气等外部环境因素的影响

  5、救援人员和加油人员经过严格的飞行训练,确保飞行安全。

问题重述:

  问题背景

  太平洋中部一个小岛上的居民被自然灾害困住。救援人员需要派遣一架轻型飞机运送少量急救药品到岛上,并运送一名重伤者到医疗基地求救。飞机从距离该岛615海里的基地起飞。在正常载荷条件下,飞机最大航程为680海里。为了返回,我们必须进行空中加油。
  这种飞机能够在空中接收油。经过简单的改装,同一型号的飞机可以完成合作伙伴空中加油的任务,即将自己的燃油分配给合作伙伴。该类型飞机的最大燃油容量为155kg。空中加油设备安装后,最大油量增加至170kg。基地拥有一支机队和足够的装备,可以在短时间内改装成油轮。

  问题重述

  1、设计可行的空中加油方案,使救援人员能够完成任务。
  2、空中加油属于高风险作业,有失败的可能。运输和加油飞机也有发生故障的概率。考虑到各部分工作的失效概率,需要保证总成功率和相应的最优解。

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

部分程序代码:(代码和文档not free)

c=0.2279411764705;
Xg0=0;
Yg0=155;
Xb0=615;
Yb0=0;
Rg0=0;
n=38;
enddata
sets:
gg/1..n/:g_use,Xg,Yg,Tg,costg;
bb/1..n/:b_use,Xb,Yb,Tb,costb;
Rgg/1..n/:Rg;
Rbb/1..n/:Rb;
Endsets
min=(@Sum(gg(i):costg(i))+@Sum(bb(i):costb(i)));
@for(gg(i):@Bin(g_use(i));Xg(i)=i*380/n);
@for(bb(i):@Bin(b_use(i));Xb(i)=380-(i-1)*380/n);
@for(gg(i):costg(i)=2*c*g_use(i)*Xg(i)+g_use(i)*Yg(i);@BND(0,Yg(i),165);@BND(0,cost
g(i),165)); 
@for(bb(i):costb(i)=2*c*b_use(i)*Xb(i)+b_use(i)*Yb(i);@BND(0,Yb(i),165);@BND(0,cost
b(i),165)); 
@for(Rgg(i):Rg(i)=@IF(i#eq#1,Rg0+Yg0-c*(Xg(i)-Xg0),Rg(i-1)+g_use(i-1)*Yg(i-1)-
c*(Xg(i)-Xg(i-1))); 
@for(gg(i):Tg(i)=Rg(i)+g_use(i)*Yg(i));@BND(0,Tg(i),155));
Rb0=Rg(n)+g_use(n)*Yg(n)-c*(615-Xg(n));
@for(Rbb(i):Rb(i)=@IF(i#eq#1,Rb0+Yb0-c*(Xb0-Xb(i)),Rb(i-1)+b_use(i-1)*Yb(i-1)-
c*(Xb(i-1)-Xb(i))); 
@for(bb(i):Tb(i)=Rb(i)+b_use(i)*Yb(i));@BND(0,Tb(i),155)); 
@for(gg(i):Rg(i)>=5);
@for(bb(i):Rb(i)>=5);
Rb0>=5;
Rb(n)+b_use(n)*Yb(n)-c*Xb(n)>=5;
x=20;
s1=0.15;
s3=0.15;
l1=50;
m1=5;
l3=50;
m2=5;
Xg0=0;
Yg0=155;
Xb0=615;
n=38;
enddata
sets:
start/1..m1/;
load/1..m2/;
gg/1..n/:g_use,Xg,Yg,Tg,costg;
bb/1..n/:b_use,Xb,Yb,Tb,costb;
Rgg/1..n/:Rg;
Rbb/1..n/:Rb;
endsets
!min=@Sum(gg(i):g_use(i))+@Sum(bb(i):b_use(i));
min=(@Sum(gg(i):costg(i))+@Sum(bb(i):costb(i)));
s2=1-s1-s3;
l2=615-l1-l3;
c=155*s2/(680-l1-l3);
@for(gg(i):@Bin(g_use(i));Xg(i)=i*380/n);
@for(bb(i):@Bin(b_use(i));Xb(i)=380-(i-1)*380/n);
@for(start(i):g_use(i)=0);
@for(load(i):b_use(n-i+1)=0);
@for(gg(i):costg(i)=g_use(i)*170*(s1+s3)+c*g_use(i)*(2*Xg(i)+2*x-l1-
l3)+g_use(i)*Yg(i);@BND(0,Yg(i),165);@BND(0,costg(i),165)); 
@for(bb(i):costb(i)=b_use(i)*170*(s1+s3)+c*b_use(i)*(2*Xb(i)-l1-
l3)+b_use(i)*Yb(i);@BND(0,Yb(i),165);@BND(0,costb(i),165)); 
@for(Rgg(i):Rg(i)=@IF(i#eq#1,Yg0-Yg0*s1-c*(Xg(i)-Xg0-l1),Rg(i-1)+g_use(i-1)*Yg(i-1)-
c*(Xg(i)-Xg(i-1)))); 
@for(gg(i):Tg(i)=Rg(i)+g_use(i)*Yg(i)-c*x;@BND(0,Tg(i),155));
Rb0=Rg(n)+g_use(n)*Yg(n)-c*(615-Xg(n));
@for(Rbb(i):Rb(i)=@IF(i#eq#1,Rb0-155*s1-c*(Xb0-l1-Xb(i)),Rb(i-1)+b_use(i-1)*Yb(i-1)-
c*(Xb(i-1)-Xb(i)))); 
@for(bb(i):Tb(i)=Rb(i)+b_use(i)*Yb(i)-c*x;@BND(0,Tb(i),155)); 
@for(Rgg(i):Rg(i)>=5);
@for(Rbb(i):Rb(i)>=5);
Rb0>=5;
Rb(n)+b_use(n)*Yb(n)-c*Xb(n)-155*s3>=5;
END
clc,clear
tic;
pop_size = 200; % population size
pop_len = 71;
gnmax = 300; % maximum number of generations
pc = 0.8; %crossover probability 
pm = 0.1; %mutation probability
% The formation of an initial population
s = zeros(pop_size,pop_len);
for i=1:pop_sizetmp = rand(1,pop_len);tmp(tmp>0.3)=1;tmp(tmp<=0.3)=0;s(i,:) = tmp;
end
% Calculate fitness function
[~,p] = objf(s);
gn = 1; %The current algebra.
ymean = zeros(gn,1);
ymin = zeros(gn,1);
xmin = zeros(pop_size,pop_len);
scnew = zeros(pop_size,pop_len); %Store crossover populations
smnew = zeros(pop_size,pop_len); %Store the mutant population
while gn<gnmax+1for j=1:2:pop_sizeseln=sel(p); %selectscro=cro(s,seln,pc); scnew(j,:)=scro(1,:);scnew(j+1,:)=scro(2,:);smnew(j,:)=mut(scnew(j,:),pm); smnew(j+1,:)=mut(scnew(j+1,:),pm);ends = smnew; % New populations have emerged[f,p] = objf(s); % Calculate the fitness of the new population% Optimal fitness and optimal individual location[fmin,nmin] = min(f);% Average fitness and optimal fitness were recordedymean(gn) = mean(f);ymin(gn) = fmin;% Record the best individuals of the current generationx = s(nmin,:);
xmin(gn,:) = x;gn = gn+1;
end
% Remove maximum points from the image
max_ymin = 0;
for i=1:length(ymin)if ymin(i) ~= 9999999if max_ymin < ymin(i)max_ymin = ymin(i);endend
end
for i=1:length(ymin)if ymin(i) == 9999999ymin(i) = max_ymin;end
end
[min_ymin,index] = min(ymin);
best_ym = ymin(index);
best_x = xmin(index,:);
figure(1);
plot(ymin,'r'); hold on;grid;
title('search process');
xlabel('The number of iterations');
ylabel('Refuel')
legend('Optimal solution');
fprintf('Refuel:%d
\n',min_ymin);
fprintf('best_x:');
disp(best_x);
toc; %------------------------------------------------
%The fitness of all populations was calculated
function [f,p]=objf(s)inn=size(s,1); %Read the population sizef=zeros(inn,1);for i=1:innf(i)=fitness(s(i,:)); %Calculate fitnessendtmp = f;f=(1000./f)'; %Take the bottom% Get the wheelfsum=0;
for i=1:innfsum=fsum+f(i)^15;endps=zeros(inn,1);for i=1:innps(i)=f(i)^15/fsum;end%Calculate the cumulative probabilityp=zeros(inn,1);p(1)=ps(1);for i=2:innp(i)=p(i-1)+ps(i);endp=p';f = tmp;
end
%--------------------------------------------------
%Determine the probability
function pcc=pro(pc)
test(1:100)=0;
p=round(100*pc);
test(1:p)=1;
n=round(rand*99)+1;
pcc=test(n); 
end
%--------------------------------------------------
%Select operation
function seln=sel(p)
seln=zeros(2,1);
%Choose two individuals from a population
%preferably not the same individual twice
for i=1:2r=rand; prand=p-r;j=1;while prand(j)<0j=j+1;endseln(i)=j; if i==2&&j==seln(i-1) %If they're the same, I'm going to do it again
r=rand; prand=p-r;j=1;while prand(j)<0j=j+1;endend
end
end
%------------------------------------------------
%Crossover operations
function scro=cro(s,seln,pc)
bn=size(s,2);
pcc=pro(pc); 
scro(1,:)=s(seln(1),:);
scro(2,:)=s(seln(2),:);
if pcc==1c1 = round(rand*(bn-2))+1; c2 = round(rand*(bn-2))+1;chb1 = min(c1,c2);chb2 = max(c1,c2);middle = scro(1,chb1+1:chb2);scro(1,chb1+1:chb2) = scro(2,chb1+1:chb2);scro(2,chb1+1:chb2) = middle;
end
end
%--------------------------------------------------
%Mutation operation
function snnew=mut(snew,pm)
bn=size(snew,2);
snnew=snew;
pmm=pro(pm); 
if pmm==1for i=1:3c1=round(rand*(bn-2))+1;snnew(c1)=1-snnew(c1);end
end
end
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/285308.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React基础巩固日志1

书写了一篇vue3的基础构建之后&#xff0c;不能带着各位一起学习vue3了&#xff0c;因为我要面试上海的前端岗位了&#xff0c;所以从现在开始&#xff0c;我要带着大家一起学习React了。 以下是我使用react书写的要掌握的react的知识点&#xff1a; ** ** 那么下面我们就一一通…

钡铼无线R10A工业级路由器在工业机器人领域的创新应用

随着工业机器人的普及&#xff0c;对于高可靠性和高稳定性的网络接入设备的需求也越来越大。传统的有线网络虽然稳定&#xff0c;但在现场布置和维护上面临很多困难&#xff0c;而无线网络虽然方便&#xff0c;但受到信号干扰和传输距离限制等问题的影响。如何解决这些问题&…

解决docker alpine /bin/sh: ./main: not found

解决docker alpine /bin/sh: ./main: not found golang中编译之后的二进制文件部署在alpine镜像中出现了not found问题解决这种情况是因为动态链接库位置错误导致的&#xff0c;alpine镜像使用的是musl libc而不是gun libc。因而动态链接库的位置不一致。在基础镜像内执行&…

DS排序--快速排序

Description 给出一个数据序列&#xff0c;使用快速排序算法进行从小到大的排序 排序方式&#xff1a;以区间第一个数字为枢轴记录 输出方式&#xff1a;每一步区间排序&#xff0c;都输出整个数组 –程序要求– 若使用C只能include一个头文件iostream&#xff1b;若使用C…

pytorch文本分类(三)模型框架(DNNtextCNN)

pytorch文本分类&#xff08;三&#xff09;模型框架&#xff08;DNN&textCNN&#xff09; 原任务链接 目录 pytorch文本分类&#xff08;三&#xff09;模型框架&#xff08;DNN&textCNN&#xff09;1. 背景知识深度学习 2. DNN2.1 从感知器到神经网络2.2 DNN的基本…

人工智能辅助下的人工心脏:未来医疗的奇迹

导言 人工智能在医学领域的应用不断创新&#xff0c;其中人工心脏作为医疗工程的重要方向&#xff0c;将为心血管疾病患者带来新的治疗可能性。本文将深入研究人工智能辅助下的人工心脏技术&#xff0c;其原理、应用以及对未来医疗的影响&#xff0c;探讨人工心脏的发展历程、面…

apache shiro 反序列化漏洞解决方案

apache shiro 反序列化漏洞解决方案 反序列化漏洞解决方案产生原因解决方案1&#xff1a;1.升级shiro至最新版本1.7.1解决方案2&#xff1a;修改rememberMe默认密钥&#xff0c;生成随机密钥。 反序列化漏洞解决方案 反序列化漏洞介绍 序列化&#xff1a;把对象转换为字符串或…

unittest自动化测试框架讲解以及实战

为什么要学习unittest 按照测试阶段来划分&#xff0c;可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&#xff0c;通常指函数或者类&#xff0c;一般是开发完成的。 单元…

详细教程 - 从零开发 鸿蒙harmonyOS应用 第九节-——鸿蒙操作系统中的自定义视图封装:一次奇妙的旅程

一、简介 自定义视图是开发鸿蒙应用时的一个重要功能。在这篇文章中&#xff0c;我们将详细探讨如何在鸿蒙系统中实现自定义视图的封装&#xff0c;并提供一些代码示例作为你的地图。 二、自定义视图的实现 在鸿蒙操作系统中&#xff0c;我们可以通过继承ohos.agp.components.…

深入解析Guava范围类(Range)

第1章&#xff1a;范围类Range的重要性 大家好&#xff0c;我是小黑&#xff0c;今天咱们聊聊一个在Java编程世界里非常实用但又被低估的角色——Guava库中的Range类。你知道吗&#xff0c;在处理涉及到数值范围的问题时&#xff0c;Range类就像是咱们的救星。不论是判断某个数…

阿里云主导《Serverless 计算安全指南》国际标准正式立项!

日前&#xff0c;在韩国召开的国际电信联盟电信标准分局 ITU-T SG17 全会上&#xff0c;由阿里云主导的《Serverless 计算安全指南》国际标准正式立项成功。 图 1 项目信息 在现今数字化时代&#xff0c;Serverless 计算正逐渐成为云计算的一个新的发展方向&#xff0c;其灵活…

Spring Boot自动装配原理以及实践

了解自动装配两个核心 Import注解的作用 Import说Spring框架经常会看到的注解&#xff0c;它有以下几个作用: 导入Configuration类下所有的bean方法中创建的bean。导入import指定的bean&#xff0c;例如Import(AService.class)&#xff0c;就会生成AService的bean&#xff0…