6 运筹学基础及其MATLAB应用 max(min)z=cTX s.t. AX=6 X≥0 这里,X∈R”称为决策向量,c∈R”称为价值系数向量,A∈Rmm称为技术系数矩 阵,b∈Rm称为资源系数向量。A,b,c就是描述该问题的参数,当这些矩阵、向量给定 具体值后,就对应一个实例。通过一个称为检验数(后面将会详述)的概念对其解进行描 述。后面我们将会了解到单纯形法可以求解该问题。并且只要是如上形式的问题,不论 A,b,c是怎样的,通过单纯形法都可以得出有解(唯一解、无穷多组解、无界解)或无解 的最终结果。 衡量一个算法的好坏有时可以用计算机所耗费的cpu时间来判断,但是,计算机软 硬件都在不断变化和提高,所以通常是用算法中的加、减、乘、除和比较等基本运算的总 次数同实例在计算机计算时的二进制输入数据的大小关系来度量的。在这里我们不打算 进行详细地讨论,我们只是粗略地指出,一个求解实例I的算法的基本计算总次数C() 同实例I的计算机二进制输入长度d()的关系如果能用一个多项式函数进行控制的话, 我们就称该算法是求解该问题的一个多项式时间算法。这样的算法我们认为是有效的或 者说是好的算法。与此相对的就是所谓指数时间算法,这样的算法我们认为是效率不高 的或者说是不好的算法。 一个问题如果存在至少一个多项式时间算法,则称为多项式问题,所有多项式问题 集记为P(Polynomial)。对于上面提到的线性规划问题,可以证明,单纯形法不是一个多 项式时间算法,但这并不能说明线性规划问题不属于多项式问题。Khachian在l979年成 功构造了椭球算法并证明了其算法是线性规划问题的多项式时间算法。因此,线性规划 问题属于P。并非所有(优化)问题都找到了多项式时间算法,也就是说,还不能肯定某 些优化问题是否属于P。我们把迄今为止还没有找到多项式时间算法的最优化问题归为 所谓的NP-hard。受人类认识能力的限制,目前人们只能假设这一类难解的最优化问题 不存在多项式时间算法。比如,我们将在后面学习的整数规划问题,0-1规划问题即属于 此类问题。但是,非多项式时间算法在实际计算中的表现不一定就不好。比如单纯形法, 理论上不是多项式时间算法,但其求解实际问题的效果,特别是对于中小规模的线性规 划问题而言,其效果往往好于别的算法(如内点算法)。因此,单纯形法以及割平面法、隐 枚举法等算法仍然值得我们学习。 应用运筹学解决问题 运筹学的特点之一是多学科合作。所以,运用运筹学解决实际问题首先需要与问题 所属学科领域的专业人士进行合作,深入了解问题的真正含义,搞清问题真正需要解决 的目标。其次,在研究问题时要互相引导,改变一些对问题的常规看法。除了强调合作以
6 运筹学基础及其 MATLAB 应用 max(min) z = c TX s.t. AX = b X > 0 这里,X ∈ R n 称为决策向量,c ∈ R n 称为价值系数向量,A ∈ R m·n 称为技术系数矩 阵,b ∈ R m 称为资源系数向量。A, b, c 就是描述该问题的参数,当这些矩阵、向量给定 具体值后,就对应一个实例。通过一个称为检验数 (后面将会详述) 的概念对其解进行描 述。后面我们将会了解到单纯形法可以求解该问题。并且只要是如上形式的问题,不论 A, b, c 是怎样的,通过单纯形法都可以得出有解 (唯一解、无穷多组解、无界解) 或无解 的最终结果。 衡量一个算法的好坏有时可以用计算机所耗费的 cpu 时间来判断,但是,计算机软 硬件都在不断变化和提高,所以通常是用算法中的加、减、乘、除和比较等基本运算的总 次数同实例在计算机计算时的二进制输入数据的大小关系来度量的。在这里我们不打算 进行详细地讨论,我们只是粗略地指出,一个求解实例 I 的算法的基本计算总次数 C(I) 同实例 I 的计算机二进制输入长度 d(I) 的关系如果能用一个多项式函数进行控制的话, 我们就称该算法是求解该问题的一个多项式时间算法。这样的算法我们认为是有效的或 者说是好的算法。与此相对的就是所谓指数时间算法,这样的算法我们认为是效率不高 的或者说是不好的算法。 一个问题如果存在至少一个多项式时间算法,则称为多项式问题,所有多项式问题 集记为 P(Polynomial)。对于上面提到的线性规划问题,可以证明,单纯形法不是一个多 项式时间算法,但这并不能说明线性规划问题不属于多项式问题。Khachian 在 1979 年成 功构造了椭球算法并证明了其算法是线性规划问题的多项式时间算法。因此,线性规划 问题属于 P。并非所有 (优化) 问题都找到了多项式时间算法,也就是说,还不能肯定某 些优化问题是否属于 P。我们把迄今为止还没有找到多项式时间算法的最优化问题归为 所谓的 NP-hard。受人类认识能力的限制,目前人们只能假设这一类难解的最优化问题 不存在多项式时间算法。比如,我们将在后面学习的整数规划问题,0-1 规划问题即属于 此类问题。但是,非多项式时间算法在实际计算中的表现不一定就不好。比如单纯形法, 理论上不是多项式时间算法,但其求解实际问题的效果,特别是对于中小规模的线性规 划问题而言,其效果往往好于别的算法 (如内点算法)。因此,单纯形法以及割平面法、隐 枚举法等算法仍然值得我们学习。 应用运筹学解决问题 运筹学的特点之一是多学科合作。所以,运用运筹学解决实际问题首先需要与问题 所属学科领域的专业人士进行合作,深入了解问题的真正含义,搞清问题真正需要解决 的目标。其次,在研究问题时要互相引导,改变一些对问题的常规看法。除了强调合作以
绪论 外,在研究问题时也需要独立进行,要思路开阔。具体来说,应用运筹学解决问题主要有 如下一些步骤: (1)分析问题。首先针对问题做调查研究。这里指的是针对问题提供的己知、未知, 做定性研究,讨论问题的属性。要搞清楚问题所属的学科领域,并反复讨论问题需要解答 者回答什么。这个说法看似容易,但对比较复杂的问题可能需要解答者反复思考才可能 真正清楚问题所在。 (2)构造或选择模型。在清楚决策变量并用适当符号表示以后,针对问题可以选用适 当的、己知的模型,也可能需要解答者自己构造模型。所谓构造模型是指,根据相关学科 领域的知识和问题的要求,客观地写出决策变量之间必须满足的关系。在此,需要特别强 调的是,在构造模型或选择模型以前,必须作出适当的、合理的假设。 (3)模型的求解和检验。模型建立以后,应该根据相关理论对此模型进行求解。对于 运筹学模型而言,几乎都是根据相关算法通过计算机求解。在此,需要注意问题的规模和 计算复杂性问题。对于某些大型的运筹学模型,如果属于NP-hard的,可能还需要采用 某些启发式算法进行求解。在求解过程中必然有检验的问题,这与算法有关。 (④)解的实施和控制。应用运筹学解决问题的根本就是为决策者作出科学决策提供定 量依据。因此,得到模型的解以后就需要具体实施。若在实施过程中发现与预期的、理论 的或实际的表现不符,则需要回到第一步重新开始。另外,由于任何数学模型都有局限 性,所以在可能的情况下作灵敏度分析,即确定最优解保持稳定的参数变化范围也是非 常重要的。 (⑤)模型的总结和反馈。最后,针对建立的运筹学模型作出总结,讨论是否可以进一 步改善模型。 在应用运筹学解决一个复杂的实际问题时,构造或选择模型是最重要的一步。为获 得一个好的模型,可能需要重复上述步骤,反复讨论才能成功,从而较好地解决问题。 关于本书 从应用数学的角度来看,运筹学是一门应用性很强的学科。从管理等学科的角度来 看,运筹学又是一门数学味道很浓的学科。因此,学习运筹学不仅要学会相关的数学理 论,更要注意建立数学模型解决实际问题。同时,对于处在计算机时代的人来说,必须要 学会利用计算机解决运筹学模型。我们在前言己经说过,可以选用一些现成的计算机软件 来解决运筹学问题,但编者考虑到MATLAB的重要性和广泛性,本书是基于MATLAB 来进行相关讨论的。几乎对于每个算法我们都编写了相关的程序并附在每章的适当位置。 编者也认为掌握相关算法的手工计算也是很有必要的。因为这会有助于学习者真正理解 和掌握相关的算法。因此传统的手工计算我们并没有放弃。另外,本书在选材时是从运 筹学模型的数学特点进行划分的。即分成线性模型、非线性模型和随机模型三种
绪 论 7 外,在研究问题时也需要独立进行,要思路开阔。具体来说,应用运筹学解决问题主要有 如下一些步骤: (1) 分析问题。首先针对问题做调查研究。这里指的是针对问题提供的已知、未知, 做定性研究,讨论问题的属性。要搞清楚问题所属的学科领域,并反复讨论问题需要解答 者回答什么。这个说法看似容易,但对比较复杂的问题可能需要解答者反复思考才可能 真正清楚问题所在。 (2) 构造或选择模型。在清楚决策变量并用适当符号表示以后,针对问题可以选用适 当的、已知的模型,也可能需要解答者自己构造模型。所谓构造模型是指,根据相关学科 领域的知识和问题的要求,客观地写出决策变量之间必须满足的关系。在此,需要特别强 调的是,在构造模型或选择模型以前,必须作出适当的、合理的假设。 (3) 模型的求解和检验。模型建立以后,应该根据相关理论对此模型进行求解。对于 运筹学模型而言,几乎都是根据相关算法通过计算机求解。在此,需要注意问题的规模和 计算复杂性问题。对于某些大型的运筹学模型,如果属于 NP-hard 的,可能还需要采用 某些启发式算法进行求解。在求解过程中必然有检验的问题,这与算法有关。 (4) 解的实施和控制。应用运筹学解决问题的根本就是为决策者作出科学决策提供定 量依据。因此,得到模型的解以后就需要具体实施。若在实施过程中发现与预期的、理论 的或实际的表现不符,则需要回到第一步重新开始。另外,由于任何数学模型都有局限 性,所以在可能的情况下作灵敏度分析,即确定最优解保持稳定的参数变化范围也是非 常重要的。 (5) 模型的总结和反馈。最后,针对建立的运筹学模型作出总结,讨论是否可以进一 步改善模型。 在应用运筹学解决一个复杂的实际问题时,构造或选择模型是最重要的一步。为获 得一个好的模型,可能需要重复上述步骤,反复讨论才能成功,从而较好地解决问题。 关于本书 从应用数学的角度来看,运筹学是一门应用性很强的学科。从管理等学科的角度来 看,运筹学又是一门数学味道很浓的学科。因此,学习运筹学不仅要学会相关的数学理 论,更要注意建立数学模型解决实际问题。同时,对于处在计算机时代的人来说,必须要 学会利用计算机解决运筹学模型。我们在前言已经说过,可以选用一些现成的计算机软件 来解决运筹学问题,但编者考虑到 MATLAB 的重要性和广泛性,本书是基于 MATLAB 来进行相关讨论的。几乎对于每个算法我们都编写了相关的程序并附在每章的适当位置。 编者也认为掌握相关算法的手工计算也是很有必要的。因为这会有助于学习者真正理解 和掌握相关的算法。因此传统的手工计算我们并没有放弃。另外,本书在选材时是从运 筹学模型的数学特点进行划分的。即分成线性模型、非线性模型和随机模型三种
NHAPTER 1 第1章 线性规划及单纯形法 学习目标与要求 1.掌握线性规划的有关概念,会化非标准型线性规划为标准型线性规划。 2.初步建立数学模型的概念。 3.掌握求解线性规划的单纯形法并会用MATLAB求解线性规划问题。 1.1线性规划问题及其标准型 线性规划(Linear Programming,LP)是运筹学中一个基础而重要的分支。很多其他 运筹学问题的求解都以线性规划问题为基础。线性规划开创性的工作可以追溯到1939年 苏联数学家、经济学家康托洛维奇(L.V.Kantorovich,1912-1986)的著作《生产组织 和计划中的数学方法》。他把资源最优利用这一传统的经济学问题,由定性研究和一般 的定量分析推进到现实计量阶段,对于在企业范围内如何科学地组织生产和在国民经济 范围内怎样最优地利用资源等问题做出了独创性的研究。此外,美国经济学家库普曼斯 (T.C.Koopmans)和美国数学家丹兹格(G.B.Dantzig)在线性规划的发展历史中也作 出了开创性的卓越贡献。前者在第二次世界大战期间重新独立地研究了运输问题,后者 则发明了20世纪最伟大的算法之一,即用于求解线性规划问题的单纯形法。从理论上来 说,单纯形法不是多项式时间算法,而后来出现的椭球算法和内点算法才是求解线性规 划问题的多项式时间算法,但在实际计算中,特别是对中小规模的线性规划问题,单纯形 法的表现仍然很好。因此,对于现在学习运筹学的人来说,单纯形法仍然是必须掌握的算
1.1 线性规划问题及其标准型 线性规划 (Linear Programming, LP) 是运筹学中一个基础而重要的分支。很多其他 运筹学问题的求解都以线性规划问题为基础。线性规划开创性的工作可以追溯到 1939 年 苏联数学家、经济学家康托洛维奇 (L. V. Kantorovich, 1912—1986) 的著作《生产组织 和计划中的数学方法》。他把资源最优利用这一传统的经济学问题,由定性研究和一般 的定量分析推进到现实计量阶段,对于在企业范围内如何科学地组织生产和在国民经济 范围内怎样最优地利用资源等问题做出了独创性的研究。此外,美国经济学家库普曼斯 (T. C. Koopmans) 和美国数学家丹兹格 (G. B. Dantzig) 在线性规划的发展历史中也作 出了开创性的卓越贡献。前者在第二次世界大战期间重新独立地研究了运输问题,后者 则发明了 20 世纪最伟大的算法之一,即用于求解线性规划问题的单纯形法。从理论上来 说,单纯形法不是多项式时间算法,而后来出现的椭球算法和内点算法才是求解线性规 划问题的多项式时间算法,但在实际计算中,特别是对中小规模的线性规划问题,单纯形 法的表现仍然很好。因此,对于现在学习运筹学的人来说,单纯形法仍然是必须掌握的算
第1章线性规划及单纯形法 9 法。 1.1.1线性规划问题的提出 线性规划是指求解一组决策变量,该组决策变量在满足一些线性约束条件的基础上, 使得某个线性函数的值达到最大或最小。下面通过两个例子加以说明。 么模型引入1.1(生产安排问题)某工厂生产甲、乙两种产品,而生产这两种产品需要 用到原材料A和原材料B。该厂可以利用的原材料A有16kg,原材料B有12kg。生产 一个单位甲产品需要消耗2kg原材料A和4g原材料B,生产一个单位乙产品需要消耗 3kg原材料A和1kg原材料B。经过测算,一个单位的甲产品可以获得6元的利润,一 个单位的乙产品可以获得7元的利润。问:该厂应如何安排生产才能获得最大利润? 解这个问题问的是如何安排生产才能获得最大利润。什么叫安排生产呢?在这个 简化的题目中,所谓安排生产当然指的是生产甲、乙两种产品各多少个单位。所以,这是 我们要回答的不知道的量。设生产甲、乙两种产品各为x1和x2个单位,于是按照题目 的假设,该厂此时可以获利z=61+7红2。生产不能是随意的,在这里,生产所耗费的原 料当然不能超过该厂的拥有量。于是,生产必须在如下约束下进行: 2x1+3x2≤16(原料A的限制) 4x1+x2≤12(原料B的限制) 此外,x1,x2是甲、乙产品的计划生产量,所以有x1≥0,x2≥0。用max表示maximize(即 最大),用subject to或such that表示受约束(其缩写为s.t.),于是可以将上面的分析表 示为: max z=6x1+7x2 s.t. 2x1+3x2≤16 (1-1-1) 4红1+x2≤12 D1,x2≥0 这就是该问题的数学模型。它将原问题用数学的语言完全表达出来了。 么模型引入1.2(最佳下料问题)某汽车制造过程中需要用到1.5m、1m、0.7m的钢轴 各一根。用于制造这些钢轴的原料是4m长的圆钢。现在要制造1000辆汽车,问最少需 要多少根圆钢。 解由于3种规格的钢轴长度之和为3.2m,一个自然的做法是在一根圆钢上截取 就可以完成该项任务。但是,这样做将会出现0.8m的料头。制造1000辆汽车将会出现 800m的料头,如果这些料头不能作其他用途,则相当于浪费了200根原材料。那么,有 没有什么办法能减少浪费呢?仔细阅读题目不难发现,需要的是1.5m、1m、0.7m的钢轴 各一根,并没有要求这些钢轴来自于同一根圆钢。也就是说,只要获得1.5m、1m、0.7m
第 1 章 线性规划及单纯形法 9 法。 1.1.1 线性规划问题的提出 线性规划是指求解一组决策变量,该组决策变量在满足一些线性约束条件的基础上, 使得某个线性函数的值达到最大或最小。下面通过两个例子加以说明。 模型引入 1.1 (生产安排问题) 某工厂生产甲、乙两种产品,而生产这两种产品需要 用到原材料 A 和原材料 B。该厂可以利用的原材料 A 有 16kg,原材料 B 有 12kg。生产 一个单位甲产品需要消耗 2kg 原材料 A 和 4kg 原材料 B,生产一个单位乙产品需要消耗 3kg 原材料 A 和 1kg 原材料 B。经过测算,一个单位的甲产品可以获得 6 元的利润,一 个单位的乙产品可以获得 7 元的利润。问:该厂应如何安排生产才能获得最大利润? 解 这个问题问的是如何安排生产才能获得最大利润。什么叫安排生产呢?在这个 简化的题目中,所谓安排生产当然指的是生产甲、乙两种产品各多少个单位。所以,这是 我们要回答的不知道的量。设生产甲、乙两种产品各为 x1 和 x2 个单位,于是按照题目 的假设,该厂此时可以获利 z = 6x1 + 7x2。生产不能是随意的,在这里,生产所耗费的原 料当然不能超过该厂的拥有量。于是,生产必须在如下约束下进行: 2x1 + 3x2 616 (原料 A 的限制) 4x1 + x2 612 (原料 B 的限制) 此外,x1, x2 是甲、乙产品的计划生产量,所以有 x1 > 0, x2 > 0。用 max 表示 maximize(即 最大),用 subject to 或 such that 表示受约束 (其缩写为 s.t.),于是可以将上面的分析表 示为: max z = 6x1 + 7x2 s.t. 2x1 + 3x2 6 16 4x1 + x2 6 12 x1, x2 > 0 (1-1-1) 这就是该问题的数学模型。它将原问题用数学的语言完全表达出来了。 模型引入 1.2 (最佳下料问题) 某汽车制造过程中需要用到 1.5m、1m、0.7m 的钢轴 各一根。用于制造这些钢轴的原料是 4m 长的圆钢。现在要制造 1000 辆汽车,问最少需 要多少根圆钢。 解 由于 3 种规格的钢轴长度之和为 3.2m,一个自然的做法是在一根圆钢上截取 就可以完成该项任务。但是,这样做将会出现 0.8m 的料头。制造 1000 辆汽车将会出现 800m 的料头,如果这些料头不能作其他用途,则相当于浪费了 200 根原材料。那么,有 没有什么办法能减少浪费呢?仔细阅读题目不难发现,需要的是 1.5m、1m、0.7m 的钢轴 各一根,并没有要求这些钢轴来自于同一根圆钢。也就是说,只要获得 1.5m、1m、0.7m
10 运筹学基础及其MATLAB应用 的钢轴各1000根就行了。于是,可以按照这样的思路来考虑:假设在圆钢上的切口厚度 忽略不计,那么,若在一根圆钢上截取2根1.5m、1根1m的钢轴,则没有任何余料,若 在一根圆钢上截取2根1.5m、1根0.7m的钢轴,则只有0.3m的余料把这些方案列 举出来(见表1-1)。只要余料小于0.8m,那么都是比原始想法好的截取方案。这样,通过 各种截取方案获得的1.5m、1m和0.7m的钢轴只要都有1000根,这项任务就完成了。这 样做的目的当然是让产生的余料之和达到最小。于是,可以设x,(亿=1,2,·,10)表示采 用第i种方案时圆钢的数目,则将得到规格为1.5m,1m和0.7m的钢轴分别为: 2x1+2x2+E3+x4+工5 (1.5m钢轴) x1+2x3+I4+4x6+3x7+2x8+xg (1m钢轴) x2+2x4+3x5+x7+2z8+4xg+5x10(0.7m钢轴) 表1-1优于原始方案的下料方案 方案 1 2 3 4 5 67 8 9 10 需求量 钢轴规格/根 1.5m 2 2 1 100000 1000 1m 0 2 1 0 43210 1000 0.7m 0 1 0 2 3 0 1 5 1000 余料/m 00.30.50.10.400.30.60.20.51000 按照这样的做法,将会产生的余料表达式为: 0.3z2+0.5x3+0.1x4+0.4r5+0.3x7+0.6z8+0.2xg+0.5z10 于是,得到该问题的数学模型: minz=0x1+0.3x2+0.5x3+0.1x4+0.4z5+0x6+0.3x7+0.6x8+0.2xg+0.5x10 s.t. 2x1+2x2+ =1000 E1十 2x3十x十 4x6+3x7+2x8+xg =1000 x2十 2z4十3x5十 x7+2x8+4xg十5x10=1000 x≥0(i=1,2,·,10) (1-1-2) 以上两个问题都是求一组决策变量使得某线性函数(称为目标函数)达到最大或最 小的优化问题。这些决策变量满足一定的线性函数,这些函数称为约束条件。这样的问 题就是所谓的线性规划问题。将其推广就得到如下线性规划的一般数学表达:
10 运筹学基础及其 MATLAB 应用 的钢轴各 1000 根就行了。于是,可以按照这样的思路来考虑:假设在圆钢上的切口厚度 忽略不计,那么,若在一根圆钢上截取 2 根 1.5m、1 根 1m 的钢轴,则没有任何余料,若 在一根圆钢上截取 2 根 1.5m、1 根 0.7m 的钢轴,则只有 0.3m 的余料……把这些方案列 举出来 (见表 1-1)。只要余料小于 0.8m,那么都是比原始想法好的截取方案。这样,通过 各种截取方案获得的 1.5m、1m 和 0.7m 的钢轴只要都有 1000 根,这项任务就完成了。这 样做的目的当然是让产生的余料之和达到最小。于是,可以设 xi(i = 1, 2, · · · , 10) 表示采 用第 i 种方案时圆钢的数目,则将得到规格为 1.5m,1m 和 0.7m 的钢轴分别为: 2x1 + 2x2 + x3 + x4 + x5 (1.5m 钢轴) x1 + 2x3 + x4 + 4x6 + 3x7 + 2x8 + x9 (1m 钢轴) x2 + 2x4 + 3x5 + x7 + 2x8 + 4x9 + 5x10 (0.7m 钢轴) 表 1-1 优于原始方案的下料方案 ❳ 钢 ❳ 轴 ❳ 规 ❳ 格 ❳ /根 ❳❳❳❳❳ 方案 1 2 3 4 5 6 7 8 9 10 需求量 1.5m 2 2 1 1 1 0 0 0 0 0 1000 1m 1 0 2 1 0 4 3 2 1 0 1000 0.7m 0 1 0 2 3 0 1 2 4 5 1000 余料/m 0 0.3 0.5 0.1 0.4 0 0.3 0.6 0.2 0.5 1000 按照这样的做法,将会产生的余料表达式为: 0.3x2 + 0.5x3 + 0.1x4 + 0.4x5 + 0.3x7 + 0.6x8 + 0.2x9 + 0.5x10 于是,得到该问题的数学模型: min z= 0x1+0.3x2+0.5x3+0.1x4+0.4x5+0x6+0.3x7+0.6x8+0.2x9+0.5x10 s.t. 2x1+ 2x2+ x3+ x4+ x5 = 1000 x1+ 2x3+ x4+ 4x6+ 3x7+ 2x8+ x9 = 1000 x2+ 2x4+ 3x5+ x7+ 2x8+ 4x9+ 5x10 = 1000 xi > 0(i = 1, 2, · · · , 10) (1-1-2) 以上两个问题都是求一组决策变量使得某线性函数 (称为目标函数) 达到最大或最 小的优化问题。这些决策变量满足一定的线性函数,这些函数称为约束条件。这样的问 题就是所谓的线性规划问题。将其推广就得到如下线性规划的一般数学表达: