1 线性规划
在人们的生产实践中,经常会遇到如何利用现有资源来安排生产,以取得最大经济效益的问题。此类问题构成了运筹学的一个重要分支—数学规划,而线性规划(Linear Programming 简记 LP)则是数学规划的一个重要分支。自从 1947 年 G. B. Dantzig 提出求解线性规划的单纯形方法以来,线性规划在理论上趋向成熟,在实用中日益广泛与深入。特别是在计算机能处理成千上万个约束条件和决策变量的线性规划问题之后,线性规划的适用领域更为广泛了,已成为现代管理中经常采用的基本方法之一。
1.1 线性规划的实例与定义
例 1 某机床厂生产甲、乙两种机床,每台销售后的利润分别为 4000 元与 3000 元。生产甲机床需用 A、B 机器加工,加工时间分别为每台 2 小时和 1 小时;生产乙机床需用 A、B、C 三种机器加工,加工时间为每台各一小时。若每天可用于加工的机器时数分别为 A 机器 10 小时、B 机器 8 小时和C 机器 7 小时,问该厂应生产甲、乙机床各几台,才能使总利润最大?
上述问题的数学模型:设该厂生产 x1 台甲机床和 x2 乙机床时总利润最大,则 x1, x2
应满足
这里变量 x1 , x2 称之为决策变量,(1)式被称为问题的目标函数,(2)中的几个不等式是问题的约束条件,记为 s.t.(即 subject to)。由于上面的目标函数及约束条件均为线性函数,故被称为线性规划问题。
总之,线性规划问题是在一组线性约束条件的限制下,求一线性目标函数最大或最小的问题。在解决实际问题时,把问题归结成一个线性规划数学模型是很重要的一步,但往往也是困难的一步,模型建立得是否恰当,直接影响到求解。而选适当的决策变量,是我们建立有效模型的关键之一。
1.2 线性规划的 Matlab 标准形式
线性规划的目标函数可以是求最大值,也可以是求最小值,约束条件的不等号可以是小于号也可以是大于号。为了避免这种形式多样性带来的不便,Matlab 中规定线性规划的标准形式为
其中 c 和 x 为 n 维列向量, A 、 Aeq 为适当维数的矩阵,b 、beq 为适当维数的列向量。
1.3 线性规划问题的解的概念
一般线性规划问题的(数学)标准型为
可行解 满足约束条件(4)的解 x = (x1, x2 ,L, xn ) ,称为线性规划问题的可行解,而使目标函数(3)达到最大值的可行解叫最优解。
可行域 所有可行解构成的集合称为问题的可行域,记为 R 。
1.4 线性规划的图解法
图解法简单直观,有助于了解线性规划问题求解的基本原理。我们先应用图解法来求解例 1。对于每一固定的值 z ,使目标函数值等于 z 的点构成的直线称为目标函数等位线,当 z 变动时,我们得到一族平行直线。对于例 1,显然等位线越趋于右上方,其上的点具有越大的目标函数值。不难看出,本例的最优解为 x* = (2,6)T ,最优目标值z* = 26 。
从上面的图解过程可以看出并不难证明以下断言:
(1)可行域 R 可能会出现多种情况。R 可能是空集也可能是非空集合,当 R 非空时,它必定是若干个半平面的交集(除非遇到空间维数的退化)。R 既可能是有界区域,也可能是无界区域。
(2)在 R 非空时,线性规划既可以存在有限最优解,也可以不存在有限最优解(其目标函数值无界)。
(3)若线性规划存在有限最优解,则必可找到具有最优目标函数值的可行域 R 的“顶点”。
1.5 求解线性规划的 Matlab 解法
单纯形法是求解线性规划问题的最常用、最有效的算法之一。这里我们就不介绍单纯形法,有兴趣的读者可以参看其它线性规划书籍。下面我们介绍线性规划的 Matlab解法。
Matlab 中线性规划的标准型为
基本函数形式为 linprog(c,A,b),它的返回值是向量 x 的值。还有其它的一些函数调用形式(在 Matlab 指令窗运行 help linprog 可以看到所有的函数调用形式),如:
[x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS)
这里 fval 返回目标函数的值,LB 和 UB 分别是变量 x 的下界和上界,x0 是 x 的初始值,OPTIONS 是控制参数。
例 2 求解下列线性规划问题
解 (i)编写 M 文件
c=[2;3;-5];
a=[-2,5,-1;1,3,1]; b=[-10;12];
aeq=[1,1,1];
beq=7;
x=linprog(-c,a,b,aeq,beq,zeros(3,1))
value=c'*x
(ii)将M文件存盘,并命名为example1.m。
(iii)在Matlab指令窗运行example1即可得所求结果。
例3 求解线性规划问题
解 编写Matlab程序如下:
c=[2;3;1];
a=[1,4,2;3,2,0];
b=[8;6];
[x,y]=linprog(c,-a,-b,[],[],zeros(3,1))
2 运输问题(产销平衡)
例 6 某商品有m 个产地、n 个销地,各产地的产量分别为a1,L,am ,各销地的需求量分别为b1,L,bn 。若该商品由i 产地运到 j 销地的单位运价为cij ,问应该如何调运才能使总运费最省?
解:引入变量 xij ,其取值为由i 产地运往 j 销地的该商品数量,数学模型为
显然是一个线性规划问题,当然可以用单纯形法求解。
对产销平衡的运输问题,由于有以下关系式存在:
其约束条件的系数矩阵相当特殊,可用比较简单的计算方法,习惯上称为表上作业法(由康托洛维奇和希奇柯克两人独立地提出,简称康—希表上作业法)。
3 指派问题
3.1 指派问题的数学模型
例 7 拟分配n 人去干n 项工作,每人干且仅干一项工作,若分配第i 人去干第 j项工作,需花费cij 单位时间,问应如何分配工作才能使工人花费的总时间最少?
容易看出,要给出一个指派问题的实例,只需给出矩阵C = (cij) ,C 被称为指派问题的系数矩阵。
引入变量 xij ,若分配i 干 j 工作,则取 xij = 1,否则取 xij = 0 。上述指派问题的数学模型为
上述指派问题的可行解可以用一个矩阵表示,其每行每列均有且只有一个元素为1,其余元素均为 0;可以用1,L,n 中的一个置换表示。
问题中的变量只能取 0 或 1,从而是一个 0-1 规划问题。一般的 0-1 规划问题求解极为困难。但指派问题并不难解,其约束方程组的系数矩阵十分特殊(被称为全单位模矩阵,其各阶非零子式均为 ±1),其非负可行解的分量只能取 0 或 1,故约束 xij = 0或1可改写为 xij ≥ 0而不改变其解。此时,指派问题被转化为一个特殊的运输问题,其中m = n ,ai = bj =1。
3.2 求解指派问题的匈牙利算法
由于指派问题的特殊性,又存在着由匈牙利数学家 Konig 提出的更为简便的解法—匈牙利算法。算法主要依据以下事实:如果系数矩阵C = (cij) 一行(或一列)中每一元素都加上或减去同一个数,得到一个新矩阵 B = (bij) ,则以C 或 B 为系数矩阵的指派问题具有相同的最优指派。
例 8 求解指派问题,其系数矩阵为
解 将第一行元素减去此行中的最小元素 15,同样,第二行元素减去 17,第三行元素减去 17,最后一行的元素减去 16,得
再将第 3 列元素各减去 1,得
以 B2 为系数矩阵的指派问题有最优指派
由等价性,它也是例 7 的最优指派。
有时问题会稍复杂一些。
例 9 求解系数矩阵C 的指派问题-7-
解:先作等价变换如下
容易看出,从变换后的矩阵中只能选出四个位于不同行不同列的零元素,但n = 5 ,
最优指派还无法看出。此时等价变换还可进行下去。步骤如下:
(1) 对未选出 0 元素的行打∨ ;
(2) 对∨ 行中 0 元素所在列打∨ ;
(3) 对∨ 列中选中的 0 元素所在行打∨ ;
重复(2)、(3)直到无法再打∨ 为止。
可以证明,若用直线划没有打 ∨ 的行与打 ∨ 的列,就得到了能够覆盖住矩阵中所有零元素的最少条数的直线集合,找出未覆盖的元素中的最小者,令 ∨ 行元素减去此数,∨ 列元素加上此数,则原先选中的 0 元素不变,而未覆盖元素中至少有一个已转变为 0,且新矩阵的指派问题与原问题也等价。上述过程可反复采用,直到能选取出足够的 0 元素为止。例如,对例 5 变换后的矩阵再变换,第三行、第五行元素减去 2,第一列元素加上 2,得
现在已可看出,最优指派为
4 对偶理论与灵敏度分析
4.1 原始问题和对偶问题
考虑下列一对线性规划模型:
称(P)为原始问题,(D)为它的对偶问题。
不太严谨地说,对偶问题可被看作是原始问题的“行列转置”:
(1) 原始问题中的第 j 列系数与其对偶问题中的第 j 行的系数相同;
(2) 原始目标函数的各个系数行与其对偶问题右侧的各常数列相同;
(3) 原始问题右侧的各常数列与其对偶目标函数的各个系数行相同;
(4) 在这一对问题中,不等式方向和优化方向相反。
考虑线性规划:
把其中的等式约束变成不等式约束,可得
它的对偶问题是
其中 y1和 y2 分别表示对应于约束 Ax ≥ b 和 − Ax ≥ −b 的对偶变量组。令 y = y1 − y2 ,则上式又可写成
原问题和对偶的对偶约束之间的关系:
例 10 已知线性规划问题
已知其对偶问题的最优解为
试用对偶理论找出原问题的最优解。
4.2 灵敏度分析
在以前讨论线性规划问题时,假定aij ,bi ,c j 都是常数。但实际上这些系数往往是估计值和预测值。如市场条件一变,cj 值就会变化;aij 往往是因工艺条件的改变而改变;bi 是根据资源投入后的经济效果决定的一种决策选择。因此提出这样两个问题:当这些系数有一个或几个发生变化时,已求得的线性规划问题的最优解会有什么变化;或者这些系数在什么范围内变化时,线性规划问题的最优解或最优基不变。这里我们就不讨论了。
4.3 参数线性规划
参数线性规划是研究aij ,bi ,c j 这些参数中某一参数连续变化时,使最优解发生变化的各临界点的值。即把某一参数作为参变量,而目标函数在某区间内是这参变量的线性函数,含这参变量的约束条件是线性等式或不等式。因此仍可用单纯形法和对偶单纯形法进行分析参数线性规划问题。
5 投资的收益和风险
5.1 问题提出
市场上有 n 种资产 si (i =1,2,L,n )可以选择,现用数额为 M 的相当大的资金作一个时期的投资。这 n 种资产在这一时期内购买 si 的平均收益率为 ri ,风险损失率为qi ,投资越分散,总的风险越少,总体风险可用投资的 si 中最大的一个风险来度量。购买 si 时要付交易费,(费率 pi ),当购买额不超过给定值ui 时,交易费按购买ui计算。另外,假定同期银行存款利率是 r0 ,既无交易费又无风险。(r0 = 5%)
已知 n = 4 时相关数据如表 1。
试给该公司设计一种投资组合方案,即用给定资金 M ,有选择地购买若干种资产或存银行生息,使净收益尽可能大,使总体风险尽可能小。
5.2 符号规定和基本假设
符号规定:
基本假设:
1. 投资数额 M 相当大,为了便于计算,假设 M =1;
2. 投资越分散,总的风险越小;
3. 总体风险用投资项目 si 中最大的一个风险来度量;
4. n 种资产 si 之间是相互独立的;
5. 在投资的这一时期内, ri , pi ,qi , r0 为定值,不受意外因素影响;
6. 净收益和总体风险只受 ri , pi ,qi 影响,不受其它因素干扰。
5.3 模型的分析与建立
1. 总体风险用所投资的 si 中最大的一个风险来衡量,即 max{qi xi | i =1,2,L,n}
2.购买 si 所付交易费是一个分段函数,即
而题目所给定的定值ui (单位:元)相对总投资 M 很少, piui 更小,可以忽略不计,这样购买 si 的净收益为(ri − pi)xi 。
3. 要使净收益尽可能大,总体风险尽可能小,这是一个多目标规划模型:
4.模型简化
a) 在实际投资中,投资者承受风险的程度不一样,若给定风险一个界限 a ,使最大的一个风险
,可找到相应的投资方案。这样把多目标规划变成一个目标的线性规划。
模型一 固定风险水平,优化收益
b) 若投资者希望总盈利至少达到水平 k 以上,在风险最小的情况下寻求相应的投资组合。
模型二 固定盈利水平,极小化风险
c) 投资者在权衡资产风险和预期收益两方面时,希望选择一个令自己满意的投资
组合。因此对风险、收益分别赋予权重 s(0 < s ≤1)和(1− s) ,s 称为投资偏好系数。
模型三
5.4 模型一的求解
模型一为:
由于 a 是任意给定的风险度,到底怎样没有一个准则,不同的投资者有不同的风险度。我们从 a = 0 开始,以步长Δa = 0.001进行循环搜索,编制程序如下:
clc,clear
a=0;
hold on
while a<0.05
c=[-0.05,-0.27,-0.19,-0.185,-0.185];
A=[zeros(4,1),diag([0.025,0.015,0.055,0.026])];
b=a*ones(4,1);
Aeq=[1,1.01,1.02,1.045,1.065];
beq=1;
LB=zeros(5,1);
[x,Q]=linprog(c,A,b,Aeq,beq,LB);
Q=-Q;
plot(a,Q,'*r');
a=a+0.001;
end
xlabel('a'),ylabel('Q')
5.5 结果分析
1.风险大,收益也大。
2.当投资越分散时,投资者承担的风险越小,这与题意一致。即:冒险的投资者会出现集中投资的情况,保守的投资者则尽量分散投资。
3.在 a = 0.006 附近有一个转折点,在这一点左边,风险增加很少时,利润增长很快。在这一点右边,风险增加很大时,利润增长很缓慢,所以对于风险和收益没有特殊偏好的投资者来说,应该选择曲线的拐点作为最优投资组合,大约是 a = 0.6% , Q = 20%,所对应投资方案为:
风险度 a = 0.006 ,收益Q = 0.2019,x0 = 0,x1 = 0.24 ,x2 = 0.4,x3 = 0.1091, x4 = 0.2212。