第六章离散优化模型Word文档格式.docx
- 文档编号:22337261
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:35
- 大小:160.43KB
第六章离散优化模型Word文档格式.docx
《第六章离散优化模型Word文档格式.docx》由会员分享,可在线阅读,更多相关《第六章离散优化模型Word文档格式.docx(35页珍藏版)》请在冰豆网上搜索。
,等等,插入
共需作3次比较。
对一般情况,排出b1不必作比较,排出b2只需作一次比较,…,以此类推,在排ak+1时,若2r-,1≤k<2r,则只需作r次比较即可将ak+1安排在它应排的位置上。
由于r≤log2k+1,算法的总比较次数不超过:
(注:
这里我们用到了不等式
)
令
,
,设计算机每秒可作C次比较,则算法1与算法2整理a1,a2,…,an所用的时间分别为
若n=100万,C=100万次/秒,则t1≈5.8天,而t2≈20秒。
可见在解较大规模的整理问题时,算法2明显优于算法1。
从上面的例1可以看出,在设计算法时,计算量的大小显得非常重要,它关系到计算机科学研究的中心课题之一:
计算复杂性问题。
在本章中我们将要简单介绍一些相关的知识。
为了方便读者理解,我们将不引用严格的定义,而采用一些较为通俗易懂的叙述方法,希望了解进一步知识的读者可以查阅相关的书籍或文献资料。
例6.2(酋长嫁女儿)
非洲某酋长国的酋长想把自己的三个女儿嫁出去。
记他的三个女儿为A、B、C,现设恰有三位求婚者,记他们为X、Y、Z(这是标准形式,在一般模型中女儿数和求婚者人数可以不同)。
每位求婚者对A、B、C愿意支付的财礼数视其喜欢程度的不同而不同,设:
ABC
(矩阵中的元素
为求婚者i娶j愿付的财礼数)
问酋长应当如何嫁女儿,才能获得最多的财礼(从总体上讲,他的女婿最喜欢他的女儿)。
建模引入变量
,本问题的数学模型为:
(6.1)
在(6.1)中,变量只能取0或者1,故被称为0—1(线性)规划问题,0—1规划属于离散优化问题。
让我们先来对上面的例6.2(酋长嫁女儿问题)设计一些求解算法,并对这些算法加以一一比较,以判定这些算法的优劣。
(算法1)(贪婪法)
如果酋长采用类似于拍卖的方式将女儿一个个地嫁出去,在嫁出每一个女儿时,将她嫁给当前财礼出得最高的求婚者,并遵守一夫一妻制的原则,这一方法被称为贪婪法或贪心法(注:
拍卖会上采用的就是贪婪法)。
根据这一方法将有:
C嫁给Y,B嫁给X,A嫁给Z,酋长得到的总财礼数为34。
分析:
算法1的最大缺点是它没有求出最好的结果,事实上,只要将C嫁给X,将A嫁给Y,将B嫁给Z,则酋长可以得到的总财礼数将增加到57。
(算法2)(穷举法)
不难看出,酋长嫁女儿的不同方法只有六种。
比较所有可能的嫁女儿方法,酋长即可找到能获得最多财礼数的嫁法(总财礼数为57),显然,这是穷举法。
读者也许会想,酋长已找到最好的嫁女儿方法,问题已经解决了,其实不然。
为什么我们要将此问题称为酋长嫁女儿呢?
因为一般人的儿女不多,如何嫁女儿根本不成问题。
但非洲的某些酋长就不同了,他们有的有一、两百个儿女,例如,不妨设有100个女儿,此时他如果也采用穷举法,将一一比较100!
种不同的嫁法。
100!
究竟有多大呢?
读者不妨找一个计算器(或计算机)来算一下。
不算不知道,一算吓一跳。
如果酋长真的用穷举法来嫁他的女儿,当他知道该如何嫁法时,他的女儿们早已变成了化石,当然,酋长本人也早已变成了化石,在他的有生之年根本不可能得出答案。
在介绍其他算法之前,我们先来看一下什么是算法,为此,我们得先来区分一下以下的两个不同的概念,即“问题”与“实例”。
由于篇幅的限止,我们不准备给出严格的定义。
我们所说的问题是指对一类实际问题的数学模型的总称。
在问题中一般总包含着若干个参数,给定这些参数,就给出了这一问题的一个实例。
为区分起见,今后我们一般将用D来记某一离散模型问题,用I来记离散模型问题的某一实例。
例如,酋长嫁女儿问题的标准形式为酋长有n个女儿(含参数n),有n个求婚者前来求婚,求婚者j对女儿i肯支付的财礼数为
,(含参数“财礼矩阵”)其数学模型为:
(6.2)
(注:
问题的标准形式常被表示为求极小解,而且女儿数和求婚者数相等,非标准形式可以通过等价变换化为标准形式)
(6.2)中包含了一些参数:
数n和矩阵
在给定n及
后我们就得到了问题的一个实例,例如,例6.2就是它的一个实例。
那么,什么是算法呢?
算法是为求解问题而设计的方法,对问题的任意一个实例,算法都应该能求出其相应的解来。
其实,酋长嫁女儿问题的学名叫指派问题,我们称其为酋长嫁女儿只是为了更形象一些而已。
标准的指派问题要求矩阵为方阵,其元素
,目标为求极小,非标准形式可以十分容易地转化为标准形式。
指派问题具有一些特殊的性质,存在着由匈牙利数学家Konig提出的简便解法——匈牙利算法。
算法主要依据以下事实:
如果系数矩阵C=(Cij)的一行(或一列)中每一元素都加上或减去同一个数,得到一个新矩阵B=(bij),则以C和B为系数矩阵的指派问题具有相同的最优指派。
例6.3设系数矩阵为:
求次指派问题的一个最优指派(即求矩阵中4个不同行不同列的元素),使总和最小。
解将第一行元素减去此行中的最小元素15,同样,第二行元素减去17,第三行元素减去17,最后一行的元素减去16,得
再将第3列元素各减去1,得
不难看出,以B2为系数矩阵的指派问题有最优指派:
(总和为0,不可能再小)
由等价性,它也是例2的最优指派。
有时候,问题会变得稍微复杂一些。
例6.4求解系数矩阵为C的指派问题
解:
先作等价变换如下
容易看出,从变换后的矩阵中只能选出四个位于不同行不同列的零元素,但n=5,最优指派还无法看出。
此时等价变换还可进行下去,步骤如下:
(1)对未选出0元素的行打√;
(2)对√行中0元素所在列打√;
(3)对√列中选中的0元素所在行打√;
重复
(2)、(3)直到无法再打√为止。
(读者可以想一下为什么要这样做)
可以证明,若用直线划出没有打√的行和打√的列,就得到了能够复盖住矩阵中所有零元素的最少条数的直线集合,找出未复盖的元素中的最小者,令√行元素减去此数,√列元素加上此数,则原先选中的0元素不变,而未被复盖的元素中至少会有一个已转变为0(未覆盖元素中的最小者),且新矩阵的指派问题与原问题也有相同的最优指派。
上述过程可反复采用,直到能选出足够的0元素为至。
例如,对例6.4变换后的矩阵再作变换,第三行、第五行元素减去2,第一列元素加上2,得到
现在已可看出,最优指派为
为了证明上述算法必能求出最优解,还需要证明几个定理,例如:
没有打√的行和打√的列必能覆盖所有的零元素:
上述调整步骤最多进行有限次,必可选出最优解等等,由于篇幅的限制,我们不打算再在此处作进一步的讨论。
(算法3)(指派问题的匈牙利算法)
根据以上实例的求解,读者不难自己归纳出匈牙利算法。
算法2的计算量为n!
,当n较大时,我们根本不可能用它来求解。
一般,如果可以找到一个实例,当算法求解此实例时需要用到的计算量至少为
,则我们称此算法为指数算法,并认为它不是好算法,(显然,算法2是指数算法,因为n!
大于
)。
可以证明,匈牙利算法的计算量为
,即使
,利用计算机也只需要几秒钟就能求出最优解。
如果存在一个多项式
,对问题的任何一个规模为n(例如有n个变量)的实例,求解此实例的计算量均不会超过
,则称此算法为多项式时间算法,并认为这种算法是好算法(当然,多项式的次数越低越好),匈牙利算法就是一个次数较低的多项式时间算法。
为了使读者对指数算法与多项式算法有一个更直观的了解,我们还将对这两类算法再作一些比较。
设我们有一台每小时能作M次运算的计算机,并设求解某一问题已有了两个不同的算法。
算法A对规模为n的实例约需作n2次运算,而算法B则约需作2n次运算。
于是,运用算法A在一小时内大约可解一个规模为
的实例,而算法B则只能解一个规模为log2M的实例。
两者的差别究竟有多大呢?
让我们用数字来对比一下。
假如计算机每秒钟可作100万次运算,则算法A一小时大约可解一个规模为n=60000的实例,而算法B在一小时内只能解一个规模小于28的实例且n每增加1,算法B求解时所化的时间就将增加1倍。
例如算法B求解一个n=50的实例将连续运算357年多。
现设计算速度提高了100倍,这对计算机来讲(即硬件)已是一个相当大的改进。
此时算法A可解问题的规模增大了10倍,而算法B可解问题的规模只增加了log2100<
7。
前者可解问题的规模将会成倍成倍地增加,而后者则几乎没有什么改变,故今天无法求解的问题将来也很少有希望解决。
从下面的表6-1中,读者也可得出类似的结论:
表6-1几个多项式时间和指数时间算法的计算时间增长情况
算法要求的计算量
规模n的近似值
10
100
1000
N
Nlogn
33
664
9966
N3
103
106
109
2n
1024
1.27×
1030
1.05×
10301
N!
3628800
10158
4×
102567
6.2P问题与NP难问题
从上一节中我们已经看出,在设计离散问题的算法时,应当去设计次数尽可能低的多项式时间算法。
一个问题如果被设计出求解它的多项式算法,我们就认为它不算太难,且已基本上被解决。
对它的任何实例,我们都可以用计算机来求解并找到答案。
我们把这类问题称为P问题,即多项式时间可以求解的问题。
P问题全体构成一个集合,记此集合为ℙ类.
离散模型除了可用优化形式表达以外,也可被表示成为等价的判定形式。
例如,酋长嫁女儿的问题也可以这样来表达:
任给一个正整数M,问酋长是否能取得至少为M的财礼?
要求你给出算法,能给出“是”或“否”的答案,当然,答案必须是正确的,决不能只是猜测。
一个问题被称为是NP问题,如果对它的每一个答案为“是”的实例可以在多项式时间里被验证答案是否正确(说明:
1.这里我们指的不是求解而是验证你给出的答案,2.这不是NP问题的严格定义,严格定义要用到自动机理论),NP问题全体也组成一个集合,此集合被称为ℕℙ类,不难证明ℙ⊂ℕℙ,(多项式时间可求解,当然多项时间可验证)。
然而十分可惜的是,人们发现有一大批ℕℙ类中的离散问题,尽管全世界的数学家和计算机科学家都在努力寻找它们的多项式算法,可是历经数十年,竟然没有一个人能获得成功。
人们越来越倾向于相信这类问题很可能根本就不存在求解它们的多项式时间算法,并把这类问题称为NP难问题,(注:
NP问题与NP难问题有专门的专业定义,本处从略)。
所谓的NP难问题到底真的有没有多项式时间算法至今还是一个谜,这就是数学与计算机科学中亟待解决的重大理论问题之一:
ℙ=ℕℙ吗?
这一问题极其困难,不知要到那一天才会被解决,但它又极其重要,决定着我们究竟应当去设计离散问题的什么样的算法的重大问题,它决定着我们研究未知问题时的大方向。
1972年,加拿大数学家Cook在其后来获得图灵(Turing)奖的著名论文中指出,存在着一类问题,具有以下两个性质:
(1)对其中的任何一个我们至今都没有找到求解它的多项式时间算法
(2)只要有人能找到这类问题中任何一个问题的多项式时间算法,那么我们就不难构造出其他问题的多项式时间算法。
Cook将这类问题称为NP完全问题(简称NPC问题)。
对P问题,我们已经找到或应当去寻找求解它的多项式算法,且多项式的次数越低越好。
但对NPC问题,既然全世界那么多人都找不到求解它们的多项式算法,且数学家们都倾向于相信根本就不存在求解它们的多项式时间算法,那么,我们恐怕也不大可能找到求解它们的多项式算法。
这样一来,当我们要研究一个离散问题时,我们首先必须搞清这个问题究竟有多难,它是P问题呢还是NP难的?
就像医生在发现病人患有肿瘤后,首先要搞清这个肿瘤究竟是良性的还是恶性的一样,这就是对问题的计算复杂性分析。
我们与肿瘤作对比,是希望读者能体会到计算复杂性分析的重要性,很少有人会认为区分肿瘤是良性的还是恶性的是无关紧要的,但初学者却常常会想“为什么我们要去作计算复杂性分析”。
在通常情况下,计算复杂性分析的难度都比较大,我们不可能在这里多加讨论。
这里,我们只想粗略描述一下计算复杂性理论中的几个重要概念。
在§
6.3中,我们将介绍几个会经常遇到又比较简单的P问题并介绍一些求解它们的有效算法。
这些算法其实是我们在研究实际问题时随时可能会用到的工具。
多掌握一些已知的P问题及求解它们的算法,不仅可以开阔我们的眼界,也能大大增强我们解决实际问题的能力。
6.4中,我们还将介绍几个NP难的问题,目的是想说明当我们遇到NP难问题时,我们还有哪些事情可以做。
我们将通过这两节来比较一下两类问题的不同研究方法。
6.3几个经常遇到而又较为简单的P问题
P问题具有多项式时间算法,但这远不等于说P问题都非常简单。
实际上,在大多数情况下,设计P问题的多项式时间算法也需要用到很高的技巧,§
5.1中的线性规划问题就是一个典型的例子。
1947年,美国数学家Dantzig给出了求解线性规划问题的非常著名、结构十分精美的算法—单纯型算法(我们已在第五章中作了介绍)。
1972年,Klee等人举出了一个并不复杂的例子,雄辩地证明了实用效果极好的单纯型算法其实是指数算法,在单纯型算法出现以后的最初25年中,人们之所以没有提出异议,是由于遇到这种“坏例子”的概率等于0的缘故。
那么,究竟有没有求解线性规划问题的多项式时间算法呢(即线性规划问题是P问题吗)?
在长达7年的时间里,没有人能回答这一问题。
直到1979年,前苏联列宁格勒大学的哈奇扬(Хачян)提出求解线性规划问题的椭球算法,并证明其椭球算法是多项式时间的,这才证明了线性规划问题是P问题。
椭球算法的实用效果还不够理想,如何设计线性规划问题的较好算法,仍是当今数学研究中的重要工作之一。
可见,P问题并非简单问题的代名词。
容易与困难是相对而言的,相对于那些我们竭尽全力还找不到多项式时间算法的NP难问题来讲,它们的求解或许要相对容易一些,仅此而已。
以下,我们将再举一些经常会遇到而又较为简单的P问题。
例6.5(最小生成树问题)
给定一个连通图G(V,E),其中V为图的顶点集合,E为图的边集。
先解释几个数学上的名词。
图中不包含任何子圈的连通子图被称为一棵树,图中包含边数最多的树被称为该图的生成树。
给图的每一条边赋一个权,赋过权的图被称为网络,求网络中具有最小总权的生成树问题被称为最小生成树问题。
最小生成树(MinimumSpanningTree,简记MST)问题应当说是最简单、最容易求解的P问题之一。
让我们先来看一个MST的实例:
给定一个有8个顶点14条边的图,见图6-1。
要求求出该图的一个最小生成树
图6-1
算法
最小生成树问题非常容易求解,例如,可以用贪婪法求解。
步1.将图中所有边按权值整理成由小到大的顺序,对图6.1中的图,经整理得:
2,3,4,4,5,5,5,6,6,6,7,7,8,9
步2.从最短边开始,依次加入剩余边中的最短边,在产生子圈时去除该边。
在所有边都试过后未被去除的边必构成图的一个最小生成树。
也可依次加入与已得到的树连通的不产生子圈的最短边而产生最小生成树)。
求解最小生成树的算法很容易设计,除了上述方法外,也可采用破圈法,从原图出发,每次寻找一个子圈,一旦找到了子圈,就从该子圈中去除子圈中的最长边,当无法再找到子圈时,就得到了原图的一颗最小生成树。
最小生成树之所以可以用贪婪法求解是由于它具有一种良好的特性(数学中称之为拟阵结构),读者不难发现,图的任意最小生成树都包含有相同数量的边数,此数等于图的顶点数减去1。
例6.6(两分图的最大权匹配问题)
为了便于读者理解,先介绍一些简单概念。
(两分图)一个图的顶点集合V如果可以被剖分成为两个非空子集
,位于同一子集中的顶点之间没有边相连,仅在两顶点分属不同子集时,它们之间才有可能有边相连,这样的图被称为两分图。
如果分属两个子集的顶点之间均有边相连时,该图被称为两分完全图。
(匹配)两分图的边集的一个子集被称为匹配,如果该子集中的任意两条边均无公共的顶点。
(两分图最大权匹配问题)给定一个两分图,在图中的每一条边上赋一个权使之成为网络。
求由该两分图生成的网络中具有最大总赋权值的匹配问题被称为最大权匹配问题。
例如,前面讲过的酋长嫁女儿问题就可以表示成为最大权匹配问题的一个实例。
两分图的最大权匹配问题可以化为两分完全图的匹配问题,而两分完全图的最大全匹配问题又等价与指派问题,既可以用匈牙利算法求解,也可以直接应用图论知识来设计算法(直接算法从略)。
例6.7(最大流与最小费用最大流问题)
(最大流问题)给定一个网络,其边上的赋值为该边允许通过的最大容量,在网络中指定两个点,求这两个顶点之间可以通过的最大流量。
最大流问题可以写成线性规划形式,因而必为P问题。
由于最大流问题是特殊的线性规划,下面我们来分析这一问题,并设计求解它的专门方法。
图6.2图6-3
图6.2是最大流问题的一个实例,每条边上有两个权值,第一个为边容量,第二个为目前边上的实际流量,现在要求求出由顶点1到顶点6最多可以通过几个流量。
乍一看,图中的流量似乎已经不能再增大了:
由1到4的边上已经客满,不能再增大流量。
由1到3的边上虽然并未客满,但似乎也不能再增大,因为由3到5的边已客满,增大的流到了3处将无法流出。
其实上述理由是不充足的,产生上述想法的原因是看问题过于局限,缺乏全局观念。
其实,3到5的边之所以会客满是由于从2到3流过来的2个流来凑热闹而造成的,其余的边还很空,那两个流干吗一定要流到3来呢,它完全可以从别处流过去,让出道来增大整个网络的流量。
还有一个问题需要解决,图6.2中的实例过于简单,我们可以直接看出问题来(这也是我们分析例6.7的原因)。
然而实际问题中的网络一般都比较复杂,我们又怎样作类似分析并判断出当前的流是不是最大流呢?
有人想出了一个好办法,他不在原网络(如图6.2)中分析,而是按以下方法另行构筑了一个网络,新网络被称为原网络对应的增广网络。
增广网络中有两类边:
假如原图中由i到j的边尚未客满,则引入一条实线边,称之为正则边,边容量为剩余边容量(即原图中的边容量减去当前的实际流量);
假如原图中由i到j的实际流量大于0,则引入一条反方向的虚线边,称之为增广边,边容量即为实际流量(意为最多可减少的流量)。
例如,图6.2对应的增广网络为下面的图6.3。
容易证明,可以从增广网络中找到连接两个指定顶点之间的路(被称为增广路)当且仅当目前的流不是最大流。
例如,从图6.3中可以找到增广路
,故当前的流并非最大流。
由于增广路上最多可通过2单位流,故可将图6.2中的流作调整,得到图6.4中的流:
(图6.4)
读者可自行作出图6.4对应的增广网络,此时可以发现,在该增广网络中已不存在由1到6的增广路,我们已求得网络的一个最大流。
读者也许会问,怎样才能得到一个初始的流呢?
初始流需要满足一些平衡条件,例如,在我们的例子中,要求顶点1只流出不流入、顶点6只流入不流出、其余顶点则要求流入量等于流出量。
这一问题不难回答,你只需从空网络起步即可,因为空网络自动满足上述要求。
(最小费用最大流)假如在每条边上再增加一个权,表示一个单位流在通过该边时需要支付的费用,则我们在求最大流时还可要求支付的总费用最少,这就是最少费用最大流问题。
这里我们既希望流量能达到最大,又希望费用能达到最省,总共有两个目标。
在一般情况下,当问题有两个或两个以上目标时,我们不一定总能使所有目标都达到最佳,即便能使所有目标都达到最佳,要求出使所有目标都最佳的结果也常常非常困难(经常是NP难的),但这里却是一个例外,求最小费用最大流问题一点也不难。
具体做法如下:
步1从空网络起步,空网络是流量为0的流中费用最省的一个。
步2从当前流的增广网络中找出所有可能的增广路,比较在每一条增广路上增加一单位的流需要支付多少费用,找出费用最省的增广路,在这条增广路上增加流。
依次按此方法增大流,在无法增大时,你求得的最大流就是最小费用最大流。
(证明从略)
例6.8(最短路径问题)
给定一个网络并给定网络中的两点,求从其中一点到另一点的最短距离及达到此最短距离的最短路径。
最短路径问题也是P问题,可以用基于动态规划的Dijkstrra算法求解,该算法体现了动态规划算法的基本思想:
若点P在A到E的最短路径上,则P到E的最短路径必定整个地包含在A到E的最短路径上。
由于动态规划算法叙述起来较为繁琐,本处不打算作详细介绍,只举一个实例说明一下大致意思,有兴趣的读者可以自己查阅运筹学方面的相关资料。
给定图6.5中的网络,边上的数字为两顶点之间的距离(或费用),求由A到E的最短路径。
图6.5图6-6
对图中的网络从起点A开始标号(也可从终点E开始标号,但两者作用不同),先在A点标上0。
再找出离A最近的点B3,标上A到B3的最短距离并记录下A点(表明由A而来)。
一般,在标新顶点时,先找出离已标号顶点最近的顶点。
比较各已标号顶点(与拟标号顶点有边相连)的标号与它到拟标号顶点距离之和,找出各种可能中的最小者作为新顶点的标号,并记录下其前的已标号顶点。
直到拟到达的终点已标号为止。
例如,图6.6指出,A到E的最短路径为A→B2→C1→D1→E,最短距离为19。
例6.9(邮递线路与一笔画问题)
本问题与欧拉圈有关,起源于哥尼斯堡七桥问题。
在哥尼斯堡的普列格尔河上有两个岛屿,连结河岸与岛屿的共有七座桥梁,见图6.7所示。
(a)(b)
图6.7
游玩的人多了,就有人提出了一个问题:
是否可以从某一点出发,不重复地走遍七座桥梁并返回原地?
欧拉研究了这一问题,于1736年发表了被认为是图论研究的最早论文,给出了这一问题的否定回答。
欧拉将哥尼斯堡七桥问题转变为图6.7(b)所表示的图论问题:
对图6.7(b),能否从某一顶点出发,经过每条边刚好一次并返回原出发顶点(即此图可以一笔画出)?
欧拉认为,如果这种走法能够实现,则图应当满足两个条件:
(1)图应当是连通的
(2)对每一顶点,都应当是进得去又出得来,故和每一顶点相关联的边数均应当是偶数,即每一顶点均应当是偶顶
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六 离散 优化 模型
![提示](https://static.bdocx.com/images/bang_tan.gif)