《数学建模算法与应用》司守奎著 阅读笔记。
一、线性规划
线性规划:在一组线性约束条件的限制下,求一线性目标函数的最大或最小值
一般标准型:
Matlab标准型:
Matlab求解线性规划的命令为:
[
可转化为线性规划的问题:
取,
二、整数规划
整数规划分为两大类:1)变量全限制为整数,纯整数规划;2)变量部分限制为整数,混合整数规划。
注:整数规划的最优解不能按照实数最优解简单取整而获得。
2.1 0-1型整数规划
0-1型整数规划是将某些变量
1)相互排斥的约束条件规划问题:
如果有
由于
引入一个充分大的常数
由(7)式知,当
2)固定费用问题和指派问题
见书P13,P14 ,不太好统一形式,不过多赘述了。。
2.2 蒙特卡洛法(随机取样法)
蒙特卡洛法是基于大量事件的统计结果来实现一些确定性问题的计算方法。
下面举一个实际编程案例:
例:
解:随机实验的思想为,在
clc
非线性整数规划问题:
非线性规划问题尚未具备一种通用成熟且准确的求解方法,但由于加入了整数限制,则非线性规划问题的解的个数也变为了有限个,有了蒙特卡洛法后,我们则可以用枚举法求出满意解。
具体编程案例见书P15。
2.3 整数线性规划的计算机求解
Matlab下混合整数线性规划的标准型为:
其中
Matlab求解整数线性规划的命令:
[
三、非线性规划
非线性规划:目标函数或约束条件包含非线性函数的规划问题。
非线性规划的数学模型一般形式:
其中:
注:若线性规划问题的最优解存在,则此最优解只能在可行域的边界上达到;而非线性规划的最优解可能在可行域的任意一点达到。
Matlab下非线性规划的标准形式:
其中
Matlab求解此标准型非线性规划问题的命令为:
[
其中,fun为用M文件定义的目标函数
3.1 无约束极值问题
无约束极值问题:即没有约束条件,仅求解目标函数极值的优化问题。
其数学模型可简单的表示为:
在Matlab中有两个专用函数求解该极小值问题,fminunc 和 fminsearch。
Matlab中 fminunc的基本命令:
[
其中:fun是用M文件定义的函数。当fun只有一个返回值时,是函数值
Matlab中 fminsearch的基本命令:
[
注:fminsearch只能求给定初始值附件的一个极小值点。
3.2 约束极值问题
约束极值问题:带约束条件的极值问题,又称规划问题。
3.2.1 二次规划
二次规划问题:目标函数为自变量
Matlab中二次规划的数学模型标准形式:
其中:
Matlab中求解二次规划的命令是:
[
(具体细节可参考Matlab命令窗口中运行 help quadprog 后的“帮助”文档)
3.2.2 罚函数法
罚函数法: 将带约束的非线性规划问题,转化为一系列无约束极值问题。
(类似于拉格朗日乘数法,但也区别于拉格朗日乘数法)
罚函数法求解非线性规划问题的思想是,利用问题中的约束函数作出适当的罚函数,由此构造出带参数的增广目标函数,把问题转化为无约束非线性规划问题。
外罚函数法的例子:
取一个充分大的数
不难看出,为了让增广目标函数
3.3 Matlab求解约束极值问题
1.fminbnd 函数
求单变量非线性函数在区间上的极小值:
Matlab的命令为:
[
该命令中,fun为用M文件定义的单变量数学函数。
2. fseminf 函数
求含附加变量标量函数约束的非线性规划问题:
其形式与非线性规划标准形式(11)式类似,而其中
上述问题的Matlab求解命令为:
[
其中,ntheta是半无穷约束
3. fminimax 函数
求解
Matlab的求解命令为:
[
3.4 Matlab优化工具箱的图形界面解法
Matlab优化工具箱的optimtool命令提供了优化问题的用户图像界面解法。
具体操作步骤见书P32
四、 图与网络模型及其方法
图论中所谓的"图"是指某类具体事物的这些事物之间的联系。如果用点表示这些具体事物,用连接两点的线段(直的或曲的)表示两个事物的特定联系,就得到了描述这个"图"的几何形象。
4.1 图的基本概念与数据结构
4.1.1 基本概念
平面上有
有向图: 各边都包含方向的图结构。
无向图:各边都不含方向的图结构。
混合图:有的边有方向,有的边无方向的图结构。
简单图:任两顶点间最多有一条边,且每条边的两个端点皆不重合的图结构。
完全图:如果图的两顶点间有边相连则称两顶点相邻,每一对顶点都相邻的图称为完全图,否则为非完全图。
二分图:若顶点集
度: 设点
道路:设
迹、轨道、圈:各边相异的道路称为迹;各顶点相异的道路称为轨道,可记作
连通图、Hamilton轨、Hamilton圈、Hamilton图:图中任两顶点之间都存在道路的图,称为连通图。图中含有所有顶点的轨道称为Hamilton轨;闭合的Hamilton轨称为Hamilton圈;含有Hamilton圈的图称为Hamilton图。
距离:称两顶点
赋权图:每条边上都有一个(或多个)实数对应的图,这个(些)实数称为这条边的权。
4.1.2 图与网络的数据结构(表示法)
为了在计算机上实现网络优化的算法,首先必须有一种方法(即数据结构)在计算机上描述图与网络。
计算机上图与网络的表示方法主要有两种:邻接矩阵表示法和稀疏矩阵表示法。
设
1.邻接矩阵表示法
邻接矩阵是表示顶点之间相邻关系的矩阵,邻接矩阵记为
缺点: 当图的边数
2.稀疏矩阵表示法
稀疏矩阵是指矩阵中零元素很多,非零元素很少的矩阵。
稀疏矩阵只需存储非零元素的位置,即(非零元素的行地址,非零元素的列地址,非零元素的值)
在有向图中,Matlab可直接使用sparse命令将邻接矩阵转化为稀疏矩阵表示方式。
在无向图中,Matlab只需存储邻接矩阵的下三角元素,因为邻接矩阵为对称矩阵。
稀疏矩阵只是一种存储形式,使用时通过full命令变回普通矩阵。
4.2 最短路径问题
4.2.1 指定顶点到其他各顶点之间的最短路径
问题描述:给出一个赋权图网络结构,每边上的权代表两顶点间的距离,求出指定起点到其他各顶点的最短路径。
迪克斯特拉(Dijkstra)算法
原书的算法描述不太好懂,用更通俗的描述记录一下。。。
Dijkstra算法是一种贪心的策略,简单来说就是从起点开始,找到与其路径最短的点并存储进已找出最短路径的顶点集合
具体过程先看如下示例: (来源:Dijkstra算法原理)
![9cfd2c033597c6adc76202f318472a64.png](https://img-blog.csdnimg.cn/img_convert/9cfd2c033597c6adc76202f318472a64.png)
求
![828c64c1cf2d1f314a1654a952624796.png](https://img-blog.csdnimg.cn/img_convert/828c64c1cf2d1f314a1654a952624796.png)
现在再看原书中的算法描述:
设图
初始时,
(1) 对每个
更新所有
(2) 令
(3) 直到
为避免重复计算,算法过程中采用标号法,当
该算法在Matlab中的具体实现为:
从起点sb到终点db的Dijkstra算法程序:
function
4.2.2 每对顶点之间的最短路径
Dijkstra算法可计算指定顶点到其他各顶点的最短路径,若要计算赋权图中所有顶点两两成对的最短路径,则需要对每个顶点循环调用Dijkstra算法求出以该点为起点到其余各点的最短路径。但这样的方法需要执行n-1次,时间复杂度为
另一种解决每对顶点之间最短路径的算法为——Floyd算法。
对于赋权图
式中,
对于无向图,
Floyd算法的基本思想是递推产生一个矩阵序列
计算时用迭代公式
最后,当
Matlab通用解法,起点sb到终点db通用的Floyd算法程序如下:
function[dist, mypath]
4.3 最小生成树问题
树:连通的无圈图称为树,记作
最小生成树:在连通赋权图上求权值和最小的生成树,称为最小生成树。
最小生成树的两种常用求解算法:prim算法、Kruskal算法。
4.3.1 prim算法
prim算法的基本思路为贪心的寻找当前最小权值的边,递归地将所有顶点包含。
prim算法定义两个集合P和Q,其中P存放G中最小生成树的顶点,Q存放G中最小生成树的边。初始时,
prim算法流程:
①
② while
end
4.3.2 Kruskal算法
Kruskal算法流程如下:
① 选择
② 若
-
中无圈;
-
是
中权值最小的边。
③ 直到选得
4.4 最大流问题
网络: 给一个有向图
流: 指定义在弧集合
可行流:可行流需要满足两种约束条件:容量限制条件和流量平衡条件
① 容量限制条件: 对每一弧
②流量平衡条件:
中间点
发点
收点
则,最大流问题可以写为如下的线性规划模型:
4.4.1 最小费用最大流问题
给定网络
其中:
4.4.2 Matlab工具箱求解最大流问题
最大流问题和最小费用最大流问题均可以通过Matlab工具箱进行求解。
Matlab图论工具箱的命令见下表。
命令名 | 功能 |
---|---|
graphallshortestpaths | 求图中所有顶点对之间的最短距离 |
graphconncomp | 找无向图的连通分支,或有向图的强(弱)连通分支 |
graphisdag | 测试有向图是否含有圈,不含圈返回1,否则返回0 |
graphisomorphism | 确定两个图是否同构,同构返回1,否则返回0 |
graphisspantree | 确定一个图是否是生成树,是返回1,否则返回0 |
graphmaxflow | 计算有向图的最大流 |
graphminspantree | 在图中找最小生成树 |
graphpred2path | 把前驱顶点序列变成路径的顶点序列 |
graphshortestpath | 求图中指定一对顶点间的最短距离和最短路径 |
graphtopoorder | 执行有向无圈图的拓扑排序 |
graphtraverse | 求从一顶点出发,所能遍历图中的顶点 |