数学建模校赛latex文档
Posted 中二病没有蛀牙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学建模校赛latex文档相关的知识,希望对你有一定的参考价值。
垃圾csdn没有latex高亮
% !Mode:: "TeX:UTF-8"
% !TEX program = xelatex
% \\documentclass{cumcmthesis}
\\documentclass[withoutpreface,bwprint]{cumcmthesis} %去掉封面与编号页,电子版提交的时候使用。
\\usepackage[framemethod=TikZ]{mdframed}
\\usepackage{url} % 网页链接
\\usepackage{subcaption} % 子标题
\\usepackage[section]{placeins}%浮动题在section前输出
\\title{基于双层模拟退火算法的运动场选址问题解决方案}
\\tihao{A}
\\baominghao{4321}
\\schoolname{XX大学}
\\membera{杨丽冰 }
\\memberb{ }
\\memberc{ }
\\supervisor{ }
\\yearinput{2020}
\\monthinput{08}
\\dayinput{22}
\\begin{document}
\\maketitle
\\begin{abstract}
随着城市的不断发展,城市环境的改善对于群众生活水平的提升越发重要,以运动场为例的城市设施是提升城市环境的一重要途径。本文通过研究运动场建设位置合理选址,建立了运动场选址模型,计算出了最佳新运动场的选址。此外,还综合既有运动场选定地址,对其合理性进行了分析和评价。
首先,我们基于\\textbf{P-中值模型},针对运动场建设成本建立了模型。由于P中值模型仅仅考虑到了设施与需求点之间的运输成本,而实际上除了运输成本,现实中还有其他的成本,实用性具有一定的限制,我们在P中值模型的基础上进行了扩展,考虑了设施的建设成本、设施的容量限制。当设施的容量达到上限时,居民会选择前往其他的运动场。
其次,针对居民从居民区到运动场的成本消耗问题,我们将距离最短的路径利用\\textbf{Dijkstra算法},建立了最短路模型。
基于这两个模型,我们的到了目标函数,由于目标函数的解有两部分组成,我们采用\\textbf{双层模拟退火算法},分为两个层次,自下而上求解。
针对问题一,我们在所建设运动场数量为4时,运用双层模拟退火算法求得了最优解与其对应的选址的集合,最优选址为2,3,4,7。
针对问题二,为了分析原来的选址是否合理,我们结合\\textbf{Topsis优劣解距离法},通过计算得到了最优选址与原选址的误差值,对原选址做出了较优的评价。
针对问题三,其本质仍是最小化相关费用的前提下,从可选设施集合中确定设施的修建位置。因此,我们仍沿用问题一所建立的数学模型,在选择设施位置的领域函数上做出改动。随后,我们使用迭代搜索,在最低计算开销下找到最优解。再不超过运动场容量限制的情况下,内层模拟退火算法为居民点分配对应的运动场,使得加权距离和最小。最终,我们求出了最优解与其对应的选址的集合,选址为2,6,12,15,18。
最后,在模型的评价中,我们对模型的局限与优缺点进行了分析。
\\keywords{规划问题\\quad 双层模拟退火算法\\quad 最短路\\quad p-中值模型\\quad Topsis优劣解距离法}
\\end{abstract}
%目录 2019 明确不要目录,我觉得这个规定太好了
%\\tableofcontents
%\\newpage
\\section{问题重述}
城市环境是包括居住环境、交通环境在内的一个地域综合体。随着我国经济社会的不断发展,城市环境成为评价群众生活质量的一个重要指标,
而如运动场等配套设施的建设成为了提升城市环境的一重要途径。如何在合理地规划城市环境、建设城市周边配套设施的同时又节约开支,以求达到城市建设者与群众多方利益最大化,成为了需要解决的一大难题。
本题是以给定地点区域简化图为基础,寻求新建运动场选址,并探求既有运动场建设合理性。从本题区域简化图中可以得知各居民点的位置信息,包括连通关系、距相邻居民点的距离。从题目给出的数据中亦可得到个点居民数。该区域既有4块运动场,分别位于4,6,12,15号居民点。
在模型中,我们需要考虑运动场建设成本问题、人均出行时间与距离成本,运动场容量等多方面问题。
最后,根据模型得出的结果与既有运动场选址点进行对比,分析既有选址点选址的合理性,并对新建选址给出科学的指导性意见。
\\section{问题分析}
\\subsection{对问题一的分析}
问题一要求建立合适的选址模型。选址问题类似于非线性规划以及组合优化问题。选址模型可以大致分为定性和定量两大类。目前较常见的方法包括重心法、层次分析法、最短路径法。重心法只考虑单个设施,层次分析法没有相关数据支撑,最短路径法仅考虑了居民点距离运动场的距离。选址问题属于np难题,在求解规模较大的选址问题上计算成本很高。
故本文采取双层模拟退火算法求解,外层对运动场选址方案进行优化,内层在确定运动场位置的情况下,进行居民运动需求的分配优化。
该方法收敛速度快,且能得到更符合实际情况的最优解。
\\subsection{对问题二的分析}
问题二要求分析题目给定的方案是否合理。可以通过的建立模型求得最优解。本文结合了Topsis优劣解距离法,在此基础上通过最优解偏差百分比来评价题目给定方案是否合理。
\\subsection{对问题三的分析}
问题三要求确定新增运动场的最佳位置。解决思路为:枚举运动场位置,再确定运动场位置的前提下,通过模拟退火算法求得用户需求的最佳分配方案。
\\section{模型假设}
\\begin{itemize}
\\item 假设每个居民点的所有居民会选择一个长期固定的运动场;
\\item 假设居民去运动场时均走最短路径;
\\item 假设居民前往运动场的成本与距离成线性关系;
\\item 假设运动场的固定建设成本与地理位置及容量有关。相较于边缘位置,中心位置的成本更高;
\\item 假设每个运动场运动场有容量限制,且各运动场容量大小成正态分布;
\\item 假设运动场建设成本和容量成正相关;
\\end{itemize}
\\section{符号说明}
\\begin{table}[!htbp]
\\caption{符号定义}\\label{tab:003} \\centering
\\begin{tabular}{ccccc}
\\toprule[1.5pt]
符号 & 定义\\\\
\\midrule[1pt]
$N$ & 居民区的数量\\\\
$M$ & 运动场的数量\\\\
$I$ & 居民区位置的集合\\\\
$J$ & 运动场可选位置的集合\\\\
$C_{ij}$ & 从居民地i到运动场j的最短距离\\\\
$D_i$ & 居民区i的运动需求量\\\\
$A_j$ & 运动场j的容量\\\\
$X_{ij}$ & 从居民地i是否去运动场j的决策变量,去为1,不去为0\\\\
$F_j$ & 建设运动场j所需固定费用\\\\
$Y_j$ & 是否建设运动场j,建设了运动场时为1,否则为0\\\\
\\bottomrule[1.5pt]
\\end{tabular}
\\end{table}
\\section{模型的建立和求解}
\\subsection{目标函数}
P-中值模型是给定数量、位置的需求集合、候选设施位置的集合下,分别为P个设施找到
合适位置并分配给每个需求点之间的运输总成本达到最低\\cite{001}。该问题是一个N-P难题。
由于P-中值模型仅仅考虑到了设施与需求点之间的运输成本,而实际上除了运输成本,现实中还有其他的成本,
实用性具有一定的限制。于是我们在P-中值模型的基础上进行了扩展,考虑了设施的建设成本,以及设施的容量限制。
当设施的容量达到上限时,居民会选择前往其他的运动场。
于是基于P-中值模型,建立了一个选址模型的目标函数$Z$:
\\begin{equation}
min Z = \\sum_{i = 1}^{N} \\sum_{j = 1}^{N}D_iC_{ij} X_{ij}+ \\sum_{j = 1}^{N}F_jY_j
\\label{eq:a}
\\end{equation}
约束条件:
\\begin{equation}
\\sum_{j = 1}^{N} X_{ij} = 1,\\forall i\\in I
\\label{eq:b}
\\end{equation}
\\begin{equation}
\\sum_{i = 1}^{N} D_iX_{ij} \\leqslant A_j ,\\forall i\\in I,\\forall j\\in J
\\end{equation}
\\begin{equation}
X_{ij} \\leqslant Y_j,\\forall j\\in J
\\end{equation}
\\begin{equation}
\\sum_{j = 1}^{N} Y_j = M ,\\forall j\\in J
\\end{equation}
\\begin{equation}
X_{ij}=
\\begin{cases}
1 & \\text{居民地i去运动场j}\\\\
0 & \\text{居民地i不去运动场j}\\\\
\\end{cases}
,i \\in I,j \\in J
\\end{equation}
\\begin{equation}
Y_j=
\\begin{cases}
0 & \\text{在居民地i不建运动场}\\\\
1 & \\text{在居民地i建运动场}
\\end{cases}
,j \\in J
\\end{equation}
上面式(2)保证了每个居民区都只去一个运动场,式(3)保证了不超过过运动场的容量,式(4)保证了只有运动场已经建设,
居民才能选择该运动场, 式(5)保证了总共选择建设了M个运动场。
该模型的目标函数包括两部分,第一部分是居民去运动场的成本,第二部分是建设运动场的成本。解的形式也主要包括两部分,一个为是否修建运动场的决策变量$Y_i$,另一个是居民是否选择运动场的决策变量$X_{ij}$,
并由$Y_j$最终决定$X_{ij}$。
第一部分的成本主要由最短距离决定,第二部分成本与位置点的度,和容量大小成正相关。
\\subsection{最短路模型建立}
在考虑居民从居民区到运动场的成本消耗时,我们将距离最短$C_{ij}$作为目标函数的一个重要因素,针对该问题我们采用的是图论中的
最短路算法Dijkstra求解。
V和E分别是图的定点集合$ V=\\{v_1,v_2,v_3……v_n\\}$;
图中边的集合$ E=\\{e_1,e_2,e_3……e_n\\}$;
图中起始点到定点的距离集合为$dis = \\{dis_1,dis_2,dis_3……dis_n\\} $;
Dijkstra算法采用的是一种贪心的策略,解决的是带权重的有向图上单源最短路径问题,改算法要求所有边的权重都为非负值。
Dijkstra算法在运行过程中维持的关键信息是一组节点集合$S$。从源节点$s$到集合中每一个节点间的最短路径已被找到。
算法重复从节点集$V-S$中选择最短路径估计最小的节点u,将u加入到集合$S$,然后对所有从u发出的边进行松弛\\cite{004}。
步骤为:初始时,原点 s 的路径权重被赋为 0 。若对于顶点 s 存在能直接到达的边E(s,m),则把$dis_m$设为w(s, m),同时把所有其他(s不能直接到达的)顶点的路径长度设为无穷大。初始时,集合S只有顶点s。
然后,从dis集合选择最小值,则该值就是源点s到该值对应的顶点的最短路径,并且把该点加入到S中,此时完成一个顶点,
然后,我们需要看看新加入的顶点是否可以到达其他顶点并且看看通过该顶点到达其他点的路径长度是否比源点直接到达短,如果是,那么就替换这些顶点在dis中的值。
然后,又从dis中找出最小值,重复上述动作,直到S中包含了图的所有顶点。
通过Dijkstra算法,求解得到了一个$18\\times18$的最短路矩阵$C_{ij}$。
\\subsection{双层模拟退火模型建立}
\\subsubsection{模拟退火算法}
模拟退火算法(SA)是一种通用的随机搜索算法,它来源于固体退火原理。将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小\\cite{006}。
SA算法用于解决组合优化问题的算法,物理中固体物质的退火过程与一般组合优化问题具有相似性。用固体退火模拟优化问题,将内能模拟为目标函数,温度演化为控制参数。
组台优化问题解空间巾的每一点都代表一个解.不同的解有着不同的成本函数值。所谓优化,
就是在解空问中寻找成本函数值最小(或最大)的解\\cite{002}。在解空间内结合概率特性寻找最优解。
模拟退火算法于初始值无关,并且具有收敛性,已经在理论上证明以一种概率1收敛于全区最优解。所需的几个控制参数为:
初始温度$T_0$:为了接近最优解,应该设置的较大,本文中设置$T_0 = 5000$;
温度降温系数$\\Delta T$:是一个小于1且接近的值,本文中设置为$\\Delta T = 0.95$;
最大迭代次数$ML$:最大迭代次数,令$ML = 400$;
当前迭代次数$NL$:对于每个T,当前迭代的次数;
迭代停止条件:本为中,当$NL\\geqslant ML$时,令程序迭代停止。
\\subsubsection{双层模拟退火算法解的更新方法}
模拟退火中其中的重要一步是解的更新,上文中提到,模型的解包括了两部分。因此我们的算法需要对模型分为两个层次进行求解。
双层模拟退火算法采用自下向上的求解过程,并采用模拟Metropolics准则,接受领域解,直到满足终止条件。
Metropolics准则常表示为\\cite{003}:
\\begin{equation}
p =
\\begin{cases}
1 & ,E_{n+1} < E_n\\\\
exp(-\\frac{E_{n+1} -E_n }{T} ) & ,E_{n+1} \\geqslant E_n
\\end{cases}
\\label{eq:Metropolics}
\\end{equation}
从\\cref{eq:Metropolics}式中可以看出,如果移动后可以获得更优解,总是接受新的解;如果不是最优解,则会以一个随着温度降低而减小的概率接受新的解,可以
避免限入局部最优,从而可以获得全局最优解。
外层的初始解,被选择建设运动场的集合为随机分配的4个点组成,例如F=\\{1,2,3,4\\}。该集合表示的含义为居民区1,2,3,4被选择建造运动场,
其他居民区不建造运动场。在每次更新集合的时候,采取的操作为:在未被选择的居民点集合中随机选择一个居民点,与集合F中的任一点进行交换。这样就完成了每次生成新的解。
对于内层来说,对于每一个新的外层集合,随机选择一个决策变量$X_{ij}$置为1,更新时,选择一个新的$j\\`'$,满足$X_{ij\\`'} =0$并且不会超过运动场的容量限制,
令新的$X_{ij\\`'} =1$,原来的$X_{ij\\`'} =0$替换原来的居民需求决策变量。更新时,内层退火算法的参数可以直接使用外层的退火参数。
\\subsubsection{双层模拟退火算法具体实现步骤}
(1)初始化:初始化温度$T_0$,温度降温系数$\\Delta T$,最大迭代次数$ML$,随机生成初始初始解。
(2)执行外层领域函数,得到新的运动场建造决策变量$Y_i$。
(3)以当前$Y_i$为最优解,执行内层邻域函数,得到新的居民区$i$选择运动场$j$的决策变量$X_{ij}$。
(4)如果内层新的选择的加权距离和优于内层最优解,更新内层最优解。
(5)如果内层新的选择的加权距离和优于内层选址旧解,更新内层旧解,否则在[0,1] 产生一个均匀分布的随机数 $e$,如果$e<p$($p$是前面定义的接受概率),也更新内层最优解。
(6)根据Metropolics准则,接受内层解则内层迭代次数加一,否则返回步骤(3)。
(7)如果内层迭代次数大于最大迭代次数,满足终止条件,返回外层,否则返回步骤(3)。
(8)如果当前的$Y_i$和$X_{ij}$目标函数总花费小于保存的全局最优解,更新全局最优解。
(9)如果新的外层建造运动场选址优于旧解,接受外层解,否则在区间 [0,1] 产生一个均匀分布的随机数 $e$,如果$e<p$,这种转移也将被接受。
(10)根据Metropolics准则,如果接受新的外层解,则温度下降,迭代次数加一,否则返回步骤(2)。
(11)如果迭代次数大于最大迭代次数,满足终止条件,算法结束,输出当前全局最优解,否则返回步骤(2)。
对于外层其算法实现流程图如\\cref{fig:001}所示。
\\FloatBarrier
\\begin{figure}
\\centering
\\includegraphics[scale=0.33]{1.png}
\\caption{外层算法流程图}
\\label{fig:001}
\\end{figure}
\\FloatBarrier
% \\FloatBarrier
% \\begin{figure}
% \\centering
% \\includegraphics[scale=0.4]{untitled.png}
% \\caption{最优解-迭代次数图像}
% \\label{fig:002}
% \\end{figure}
% \\FloatBarrier
% \\begin{figure}
% \\centering
% \\includegraphics[scale=0.5]{untitled1.png}
% \\caption{题目中结论在全部答案中的水平}
% \\label{fig:003}
% \\end{figure}
\\subsection{问题一}
基于上文中的模型,我们在$M=4$的情况下,对模型求解,解得目标函数$Z$的最优解为13467,选址的集合为\\{2,3,4,7\\}。
同时
得到居民地选择运动场的对应关系见\\cref{fig:xz4}、最短距离如\\cref{tab:result01}所示。
\\FloatBarrier
\\begin{table}[!htbp]
\\caption{建造4个运动场结果展示}\\label{tab:result01} \\centering
% \\resizebox{100mm}{70mm}{
\\begin{tabular}{ccccc}
% \\specialrule{10}{10}
\\toprule[1.5pt]
居民区下标$i$ & 运动场下标$j$ & 最短距离$C_{ij}$\\\\
\\midrule[1pt]
1 & 2 & 20 \\\\
2 & 2 & 0\\\\
3 & 3 & 0\\\\
4 & 4 & 0\\\\
5 & 4 & 18\\\\
6 & 4 & 18\\\\
7 & 7 & 0\\\\
8 & 4& 50\\\\
9 & 2 & 30\\\\
10 & 2 &28\\\\
11 & 2 & 30\\\\
12 & 3 & 20\\\\
13 & 3 & 48\\\\
14 & 3 & 26\\\\
15 & 4 & 42\\\\
16 & 3 & 38\\\\
17 & 4 & 48\\\\
18 & 7 & 34\\\\
\\bottomrule[1.5pt]
\\end{tabular}
% }
\\end{table}
% \\FloatBarrier
模拟退火求解过程中,目标函数值和迭代次数的关系如\\cref{fig:002-1}所示。
% \\FloatBarrier
\\begin{figure}
\\centering
\\begin{minipage}[c]{0.50\\textwidth}
\\centering
\\includegraphics[height=0.27\\textheight]{untitled.png}
\\subcaption{最优解-迭代次数图像}
\\label{fig:002-1}
\\end{minipage}
\\begin{minipage}[c]{0.49\\textwidth}
\\centering
\\includegraphics[height=0.27\\textheight]{untitled1.png}
\\subcaption{题目中原选址在全部选址方案中的水平}
\\label{fig:002-2}
\\end{minipage}
\\caption{结果展示}
\\label{fig:002}
\\end{figure}
\\FloatBarrier
\\subsection{问题二}
TOPSIS 法的基本原理借助于多目标决策问题的“理想解”和“负理想解”来排序,以确定各方案的优劣 “理
想解”是指一设想的最优解(理想方案)将各方案的理想解和负理想解作比较,若某一方案最接近理想解,
同时又远离负理想解,则这个方案最好,反正最差,我们可以通过这种方法评价原来的选址是否合理。\\cite{005}
为了分析原来的选址是否合理,我们结合Topsis优劣解距离法,定义原来的选址和最优选址的相对误差$Z$为
\\begin{equation}
Z=\\frac{C_x-C_{min}}{C_{max}-C_{min}}
\\label{eq:z}
\\end{equation}
在上述\\cref{eq:z}式中,$C_X$为原来的选址对应的目标函数值,$C_{min}$为最优选址对应的目标函数值,
$C_{max}$为原来的选址对应的目标函数值。
通过计算得到$Z=$ 0.1722,题目中的初始选址在全部选址中所处位置见\\cref{fig:002-2},图中红线为初始选址,
可见初始选址是一种较优的选法。
\\subsection{问题三}
问题三要求新增一个运动场。问题一所建立模型可以确定m个运动场的位置,而该问题可以归纳为已知m-1个运动场的位置,确定第m个运动场的位置。本质上还是最小化相关费用的前提下,从可选设施集合中确定设施的修建位置。所以仍延用问题一的模型,只是在选择设施位置的领域函数上稍加改动。具体方法如下:
1. 随机选择一个位置,加入运动场地址集合,作为最优解。初始化退火参数。
2. 迭代搜索最后一个运动场的坐标。
3. 在确定运动场位置的情况下,执行内层模拟退火算法,确定在该运动场选址方案的情况下,居民选址运动场的最优方案,最大限度地利于居民运动。
4. 如果当前建造成本和居民出行成本低于最优解,则更新最优解。
5. 返回第二步,直到达到循环终止条件。
\\begin{figure}
\\centering
\\includegraphics[width=.5\\textwidth]{graph2.png}
\\caption{选址4个运动场}
\\label{fig:xz4}
\\end{figure}
\\begin{figure}
\\centering
\\includegraphics[width=.5\\textwidth]{graph3.png}
\\caption{选址5个运动场}
\\label{fig:xz5}
\\end{figure}
因为本例中只有18个待选位置,由于已经确定了4个运动场的位置,新增一个运动场即为从14个待选地址中选择一个。该过程时间比较简单,所以直接使用迭代搜索,在最低计算开销下找到最优解。再不超过运动场容量限制的情况下,内层模拟退火算法为居民点分配对应的运动场,使得加权距离和最小。
\\begin{table}[!htbp]
\\caption{建造5个运动场结果展示}\\label{tab:result02} \\centering
\\begin{tabular}{ccccc}
\\toprule[1.5pt]
居民区下标$i$ & 运动场下标$j$ & 最短距离$C_{ij}$\\\\
\\midrule[1pt]
1 & 2 &20\\\\
2 & 2 & 0\\\\
3 &15 & 60\\\\
4 & 12 & 40\\\\
5 & 6 & 36\\\\
6 & 12& 58\\\\
7 & 6 & 68\\\\
8 & 6 &68\\\\
9 & 2 &30\\\\
10 & 2 & 28\\\\
11 &15 & 98\\\\
12 &15 & 80\\\\
13 &15 & 66\\\\
14 & 2& 52\\\\
15 &18 &68\\\\
16 &18 & 62\\\\
17 &18 & 32\\\\
18 &12 & 94\\\\
\\bottomrule[1.5pt]
\\end{tabular}
\\end{table}
在$M=5$的情况下,对模型求解,解的目标函数$Z$的最优解为13125,选址的集合为\\{ 2,6,12,15,18\\},结果如\\cref{tab:result02}所示。
\\section{模型的评价}
\\subsection{模型的局限与缺点}
P-中值模型 只以成本最低为目标函数,且为N-P难题,求得的是满意解;假设条件过多,影响模型的准确性。
该模型限定每个居民点的居民只能选择一个固定的运动场,其实从实际意义上来说,不同的人有不同的喜好,一般会选择多个运动场。
另外,目标函数只考虑成本最低,未涉及其它因素,如运动场的维护费用、运动场的利用率等。
\\subsection{模型的优点}
选址问题属于N-P难题,随着数据规模的增加,计算时间剧增。模拟退火及类似的启发式算法,正好解决了这一问题,模拟退火算法可以在较短时间内求得近似最优解。
单层模拟退火算法求解选址问题,寻找新解的时候,既要选址又要对分配选定的运动场供居民使用,解空间较大,收敛速度较慢。
而本文所使用的双层模拟退火算法,将求解过程分为两个部分,外层的设施选址以及内层的居民需求分配。该算法保证,每次求得的运动场选址方案下,居民人均离运动场的距离都为最优,加快了求解过程,提高了准确度。
该模型可以推广到求解运动场数目不确定的问题。只需要在外层搜索寻找新解的时候,不仅仅是替换运动场地址,还可以增加或者减少运动场。
\\begin{thebibliography}{9}%宽度9
\\bibitem[1]{001}
关怀庆,张毕西,欧江艳.贪婪取走启发式算法在离散网络选址中的研究[J].系 统 科 学 学 报,2010.
\\bibitem[2]{006}于宗艳. 基于人工免疫算法的故障诊断问题研究[D].大庆石油学院,2006.
\\bibitem[3]{004}Thomas H.Cormen,Charles E.Leiserson,Eonald L.Rivest.算法导论[M]. 北京:机械工业出版社,2006:383-384.
\\bibitem[4]{002}
姚新, 陈国良. 模拟退火算法及其应用[J]. 计算机研究与发展, 1990(7):1-6.
\\bibitem[5]{003} 吴哲, 徐圣伦, 杨春梅等. 切割路径优化问题的自适应大邻域搜索退火算法[J]. 重庆理工大学学报(自然科学), 2020, 第34卷(9):230-237,244.
\\bibitem[6]{005}卢方元. 一种改进的TOPSIS法[J]. 统计与决策, 2003(3): 78-79.Lu Fangyuan. An improved TOPSIS method[J]. Statistics and Decision-making, 2003(3): 78-79.
\\end{thebibliography}
\\begin{appendices}
\\section{matlab 主程序}
\\begin{lstlisting}[language=matlab]
clc; clear
a = [ 1 1 1 2 2 2 2 2 2 3 3 3 4 4 4 4 5 5 6 7 8 10 11 11 12 13 14 15 15 16 17];
b = [ 2 3 4 3 5 9 10 11 12 4 12 14 5 6 7 16 7 8 18 18 9 11 12 13 13 14 15 16 17 17 18];
w = [20 18 18 26 28 30 28 30 30 20 20 26 18 18 50 18 38 32 36 34 36 30 26 32 28 32 34 24 36 30 32];
G = graph(a, b, w);
deg = G.degree;
dist = distances(G); % 求最短路径,c(i, j)表示结点 i 到结点 j 的最短距离
m = 4; % 运动场个数
n = 18; % 居民点个数
v = ceil(normrnd(200, 20, 1, 18));% 运动场容量
cost = deg' + 2 * v + 5; % 运动场建设成本
d = [60 48 48 45 42 38 30 32 32 30 30 36 25 20 15 20 12 16]; % 居民点人数
k = 100; % 迭代次数因子
combination = nchoosek(1:n, m);
cmn = size(combination, 1);
% 多次搜索的最优解
ret = inf; % 最小开销
location = zeros(1, m); % 运动场选址
distribution = zeros(n, m); % 居民分布情况
search_path = zeros(1, k * m); % 局部最优解
fmax = -inf;
F = [2; 6; 12; 15];
Fv = inf;
for times = 1:100
%本次搜索的最优解
fval = inf;
best_x = [];
best_y = [];
%**************************初始化参数*******************************%
T = 500; % 初始温度
alpfa = 0.95; % 温度下降速率
f = inf; % 局部最优解
path = zeros(1, k * m); % 搜索路径
x = zeros(n, 1);
x(combination(randi(cmn), :)) = 1; % 随机生成初始解
%******************************************************************%
for iter = 1 : k * m
new_x = create_new_x(x);% 生成新解
new_c = cost * new_x;
% 确定运动场的情况下,使 加权距离最小
[new_t, new_y] = allocate_need(new_x, dist, T, v, d, n * m);
new_f = new_c + new_t;
if new_f < fval % 记录最优解
best_x = new_x;
best_y = new_y;
fval = new_f;
end
if new_f < f
f = new_f;
x = new_x;
else
r = rand();
if r < exp(-(new_f - f) / T) % 根据Metropolis准则计算一个概率
f = new_f;
x = new_x;
end
end
if new_f > fmax
fmax = new_f;
end
if all(find(new_x) == F) && new_f < Fv
Fv = new_f;
end
path(iter) = fval;
T = T * alpfa;
end
if fval < ret
ret = fval;
location = find(best_x);
distribution = best_y;
search_path = path;
end
end
disp('最低成本为:');
disp(ret);
disp('运动场坐标为:');
disp(location);
disp('运动场分配情况');
myprint(distribution, location, dist);
figure(1);
plot(1:k*m, search_path, 'b-');
% 增加一个运动场
[F, y, fval] = add_playground(dist, n, m, cost, d, v);
disp('新增运动场后:');
disp('运动场坐标为:');
disp(F);
disp('运动场分配情况:');
myprint(y, F, dist);
disp('最低成本为:');
disp(fval);
disp('误差百分比:');
disp((Fv - fval) / (fmax - fval));
\\end{lstlisting}
\\section{函数实现}
\\begin{lstlisting}[language=matlab]
%create_new_x
function new_x = create_new_x(old_x)
g = find(old_x == 1);
p = find(old_x == 0);
r1 = randi(size(g, 1));
r2 = randi(size(p, 1));
new_x = old_x;
t = new_x(g(r1));
new_x(g(r1)) = new_x(p(r2));
new_x(p(r2)) = t;
end
\\end{lstlisting}
\\begin{lstlisting}[language=matlab]
%create_new_y
function y = create_new_y(y)
r1 = randi(size(y, 1));
while 1
r2 = randi(size(y, 1));
if r2 ~= r1
break
end
end
t = y(r1, :); y(r1, :) = y(r2, :); y(r2, :) = t;
end
\\end{lstlisting}
\\begin{lstlisting}[language=matlab]
%check_y
function flag = check_y(y, v, d)
m = size(y, 2);
flag = 1;
for i = 1:m
if sum(d(y(:, i) == 1)) > v(i)
flag = 0;
break;
end
end
end
\\end{lstlisting}
\\begin{lstlisting}[language=matlab]
%init_y
function y = init_y(new_x, v, d)
n = size(d, 2);
m = sum(new_x);
y = zeros(n, m);
used = zeros(1, m);
vis = zeros(n, 1);
F = find(new_x == 1);
for i = 1: m % 有运动场的居民点就近选择
y(F(i), i) = 1;
used(i) = used(i) + d(F(i));
vis(F(i)) = 1;
end
for i = 1:n
if vis(i) == 1
continue
end
while 1
r = randi(m);
if used(r) + d(i) <= v(r)
y(i, r) = 1;
used(r) = used(r) + d(i);
break;
end
end
end
end
\\end{lstlisting}
\\begin{lstlisting}[language=matlab]
%myprint
function [] = myprint(y, F, dist)
n = size(y, 1);
ret = zeros(n, 3);
ret(:, 1) = 1:n;
for i = 1:n
ret(i, 2) = y(i, :) * F;
ret(i, 3) = dist(i, ret(i, 2));
end
disp(ret);
end
\\end{lstlisting}
\\begin{lstlisting}[language=matlab]
function [new_t, new_y] = allocate_need(new_x, dist, T, v, d, times)
F = find(new_x == 1);
% 分配资源s
y = init_y(new_x, v, d); %根据以确定的运动场地址,随机生成一个初始解
t = d * sum(dist(:, F) .* y, 2);
new_t = inf;
new_y = [];
for i = 1 : times
while 1
y1 = create_new_y(y);
flag = check_y(y1, v, d);
if flag == 1
break;
end
end
t1 = d * sum(dist(:, F) .* y1, 2);
if t1 < new_t
new_t = t1;
new_y = y1;
end
if t1 < t
t = t1;
y = y1;
else
r = rand();
if r < exp(-(t1 - t) / T) % 以一定概率接受新解
y = y1;
t = t1;
end
end
end
end
\\end{lstlisting}
\\begin{lstlisting}[language=matlab]
function [F, y, fval] = add_playground(dist, n, m, cost, d, v)
F = [2; 6; 12; 15; 0];
fval = inf;
y = [];
for i = 1:n
if logical(find(F == i))
continue;
end
F(m + 1) = i;
x = zeros(n, 1);
x(F) = 1;
T = 100; % 初始温度
alpfa = 0.95; % 温度下降速率
fmin = inf;
y2 = [];
for iter = 1 : 1000
[t1, y1] = allocate_need(x, dist, T, v, d, 100);
ff = t1 + cost * x;
if ff < fmin
fmin = ff;
y2 = y1;
end
T = alpfa * T;
end
if fmin < fval
fval = fmin;
y = y2;
end
end
end
\\end{lstlisting}
\\end{appendices}
\\end{document}
以上是关于数学建模校赛latex文档的主要内容,如果未能解决你的问题,请参考以下文章