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

本文主要是介绍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名片即可

这篇关于2018年第七届数学建模国际赛小美赛A题空中加油飞行计划解题全过程文档及程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/517433

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Redis实现分布式锁全过程

《Redis实现分布式锁全过程》文章介绍Redis实现分布式锁的方法,包括使用SETNX和EXPIRE命令确保互斥性与防死锁,Redisson客户端提供的便捷接口,以及Redlock算法通过多节点共识... 目录Redis实现分布式锁1. 分布式锁的基本原理2. 使用 Redis 实现分布式锁2.1 获取锁

Spring-DI依赖注入全过程

《Spring-DI依赖注入全过程》SpringDI是核心特性,通过容器管理依赖注入,降低耦合度,实现方式包括组件扫描、构造器/设值/字段注入、自动装配及作用域配置,支持灵活的依赖管理与生命周期控制,... 目录1. 什么是Spring DI?2.Spring如何做的DI3.总结1. 什么是Spring D

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图