数学建模十大算法总结.doc_第1页
数学建模十大算法总结.doc_第2页
数学建模十大算法总结.doc_第3页
数学建模十大算法总结.doc_第4页
数学建模十大算法总结.doc_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

建模十大算法总结: 1、蒙特卡罗算法。该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时通过模拟可以来检验自己模型的正确性。 2、数据拟合、参数估计、插值等数据处理算法。比赛中通常会遇到大量的数据需要处理,而处理数据的关键就在于这些算法,通常使用Matlab作为工具。 3、线性规划、整数规划、多元规划、二次规划等规划类问题。建模竞赛大多数问题属于最优化问题,很多时候这些问题可以用数学规划算法来描述,通常使用Lindo、Lingo、MATLAB软件实现。 4、图论算法。这类算法可以分为很多种,包括最短路、网络流、二分图等算法,涉及到图论的问题可以用这些方法解决,需要认真准备。 5、动态规划、回溯搜索、分治算法、分支定界等计算机算法。这些算法是算法设计中比较常用的方法,很多场合可以用到竞赛中。 6、最优化理论的三大非经典算法:模拟退火法、神经网络、遗传算法。这些问题是用来解决一些较困难的最优化问题的算法,对于有些问题非常有帮助,但是算法的实现比较困难,需慎重使用。 7、网格算法和穷举法。网格算法和穷举法都是暴力搜索最优点的算法,在很多竞赛题中有应用,当重点讨论模型本身而轻视算法的时候,可以使用这种暴力方案,最好使用一些高级语言作为编程工具。 8、一些连续离散化方法。很多问题都是实际来的,数据可以是连续的,而计算机只认的是离散的数据,因此将其离散化后进行差分代替微分、求和代替积分等思想是非常重要的。 9、数值分析算法。如果在比赛中采用高级语言进行编程的话,那一些数值分析中常用的算法比如方程组求解、矩阵运算、函数积分等算法就需要额外编写库函数进行调用。 10、图象处理算法。赛题中有一类问题与图形有关,即使与图形无关,论文中也应该要不乏图片的,这些图形如何展示以及如何处理就是需要解决的问题,通常使用Matlab进行处理。 从历年竞赛题来看,常用的方法:线性规划 整数规划 非线性规划 动态规划 层次分析法图论方法 拟合方法 插值方法 随机方法 微分方程方法一、蒙特卡洛算法1、含义的理解以概率和统计理论方法为基础的一种计算方法。也称统计模拟方法,是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法,它是将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样,以获得问题的近似解。 2、算法实例(有很多相似的例题,包括平行线等)在数值积分法中,利用求单位圆的1/4的面积来求得Pi/4从而得到Pi。单位圆的1/4面积是一个扇形,它是边长为1单位正方形的一部分。只要能求出扇形面积S1在正方形面积S中占的比例K=S1/S就立即能得到S1,从而得到Pi的值。怎样求出扇形面积在正方形面积中占的比例K呢?一个办法是在正方形中随机投入很多点,使所投的点落在正方形中每一个位置的机会相等看其中有多少个点落在扇形内。将落在扇形内的点数m与所投点的总数n的比m/n作为k的近似值。P落在扇形内的充要条件是 。已知:K=,K,s=1,s1=,求Pi。由,知s1=,而s1=,则Pi=程序:(该算法可以修改后用Mathematica计算或者Matlab)/* 利用蒙特卡洛算法近似求圆周率Pi*/ /*程序使用:VC+6.0 */ #include #include #include #define COUNT 800 /*循环取样次数,每次取样范围依次变大*/ void main() double x,y; int num=0; int i; for(i=0;iCOUNT;i+) x=rand()*1.0/RAND_MAX;/*RAND_MAX=32767,包含在中*/y=rand()*1.0/RAND_MAX;if(x*x+y*y)Axis,Plota1,x,0,60结果:-3.68428+2.38529 x-0.0934637 x2+0.00132433 x3(2)参数估计(参考书:概率论与数理统计)参数估计为统计推断的基本问题,分为点估计和区间估计。点估计:矩估计法X连续型随机变量,概率密度X为离散型随机变量 分布律为待估参数,是来自X的样本,假设总体X的前阶矩存在,为(X连续型)或(X离散型)(其中是X可能取值的范围)。一般来说,它们是的函数。基于样本矩依概率收敛于相应的总体矩,样本矩的连续函数依概率收敛于相应的总体矩的连续函数,我们就用样本矩作为相应的总体矩的估计量,而以样本矩的连续函数作为相应的总体矩的连续函数的估计量。这种估计方法成为矩估计法。最大似然估计法X连续型随机变量 似然函数 其中是来自X的样本的联合密度。X为离散型随机变量 似然函数 其中是来自X的样本的联合分布律。若则称为的最大似然估计值,称为的最大似然估计量。这样,确定最大似然估计量的问题就归结为微分学中的求最大值的问题了。估计量的评选标准为:(1)无偏性(2)有效性(3)相合性区间估计:对于一个未知量,人们在测量或计算时,常不以得到近似值为满足,还需要估计误差,即要求知道近似值的精确程度(亦即所求真值所在的范围)。这样的范围常以区间的形式给出,同时还给出此区间包含参数真值的可信度,这种形式的估计称为区间估计,这样的区间即所谓置信区间。正态总体均值、方差的置信区间与单侧置信限(置信水平为1-)一个正态总体未知参数其他参数枢轴量的分布置信区间已知未知未知另外还包括两个正态总体的情况,其他区间估计:(0-1)分布参数的区间估计(3)插值1、含义的理解在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值(与拟合的不同点在于拟合的函数不需通过每一个离散点)。插值问题的提法是:假定区间a,b上的实值函数f(x)在该区间上 n1个互不相同点x0,x1xn 处的值是f x0,f(xn),要求估算f(x)在a,b中某点的值。其做法是:在事先选定的一个由简单函数构成的有n1个参数C0,C1,Cn的函数类(C0,C1,Cn)中求出满足条件P(xi)f(xi)(i0,1, n)的函数P(x),并以P()作为f()的估值。此处f(x)称为被插值函数,x0,x1,xn称为插值结(节)点,(C0,C1,Cn)称为插值函数类,上面等式称为插值条件,(C0,Cn)中满足上式的函数称为插值函数,R(x) f(x)P(x)称为插值余项。当估算点属于包含x0,x1xn的最小闭区间时,相应的插值称为内插,否则称为外插。2、基本类型多项式插值在一般插值问题中,若选取为n次多项式类,由插值条件可以唯一确定一个n次插值多项式满足上述条件。拉格朗日插值和牛顿插值都属于多项式插值。拉格朗日插值:设连续函数y = f(x)在a, b上对给定n + 1 个不同结点:分别取函数值其中 (1)试构造一个次数不超过 n的插值多项式 (2) 使之满足条件 (3)构造n次多项式 使 = (4) 由 (5)即 满足插值条件,于是问题归结为具体求出基本插值多项式。根据(4)式以外所有的节点都是的根,因此令 又由=1,得: 所以有 代入(5)得 拉格朗日插值多项式为: 牛顿插值:(拉格朗日插值的缺点)拉格朗日插值公式的形式虽然有一定的规律, 但是当增加一个节点时,不仅要增加项数,而且以前各项也必须重新全部计算,不能利用已有的结果。为克服这一缺点,我们取用另一种形式牛顿插值公式。牛顿插值公式中用到了差商。一般称:为在处的n阶差商。差商可列表计算:xi yi 一阶差商 二阶差商 三阶差商 四阶差商 x0 f (x0)x1 f (x1) f x0, x1x2 f (x2) f x1, x2 f x0, x1, x2x3 f (x3) f x2, x3 f x1, x2, x3 f x0, x1, x2, x3x4 f (x4) f x3, x4 f x2, x3, x4 f x1, x2, x3, x4 f x0, x4由差商定义可知由差商定义可求得记 则其中称为n次牛顿插值多项式,是截断误差。最终我们可以证明满足插值条件 因此有 牛顿插值公式的优点是:当增加一个节点时,只要再增加一项就行了,即有递推式当然,与拉格朗日插值相比它还有节省运算次数的优点(尤其是节省乘法运算次数)。分段插值与样条插值为了避免高次插值可能出现的大幅度波动现象,在实际应用中通常采用分段低次插值来提高近似程度埃尔米特插值许多实际插值问题中,为使插值函数能更好地和原来的函数重合,不但要求二者在节点上函数值相等,而且还要求相切,对应的导数值也相等,甚至要求高阶导数也相等。这类插值称作切触插值,或埃尔米特(Hermite)插值。满足这种要求的插值多项式就是埃尔米特插值多项式 三角函数插值当被插函数是以2为周期的函数时,通常用n阶三角多项式作为插值函数,并通过高斯三角插值表出。三、线性规划、整数规划、多元规划、二次规划(1)线性规划1、含义的理解线性规划是运筹学中研究较早、发展较快、应用广泛、方法较成熟的一个重要分支,它是辅助人们进行科学管理的一种数学方法.研究线性约束条件下线性目标函数的极值问题的数学理论和方法,英文缩写LP。它是运筹学的一个重要分支。在经济管理、交通运输、工农业生产等经济活动中,提高经济效果是人们不可缺少的要求,而提高经济效果一般通过两种途径:一是技术方面的改进,例如改善生产工艺,使用新设备和新型原材料.二是生产组织与计划的改进,即合理安排人力物力资源.线性规划所研究的是:在一定条件下,合理安排人力物力等资源,使经济效果达到最好.一般地,求线性目标函数在线性约束条件下的最大值或最小值的问题,统称为线性规划问题。满足线性约束条件的解叫做可行解,由所有可行解组成的集合叫做可行域。决策变量、约束条件、目标函数是线性规划的三要素。2、线性规划问题的数学模型的一般形式和模型建立(1)列出约束条件及目标函数 (2)画出约束条件所表示的可行域 (3)在可行域内求目标函数的最优解及最优值(实际问题中建立数学模型一般有以下三个步骤:根据影响所要达到目的的因素找到决策变量;2.由决策变量和所在达到目的之间的函数关系确定目标函数;3.由决策变量所受的限制条件确定决策变量所要满足的约束条件。)所建立的数学模型具有以下特点:(1)、每个模型都有若干个决策变量(x1,x2,x3,xn),其中n为决策变量个数。决策变量的一组值表示一种方案,同时决策变量一般是非负的。(2)、目标函数是决策变量的线性函数,根据具体问题可以是最大化(max)或最小化(min),二者统称为最优化(opt)。(3)、约束条件也是决策变量的线性函数。当我们得到的数学模型的目标函数为线性函数,约束条件为线性等式或不等式时称此数学模型为线性规划模型。3、实例生产计划问题问题:某企业要在计划期内安排生产甲、乙两种产品,这个企业现有的生产资料是:设备18台时,原材料A :4吨,原材料 B: 12吨;已知单位产品所需消耗生产资料及利润如下表。问应如何确定生产计划使企业获利最多? 产品资源甲乙资源量设备/台时3218原料A/吨104原料B/吨0212单位赢利/万元35设x1为甲产品分配的设备台数,x2为乙产品分配的台数。则条件限制为:3*x1+2*x2181*x1+0*x240*x1+2*x212x10,x20求max z=3*x1+5*x2用lingo编程,程序如下:max=3*x1+5*x2;3*x1+2*x2=18;x1=4;x2=0;x2=0;结果为:Global optimal solution found.Objective value: 36.00000Total solver iterations: 1 Variable Value Reduced Cost X1 2.000000 0.000000 X2 6.000000 0.000000 Row Slack or Surplus Dual Price 1 36.00000 1.000000 2 0.000000 1.000000 3 2.000000 0.000000 4 0.000000 3.000000 5 2.000000 0.000000 6 6.000000 0.000000即在x1=2,x2=6时,企业获利最多,为36万元。4、线性规划的应用在企业的各项管理活动中,例如计划、生产、运输、技术等问题,线性规划是指从各种限制条件的组合中,选择出最为合理的计算方法,建立线性规划模型从而求得最佳结果. 广泛应用于军事作战、经济分析、经营管理和工程技术等方面。为合理地利用有限的人力、物力、财力等资源作出的最优决策,提供科学的依据。(2)整数规划一类要求问题的解中的全部或一部分变量为整数的数学规划。从约束条件的构成又可细分为线性,二次和非线性的整数规划。 在线性规划问题中,有些最优解可能是分数或小数,但对于某些具体问题,常要求某些变量的解必须是整数。例如,当变量代表的是机器的台数,工作的人数或装货的车数等。为了满足整数的要求,初看起来似乎只要把已得的非整数解舍入化整就可以了。实际上化整后的数不见得是可行解和最优解,所以应该有特殊的方法来求解整数规划。在整数规划中,如果所有变量都限制为整数,则称为纯整数规划;如果仅一部分变量限制为整数,则称为混合整数规划。整数规划的一种特殊情形是0-1规划,它的变数仅限于0或1。不同于线性规划问题,整数和0-1规划问题至今尚未找到一般的多项式解法。组合最优化通常都可表述为整数规划问题。两者都是在有限个可供选择的方案中,寻找满足一定约束的最好方案。有许多典型的问题反映整数规划的广泛背景。例如,背袋(或装载)问题、固定费用问题、和睦探险队问题(组合学的对集问题)、有效探险队问题(组合学的覆盖问题)、旅行推销员问题, 车辆路径问题等。因此整数规划的应用范围也是极其广泛的。它不仅在工业和工程设计和科学研究方面有许多应用,而且在计算机设计、系统可靠性、编码和经济分析等方面也有新的应用。整数规划是从1958年由R.E.戈莫里提出割平面法之后形成独立分支的 。解整数规划最典型的做法是逐步生成一个相关的问题,称它是原问题的衍生问题。对每个衍生问题又伴随一个比它更易于求解的松弛问题(衍生问题称为松弛问题的源问题)。通过松弛问题的解来确定它的源问题的归宿,即源问题应被舍弃,还是再生成一个或多个它本身的衍生问题来替代它。随即再选择一个尚未被舍弃的或替代的原问题的衍生问题,重复以上步骤直至不再剩有未解决的衍生问题为止。目前比较成功又流行的方法是分枝定界法和割平面法,它们都是在上述框架下形成的。0-1规划在整数规划中占有重要地位,一方面因为许多实际问题,例如指派问题、选地问题、送货问题都可归结为此类规划,另一方面任何有界变量的整数规划都与0-1规划等价,用0-1规划方法还可以把多种非线性规划问题表示成整数规划问题,所以不少人致力于这个方向的研究。求解0-1规划的常用方法是分枝定界法,对各种特殊问题还有一些特殊方法,例如求解指派问题用匈牙利方法就比较方便。(4)二次规划二次规划是非线形规划中一类特殊的数学规划问题,它的解是可以通过求解得到的。通常通过解其库恩塔克条件(KT条件),获取一个KT条件的解称为KT对,其中与原问题的变量对应的部分称为KT点。二次规划分为凸二次规划与非凸二次规划,前者的KT点便是其全局极小值点,而后者的KT点可能连局部极小值点都不是。若它的目标函数是二次函数,则约束条件是线性的。由于求解二次规划的方法很多,所以较为复杂;其较简便易行的是沃尔夫法,它是依据库恩塔克条件,在线性规划单纯形法的基础上加以修正而成的。此外还有莱姆基法、毕尔法、凯勒法等。四、图论:(参考资料:建模教程(图与网络)(1)含义的理解图论是专门研究图的理论的一门数学分支,属于离散数学范畴,与运筹学有交叉。图论中常用点和点之间的线所构成的图,反映实际生产和生活中的某些特定对象之间的特定关系。一般来说,通常用点表示研究对象、用点与点之间的线表示研究对象之间的特定关系。 在一般情况下,图中的相对位置如何,点与点之间线的长短曲直,对于反映研究对象之间的关系,显的并不重要。 因此,图论中的图与几何图,工程图等本质上是不同的。(2)历史(包括应用范围)它有200多年历史,大体可划分为三个阶段:第一阶段是从十八世纪中叶到十九世纪中叶,处于萌芽阶段,多数问题围游戏而产生,最有代表性的工作是所谓的Euler七桥问题,即一笔画问题。第二阶段是从十九世纪中叶到二十世纪中叶,这时,图论问题大量出现,如Hamilton问题,地图染色的四色问题以及可平面性问题等,这时,也出现用图解决实际问题,如Cayley把树应用于化学领域,Kirchhoff用树去研究电网络等.第三阶段是二十世纪中叶以后,由生产管理、军事、交通、运输、计算机网络等方面提出实际问题,以及大型计算机使大规模问题的求解成为可能,特别是以Ford和Fulkerson建立的网络流理论,与线性规划、动态规划等优化理论和方法相互渗透,促进了图论对实际问题的应用。算法重要的算法 1、求有向图的强连通分支 (Strongerst Connected Component)(1)Kosaraju算法(2)Gabow算法(3)Tarjan算法2、求最小生成树 (Minimal Spanning Trees)(1)Kruskal算法(2)Prim算法3、最小树形图(1)朱永津刘振宏算法4、最短路径问题(1)SSSP(Single-source Shortest Paths)Dijkstra算法Bellman-Ford算法(SPFA算法)(2)APSP(All-pairs Shortest Paths)Floyd-Warshall算法Johnson算法5、网络流问题(1)最大网络流增广路算法Ford-Fulkerson算法Edmonds-Karp算法最短路径增殖EK-2(MPLA)Dinic预流推进算法(2)最小费用流6、图匹配问题(1)匈牙利算法(2)Hopcroft Karp算法(3)Kuhn-Munkres算法(4)Edmonds blossom-contraction 算法(有关资料网址:/index.php/%E5%9B%BE%E8%AE%BA)(1) 基本概念无向图一个无向图(undirected graph)是由一个非空有限集合和中某些元素的无序对集合构成的二元组,记为。其中称为图的顶点集(vertex set)或节点集(node set), 中的每一个元素称为该图的一个顶点(vertex)或节点(node);称为图的边集(edge set),中的每一个元素(即中某两个元素的无序对)记为或 ,被称为该图的一条从到的边(edge)。当边时,称为边的端点,并称与相邻(adjacent);边称为与顶点关联(incident)。如果某两条边至少有一个公共端点,则称这两条边在图中相邻。边上赋权的无向图称为赋权无向图或无向网络(undirected network)。我们对图和网络不作严格区分,因为任何图总是可以赋权的有向图一个有向图(directed graph或 digraph)是由一个非空有限集合和中某些元素的有序对集合构成的二元组,记为。其中称为图的顶点集或节点集, 中的每一个元素称为该图的一个顶点或节点;称为图的弧集(arc set),中的每一个元素(即中某两个元素的有序对)记为或,被称为该图的一条从到的弧(arc)。当弧时,称为的尾(tail),为的头(head),并称弧为的出弧(outgoing arc),为的入弧(incoming arc)。对应于每个有向图,可以在相同顶点集上作一个图,使得对于的每条弧,有一条有相同端点的边与之相对应。这个图称为的基础图。反之,给定任意图,对于它的每个边,给其端点指定一个顺序,从而确定一条弧,由此得到一个有向图,这样的有向图称为的一个定向图。完全图、二分图每一对不同的顶点都有一条边相连的简单图称为完全图(complete graph)。个顶点的完全图记为。若,(这里表示集合中的元素个数),中无相邻顶点对,中亦然,则称为二分图(bipartite graph);特别地,若,则,则称为完全二分图,记成。最短路、网络流、二分图1、 最短路问题(SPPshortest path problem)最短路径问题是图论中十分重要的最优化问题之一,它作为一个经常被用到的基本工具,可以解决生产实际中的许多问题,比如城市中的管道铺设,线路安排,工厂布局,设备更新等等。也可以用于解决其它的最优化问题。若网络中的每条边都有一个数值(长度、成本、时间等),则找出两节点(通常是源节点和阱节点)之间总权和最小的路径就是最短路问题。最短路问题是网络理论解决的典型问题之一,可用来解决管路铺设、线路安装、厂区布局和设备更新等实际问题。最短路问题,我们通常归属为三类单源最短路径问题包括起点的最短路径问题,确定终点的最短路径问题(与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全相同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。)确定起点终点的最短路径问题即已知起点和终点,求两点之间的最短路径。全局最短路径问题求图中所有的最短路径。算法只要采用Floyed-Warshall算法(这是弗洛伊德利用动态规划(dynamic programming)的原理设计的一个高效算法)。Floyed-Warshall 算法用来找出每对点之间的最短距离。它需要用邻接矩阵来储存边,这个算法通过考虑最佳子路径来得到最佳路径。 注意单独一条边的路径也不一定是最佳路径。 从任意一条单边路径开始。所有两点之间的距离是边的权,或者无穷大,如果两点之间没有边相连。 对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。如果是更新它。 不可思议的是,只要按排适当,就能得到结果。最短路算法:Dijkstra算法Dijkstra复杂度是O(N2),如果用binary heap优化可以达到O(E+N)logN),用fibonacci heap可以优化到O(NlogN+E) 其基本思想是采用贪心法,对于每个节点vi,维护估计最短路长度最大值,每次取出一个使得该估计值最小的t,并采用与t相连的边对其余点的估计值进行更新,更新后不再考虑t。在此过程中,估计值单调递减,所以可以得到确切的最短路。 Dijkstra 程序: void Dijkstra() for(int i=1;i=n;i+) disi = map1i; int k; for(int i=1;in;i+) int tmin = maxint; for(int j=1;j disj ) tmin = disj; k = j; usedk = 1; for(int j=1;j=n;j+) if( disk + mapkj disj ) disj = disk + mapkj; printf(%d,disn);/* 求1到N的最短路,disi 表示第i个点到第一个点的最短路 By Ping*/还有其他算法:Floyd-Warshall算法 Bellman-Ford算法 Johnson算法实例:某公司在六个城市中有分公司,从到的直接航程票价记在下述矩阵的位置上。(表示无直接航路),请帮助该公司设计一张城市到其它城市间的票价最便宜的路线图。用矩阵(为顶点个数)存放各边权的邻接矩阵,行向量、分别用来存放标号信息、标号顶点顺序、标号顶点索引、最短通路的值。其中分量; 存放始点到第点最短通路中第顶点前一顶点的序号; 存放由始点到第点最短通路的值。求第一个城市到其它城市的最短路径的Matlab程序如下:clear;clc;M=10000;a(1,:)=0,50,M,40,25,10;a(2,:)=zeros(1,2),15,20,M,25;a(3,:)=zeros(1,3),10,20,M;a(4,:)=zeros(1,4),10,25;a(5,:)=zeros(1,5),55;a(6,:)=zeros(1,6);a=a+a;pb(1:length(a)=0;pb(1)=1;index1=1;index2=ones(1,length(a);d(1:length(a)=M;d(1)=0;temp=1;while sum(pb)=2 index=index(1); end index2(temp)=index;endd, index1, index2 运行结果为:d = 0 35 45 35 25 10index1 = 1 6 5 2 4 3index2 = 1 6 5 6 1 1即:d(最短通路的值)03545352510index1(标号顶点顺序)165243index2(标号顶点索引)1656112、 网络流(1)含义的理解网络流(network flows)是图论中的一种理论与方法,研究网络上的一类最优化问题 。(2) 历史及应用1955年 ,T.E. 哈里斯在研究铁路最大通量时首先提出在一个给定的网络上寻求两点间最大运输量的问题。1956年,L.R. 福特和 D.R. 富尔克森等人给出了解决这类问题的算法,从而建立了网络流理论。所谓网络或容量网络指的是一个连通的赋权有向图 D (V、E、C) , 其中V 是该图的顶点集,E是有向边(即弧)集,C是弧上的容量。此外顶点集中包括一个起点和一个终点。网络上的流就是由起点流向终点的可行流,这是定义在网络上的非负函数,它一方面受到容量的限制,另一方面除去起点和终点以外,在所有中途点要求保持流入量和流出量是平衡的。 最大流理论是由福特和富尔克森于 1956 年创立的 ,他们指出最大流的流值等于最小割(截集)的容量这个重要的事实,并根据这一原理设计了用标号法求最大流的方法,后来又有人加以改进,使得求解最大流的方法更加丰富和完善 。最大流问题的研究密切了图论和运筹学,特别是与线性规划的联系,开辟了图论应用的新途径。 最大流问题仅注意网络流的流通能力,没有考虑流通的费用。实际上费用因素是很重要的。例如在交通运输问题中,往往要求在完成运输任务的前提下,寻求一个使总运输费用最省的运输方案,这就是最小费用流问题。如果只考虑单位货物的运输费用,那么这个问题就变成最短路问题。由此可见,最短路问题是最小费用流问题的基础。现已有一系列求最短路的成功方法。最小费用流(或最小费用最大流)问题 ,可以交替使用求解最大流和最短路两种方法,通过迭代得到解决。 目前网络流的理论和应用在不断发展,出现了具有增益的流、多终端流、多商品流以及网络流的分解与合成等新课题。网络流的应用已遍及通讯、运输、电力、工程规划、任务分派、设备更新以及计算机辅助设计等众多领域。(3) 算法的实现Edmonds-Karp 算法建立在Ford-Fulkerson方法上的增广路算法,与一般的Ford-Fulkerson算法不同的是,它用广度搜索实现对增广路的寻找. 以下为代码: int n;long int c128128;long maxflow(int s, int t) int p, q, queue128, u, v, pre128; long int flow, aug; flow = 0; while(true) memset(pre, -1, sizeof(pre); for(queuep = q = 0 = s; p = q; p+) u = queuep; for(v = 0; (v n) & (pret) 0) & (prev = 0) break; if(pret 0) break; aug = 0x7fff; for(u = prev = t; v!= s; (v = u), (u=preu) if(cuv aug) aug = cuv; for(u = prev = t; v!= s; (v = u), (u = preu) cuv -= aug; cvu += aug; flow += aug; return flow;3、 二分图(1) 含义的理解二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。2、相关应用作为一种数学模型,二分用途是十分有用的,许多问题可以用它来刻划。例如“资源匹配”、“工作安排”、“人员择偶”等等。而这就需要考虑匹配问题。匹配:给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,则称M是一个匹配。而二分图最大匹配可以用最大流或者匈牙利算法。最大流在网络流中有介绍。匈牙利算法为:(资料:百度百科)匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理(此定理使用于组合问题中。二部图G中的两部分顶点组成的集合分别为X, Y, Z,=X1, X2, X3,X4, .,Xm , Y=y1, y2, y3, y4 , .,yn,G中有一组无公共点的边,一端恰好为组成X的点的充分必要条件是: X中的任意k个点至少与Y中的k个点相邻。(1km))中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。算法的思路:不停的找增广轨,并增加匹配的个数,增广轨顾名思义是指一条可以使匹配数变多的路径,在匹配问题中,增广轨的表现形式是一条交错轨,也就是说这条由图的边组成的路径,它的第一条边是目前还没有参与匹配的,第二条边参与了匹配,第三条边没有.最后一条边没有参与匹配,并且始点和终点还没有被选择过.这样交错进行,显然他有奇数条边.那么对于这样一条路径,我们可以将第一条边改为已匹配,第二条边改为未匹配.以此类推.也就是将所有的边进行反色,容易发现这样修改以后,匹配仍然是合法的,但是匹配数增加了一对.另外,单独的一条连接两个未匹配点的边显然也是交错轨.可以证明,当不能再找到增广轨时,就得到了一个最大匹配.这也就是匈牙利算法的思路.资料来源:/index.php/%E5%8C%88%E7%89%99%E5%88%A9%E7%AE%97%E6%B3%95求最大匹配的一种显而易见的算法是:先找出全部匹配,然后保留匹配数最多的。但是这个算法的复杂度为边数的指数级函数。因此,需要寻求一种更加高效的算法。 增广路的定义(也称增广轨或交错轨):若P是图G中一条连通两个未匹配顶点的路径,并且属M的边和不属M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径。(M为一个匹配) 由增广路的定义可以推出下述三个结论: 1. P的路径长度必定为奇数,第一条边和最后一条边都不属于M。 2. P经过取反操作可以得到一个更大的匹配M。 3. M为G的最大匹配当且仅当不存在相对于M的增广路径。 用增广路求最大匹配(称作匈牙利算法,匈牙利数学家Edmonds于1965年提出) 算法轮廓: 1. 置M为空 2. 找出一条增广路径P,通过取反操作获得更大的匹配M代替M 3. 重复(2)操作直到找不出增广路径为止 程序清单: const maxm=200; maxn=200;var i,j,k,m,n:longint; g:array1.maxm,1.maxnof boolean; y:array1.maxnof boolean; lk:array1.maxnof longint;function find(x:longint):boolean;var i:longint;begin for i:=1 to n do if gx,i and (not yi) then begin yi:=true; if (lki=0)or find(lki) then begin lki:=x; find:=true; exit; end; end; find:=false;end;#include#includebool g201201;int n,m,ans;bool b201;int link201;bool init() int _x,_y; memset(g,0,sizeof(g); memset(link,0,sizeof(link); ans=0; if(scanf(%d%d,&n,&m)=EOF)return false; for(int i=1;i=n;i+) scanf(%d,&_x); for(int j=0;j_x;j+) scanf(%d,&_y); g i _y=true; return true;bool find(int a) for(int i=1;i=m;i+) if(ga i =1&!b i ) b i =true; if(link i =0|find(link i ) link i =a; return true; return false;int main() while(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论