第10章 利用LING0开发高级模型在这一章里,我们将在不同的领域里建立一些高级模型。其目的有两个:一个是通过对这些高级模型的研究,帮助用户提高建模的技巧;另一个是通过LINGO在生产管理、后勤保障、金融、排队和销售等很多领域的实例来说明LINGO应用的广泛性。
10.1 生产管理模型在这一节里,我们将开发生产管理领域里的四个模型。下面分别进行详细介绍:
10.1.1 MODELl:BLEND(原材料混合模型)
1,背景在混合问题中,通常是将两种或多种原材料混合在一起制成一种或多种产品,这种产品要满足一种或多种质量要求。混合问题适用于很多领域,包括决定动物饲料的最佳配比、最低成本的矿石组合以及制造出一种最低成本的特殊合金或决定最有效的广告媒体交易等等。
2,问题假设有一家燃料处理工厂,生产两种产品Regular和Premium,并希望能获得最大的收益。这两种产品都是由丁烷(butane)、催化重整油(catalytic reformats)和石脑油(naphtha)混合而成。它们必须在锌烷(octane)、蒸汽压(vapor pressure)和挥发性(volatility)方面满足一定的要求。每一种原材料都是有限的。而且己知原材料的单位成本和产品的最小需要量和最大需要量。
3,模型
模型10.1.1.1:原材料混合模型BLEND
???
4,集合在这个模型里,我们定义了三个基本集合,即RAWMAT(原材料)、FINGOOD(产品)和QUALMES(质量要素)。
从这三个基本集合可创建三个派生集合。第一个派生集合RXQ是一个密集,它是由原材料集合和质量要素集合相乘而得,用这个派生集合来定义一个属性以表示每一种原材料的质量指标。第二个派生集合QXF是由质量集合和产品集合相乘而得,用这个集合可以计算出产品里的质量指标。第三个派生集合RXF是由原材料集合和产品集合相乘而得,用这个集合可以计算出每一种产品里原材料的含量。
5,变量在这个模型里,主要变量是每一种产品里各种原材料的数量(USED)。为了计算上的需要,我们还增加了两个其他的变量。第一个变量是BATCH,它被用于表示每一种产品的批量大小。第二个变量是QSLACK,它被用于表示每一种产品里的各个质量要素离上限值的松弛量。
6,目标函数这个模型的目标函数是求总收益达到最大。这可以用下面的表达式计算:
[OBJECTIVE]MAX=
@SUM(FINGOOD:PRICE*BATCH)
@SUM(RAWMAT(R):COST(R)*
@SUM(FINGOOD(F):USED(R,F)));
总收益当然是总收入减去总费用。总收入等于每一种产品的单位售价乘上它的批量再求和。可用下面的LINGO语句表达:
@SUM(FINGOOD:PRICE%BATCH)
总费用等于每一种原材料的单位价格乘上所用的总数再求和。它可以用下面的表达式计算:
@SUM(RAWMAT(R):COST(R){
@SUM(FINGOOD(F):USED(R,F))
7,约束
在这个模型里有四种类型的约束,仅仅有两种要计算。第一种要计算的约束是每一种产品的批量。可以用下面的表达式计算:
[BATCOMP]BATCH(F)=@SUM(RAWMAT(R):USED(R,F));
具体说就是:产品F的批量是所有用于产品里的原材料的总和。
第二种要计算的约束是计算每一种产品里的质量指标离质量上限的缺损值。每一种质量指标测定如下:
[QRESUP]@SUM(RAWMAT(R):
QLEVEL(R,Q)* USED(R,F))+QSLACK(Q,F)=QUP(Q,F)*BATCH(F);
具体地说,实际质量指标加上离上限的缺损值等于质量上限指标。
第三种约束是产品的批量必须在限制的范围内。我们用@BND函数建立这一约束如下:
@BND(MINREQ,BATCH,MAXSELL);
注意:虽然我们可以直接输入批量大小限制的约束,但是使用@BND函数限制变量的界限效率更高。
最后一种约束是产品的质量指标必须符合要求。我们使用下面的约束:
[QRESDN]QSLACK(Q,F)<=(QUP(Q,F)-QLOW(Q,F))$BATCH(F);
具体地说,质量指标的松弛量必须小于等于质量指标的最大量与最小量的差值。否则质量指标一定低于最小限量。松弛量非负的事实确保质量指标不会超过最大限量。
8,解答
求解模型可得如下结果:
BATCH(REGULAR) 4000.000
BATCH(PREMIUM) 4095.238
total profit $44,905
下面列出了产品中各种原材料的实际含量:
Raw Material(原材料) Regular Premium
Butane 534 466
Catalytic Reformats 1,516 2.484
Naphtha 1,950 l,146
10.1.2 MODEL2:MRP(物资需求计划模型)
1,背景物资需求计划技术简称MRP,是用于制作复杂产品的生产进度表。假设已知产品的需求进度表、产品及各种部件订货至交货的时间,于是MRP可利用它们提出符合需求进度表的详细及时的生产进度表。
MRP的目的是找到一个符合需求的详细及时的生产进度表。MRP没有试图去寻找总成本最少的生产进度表。在很多情况下,借助于MRP去寻找成本最少的生产进度表是一个很复杂的最优化问题,而且很难实现。
2,问题假设你是一个人力车的制造商,有一个未来产品的需求计划。为了满足生产的需求,你需要知道什么时候需要哪些部件、子部件以及它们的数量。假设你的最终产品有:
(1)单轮脚踏车(有一个座位和一个轮子)——Unicycle
(2)自行车(有一个座位、两个轮子和一根链条)——Bicycles
(3)双座自行车(两个座位、两个轮子和两根链条)——Tandem
每一种产品都是由一些部件组装而成。每一个部件又都是由其他的一些子部件组装而成。为了简单和不失一般性,我们把所有的产品、部件和子部件都看成零件。下面是主要的部件和子部件:
(1)座位——Seats
(2)轮子(有1根轮轴和36根轮辐)——Wheels
(3)链条(有84个链环)——Chins
(4)轮轴——Hubs
(5)轮辐——Spokes
(6)链环——Links
生产每一批零件所用的时间称为定货至交货的时间。当你开始生产一个零件的时候,相应的部件必须及时到位。销售部门对未来两个月(8周)的需求作了预测:第八周需要10辆单轮脚踏车,第九周需要20辆自行车和20辆双座自行车。
3,模型模型10.1.2—1:物资需求计划模型MRP
???
你一定还记得代字号“~”是LINGO的记录结束符号。当遇到一个代字号时,LINGO就停止从数据文件读取数据而开始读取模型文件里的下一个语句。
5,集合在这个模型里我们定义了两个基本集合:一个是零件(PART),另一个是时间周期(TIME)。
用上面两个基本集合又产生了两个派生集合:一个是USES,它是一个密集,由PART与自身相乘而得,我们用这个集合来建造一个包含零件使用数据的表格或称输入输出矩阵,这个表格告诉我们生产一个零件需要多少配件。另一个派生集合是PXT,它是由零件集合与时间周期集合相乘而得,我们需要这个集合是由于我们关心每一时期每一种零件的需要量及每一时期开始生产的每一种零件的数量。
6,变量在这个模型里惟一未知的是总需求属性(TD)。这里TD(p,t)是t时期产品p的总需求。总需求由两个因素决定:一个是外部消费者的需求(ED);一个是内部生产方面的需求。我们借助于合并零件的定货至交货的时间来计算TD。这样,当TD在某一时期为非零时,则生产必须在那一时期开始。
7,公式这个模型的关键公式是:
!对每一零件P和时间周期T,总需求=外部需求+未来一个订货至交货时间父集合的需求;
复制过来???
对每一个时期里的每一种零件而言,必须开始生产的数量在其订货交货时间后要满足:
(1)外部的需求
(2)内部生产的需求表示内部需求的子表达式为:ED(P,T+LT(P))
下面的表达式求出了在一个订货交货时间以外,内部生产需要的所有其余零件数量。
@SUM(USES(P2,P):TD(P2,T+LT(P))*NEEDS(P2,P));
注意:我们在外面@FOR循环函数里还使用了一个逻辑判别式(用黑体显示):
@FOR(PXT(E T)I T+LT(P)#LE#NP:
如果没有这个条件判别式,这个计算将扩展到TIME集合里的最后时期之外。
8,解答求解这个模型,我们将会得到下面的变量TD的非零值解答:
Variable Value
TD(U,7) 10.00000
TD(B,7) 20.00000
TD(T.8) 20.00000
TD(S,6) 30.00000
TD(S。7) 40.00000
TD(W:4) 50.00000
TD(W,5) 40.00000
TD(C,6) 20.00000
TD(C.7) 40.00000
TD(H.3) 50.00000
TD(H.4) 40.00000
TD(P,2) 1800.000
TD(E 3) 1440.000
TD(L,4) 1680.000
T1)(L,5) 3360.000
将上面的解答制成表格就会得到如表10.1所示的生产进度表。
表10.1 MRP生产进度时间(周)
零件(个)
2
3
4
5
6
7
8
Unicvcle
lO
Bicvcles
20
Tandem
20
Seats
30
40
Wheels
50
40
Chains
20
40
Hubs
50
40
Spokes
1.800
1.440
Links
1.680
3.360
见程序
!对于每一个存在优先关系的作业对来说,前者对应的工作站I必须小于后者对应的工作站J:
@FOR(PRED(I,J):@SUM(STATION(K):K{X(J,K)·K}X(I,K))>=0);
!对于每一个工作站来说,指派作业完成的总时间必须小于最大循环时间;
@FOR(STATION(K):
@SUM(TXS(I,K):T(I)}X(I,K))<=CYCTIME);
!目标函数是使最大循环时间达到最小;
MIN=CYCTIME;
!指定X(I,J)为0/1变量;
@FOR(TXS:@BIN(X));
END
4,集合我们定义两个基本集合——TASK(作业)和STATION(工作站)。我们用这两个基本集合产生两个派生集合。第一个派生集合是PRET,它是一个疏集,是由集合TASK与自身相乘而得。集合的元素是作业之间的优先关系,例如,这个集合的第一个元素是(A,B),它表示作业A优先于作业B。
第二个派生集合是TXS,它是由作业集合与工作站集合相乘而得到的密集,我们用这个集合来确定哪一个作业指派给哪一个工作站。
5,变量这个模型的决策变量是属性X。属性X是定义在集合TXS上。X(t,s)是一个0/1变量。如果作业t指派给工作站s,则其值为l;否则其值为0。属性X可用下式限定为0/1变量:
@FOR(TXS:@BIN(X));
为了表示整个装配线的循环时间,我们引进了标量变量CYCTIME,它是通过每个工作站的最大循环时间来计算的。
6,目标函数这个模型的目标函数很简单,它就是使得装配线总体循环时间达到最小值。可用下式给出:
MIN=CYCTIME;
7,约束这个模型的约束有三种:
(1)每一个作业必须指派到一个工作站;
(2)作业的优先关系必须得到满足;
(3)装配线循环时间CYCTIME变量的计算。
下面的表达式求出每一个作业的指派标量的总和并令其值为1。这样就限定一个作业只被指派到一个工作站。
@FOR(TASK(I):@SUM(STATION(K):X(I,K))=1);
我们使用下面的表达式执行作业的优先关系:
@FOR(PRED(I,J):
@SUM(STATION(K):K*X(J,K)-K* X(I,K))>=0);
假设作业I是在作业J之前。如果作业I被错误地指派给了一个工作站,而这个工作站是在作业J指派给的工作站之后。那么,所有K*X(I,K)的总和将超所有K*X(J,K)的总和,约束不会得到满足。这样,上面的约束有效地保证了优先关系。
我们用下面的约束计算循环时间:
@FOR(STATION(K):
@SUM(TXS(I,K):T(I)*X(I,K))<=CYCTIME);
在这个约束里,@SUM(TXS(I,K):T(I)}*X(I,K))为工作站K算出循环时间。我们用@FOR语句使变量CYCTIME大于或等于所有工作站的循环时间。如果我们再加上目标函数使CYCTIME达到最小,CYCTIME将被“压缩”到各个工作站循环时间的最大值。
借助于“压缩”CYCTIME到恰当的值,我们避免了使用@MAX函数。假如我们一定要使用@MAX函数的话,为了把握分段线性函数@MAX,LINGO将不得不求助于非线性求解器。在建模实践中,我们应尽量避免使用非线性模型,这很重要。
8,解答求解模型,我们将会得到下面指派变量X的非零值解答:
Variable Value
X(A,2) 1.000000
X(B,3) 1.000000
X(C,4) 1.000000
X(D,1) 1.000000
X(E,3) 1.000000
X(F,4) 1.000000
X(G,4) 1.000000
X(H,3) 1.000000
X(I,3) 1.000000
X(J,4) 1.000000
X(K,4) 1.000000
概述这个解答,我们有:
Workstation Assigned Tasks Cycle Time
1 D 50
2 A 45
3 B,E,H,I 50
4 C,F,G,J,K 50
整个装配线的循环时间是50分钟,它是所有工作站的最大循环时间。我们得到了一个较为平衡的装配线(只有2号工作站有5分钟的松弛时间)。
10.1.4 MODEL4:ORDER(工件排序模型)
1,背景在工件排序问题中,每个工件将被指派到不同的机床上进行加工作业,目标函数是求出所有工件的加工方案,使在最短的时间内完成全部加工作业。对于每一个工件来说,它要在不同的机床上进行加工作业,而且加工作业还要按一定的顺序进行;对每一个机床来说,它要加工不同的工件,而且必须按照一定的顺序进行。虽然我们无论如何都可以求出工件的加工方案,但是,如果安排不当就必然会出现瓶颈现象——机床等待加工的时间较长。这样就会使得完成全部工件加工的总时间较长。由于工件加工作业之间具有优先关系,有些作业必须等到其他作业完成后才可进行,这使得工件排序问题变得更加复杂。指派到机床上的加工作业必须服从优先关系。
2,问题假设用4台机床加212 3个工件。各个工件的机床加工顺序,以及工件i在机床j上的加工时间(i=1,2,3;j=1,2,3,4)如表10.3所示(单位:小时)。
10.3工件加工顺序及时间表
机床l→
机床2→
机床3→
机床4
工件1
3
4
9
2
工件2
2
6
3
4
工件3
1
2
4
8
我们要找出一种工件加工作业方案使得完成全部工件加工的总时间达到最小。
3,模型模型10.1.4—1:工件排序模型ORDER
4,集合我们定义三个基本集合——GONGJ(工件)、JICHUANG(机床)和SHUIAN(时间)。我们用这三个基本集合产生两个派生集合。一个是LINKS,它是一个密集,是由集合GONGJ与JICHUANG相乘而得。利用LINKS我们产生两个属性,属性A存储工件在每个机床上加工所用时间;属性Y是控制变量。另一个派生集合是GONGSHI,它也是一个密集,是由集合GONGJ和SHIJIAN相乘而得。利用GONGSHI我们产生一个属性x,它表示工件在各个机床上加工的开始时间和结束时间。
5,变量模型里的决策变量是属性X。X(i,1)、X(i,3)、X(i,5)、X(i,7)表示工件i在4个机床上的加工开始时间,X(i,2)、X(i,4)、X(i,6)、X(i,8)表示工件i在4个机床上的加工结束时间(i=1,2,3);当j是奇数时,X(1,j)、X(2,j)、X(3,j)表示机床(j+1)/2加工3个工件的开始时间;当j是偶数时,X(1,j)、X(2,j)、X(3,j)表示机床.j/2加工3个工件的结束时间(j=1,2,…8)。所有的X(i,j)就构成了工件的加工时间表。属性Y是控制变量,只取0/1两个值,用来控制机床加工工件的顺序。
6,数据在此模型中,输入的数据是存放在文件工件排序.xls里的‘加工时间’域上。具体内容见表10.4中的数据部分。
将数据放在模型之外可以使得模型的调试变得很容易。如果加工时间有变化,只要改动表10.4中的数据,模型不需做任何改动就可获得相应的解答。
输入数据是用下面的公式完成:
A=@OLE(’\lingo\工件排序.xls’,’加工时间’);
7,目标函数这个模型的目标很简单,它就是求出加工完全部工件的总时间的最小值。可用下式给出:
min=W;
@for(GONGJ(i):W>=x(i,m+3)+a(i,m));
这里,m表示最后一个机床。
8,约束在这个模型里,我们有下面两类约束:
(1)每个工件加工次序的约束对于每个工件来说,加工次序必须得到满足。即工件i(i=l,2,3)在某个机床上的开始加工时间加上加工所用时间,必须小于等于在下一个机床上的开始加工时间。可以用下式表达:
复制过来
@for(LINKS(i'j)lj规t#m:x(i,纠一1)+a(蝎)<--x(i,2凇j+1));
(2)每个机床加工次序的约束对于每个机床来说,某一时刻只能加工一个工件。例如,我们只考虑工件1和工件2在机床1上的加工情况,则必须满足:X(1,1)+a(1,1)≤X(2,1)或X(2,1)+a(2,1)≤X(1,1)。我们可以用下式表达机床加工次序的约束:
复制过来??
@for(GONGJ(k)Ik#1饼s:
@for(UNKS(i’j)li册防s—k+1:
x(i,2巧一1)+a(i,j)<=x(i+k,2q一1)+1000木y(i+k一1'j)));
@for(GONGJ(k)Ik#1饼s=
@for(LINKS(i'j)Ii#1饼s_k+1,t
x(i+k,2木j一1)+a(i+k'j)<=x(i,2巧一1)+1000$(1一y(i+k一1'j))));
!限制y(i’j)为O一1变量;
@for(GONGJ(i):@for(JICHUANG(j):@bin(y(i'j))));
9,解答模型求解后,我们将解答送回到文件工件排序.xls里的‘起止时间’域上。可用下式完成:
@OLE(’\1ingo\工件排序.xls’,’起止时间’)=x
输出的具体结果如表10.4所示的数据部分。
表10.4工件加工时间表
机床 1
机床 2
机床 3
机床 4
开始时间
结束时间
开始时间
结束时间
开始时间
结束时间
开始时间
结束时间
工件l
3
6
9
13
13
22
22
24
工件2
l
3
3
9
9
12
15
19
工件3
O
l
1
3
3
7
7
15
10.2后勤保障模型在这一节里,我们将开发两个后勤保障方面的模型。一个涉及工厂定位,一个涉及网络的最短线路。
lO.2.1 MODEL5:cAPLOC(工广定位模型)
1,背景工厂定位模型是我们在第1章中介绍的有关运输问题的推广。工厂定位问题具有较大的决策范围,工厂位置是变量。厂商很可能会遇到这样一类问题:在满足顾客对产品要求的前提下使总运输成本达到最少。
2,问题某公司计划增加一些产品加工点(工厂),有三个位置可供选择。现有四个客户需要该公司的产品且需要量已知。在每一个位置建立工厂都有与其关联的月运作费用,从工厂到客户的运输成本也不相同。此外,工厂的运输能力也是有限的,不得突破它的生产能力。
现在需要决定哪些工厂要开工?开工的工厂给每一个客户运送多少产品使得总运输成本和工厂月运作费用之和最少。
3,模型模型10.2.1—1:工厂定位模型 CAPLOC
4,集合在这个模型里,我们建立了两个基本集合:一个是PLANTS(工厂)集合;一个是CUSTOMERS(客户)集合。用这两个集合,我们建立了一个密集ARCS,它是由工厂集合与客户集合相乘而得。我们用个集合来表达工厂与客户之间的运输线路。
5,变量在这个模型里,我们有两类决策变量。定义在集合ARCS上的属性VOL代表了工厂到客户每一个线路上的运输量;定义在集合PLANTS上的属性OPEN是用于表示哪些工厂将开工。具体地说,如果工厂p将开工,则OPEN(p)的值为l,否则为0。属性OPEN的元素将用下式定义为二元0/1变量:
@FOR(PLANTS:@BIN(OPEN));
6,目标函数这个模型的目标函数是使得总成本(运输总成本加上运作成本的总和)达到最少。这可以用下面的表达式计算:
[TTL_COSTlMIN=@SUM(ARCS,COST*VOL)+
@SUM(PLANTS:FCOST*OPEN);
目标函数里运输总成本是@SUM(ARCS,COST*VOL);而运作成本总和是@SUM(PLANTS:FCOST*OPEN)。
7,约束这个模型有两种类型的约束:第一种是每个客户必须得到足够的产品以满足需求;第二种是每个工厂的运输量不能超过它的生产量。
我们使用下面的表达式保证所有客户都可以获得足够的产品:
@FOR(CUSTOMERS(J):[DEMAND]
@SUM(PLANTS(I):VOL(I,J))>=DEM(J));
对每一个客户,我们计算出了接收运输量的总和,并且让它大于或等于客户的需求量。为了限制工厂的运输量不超过它的生产能力,我们使用下面的语句:
@FOR(PLANTS(I):[SUPPLY]
@SUM(CUSTOMERS(J):VOL(I,J))<=
CAP(I){OPEN(I)
);
对于每一个客户,我们计算出了运输量的总和,并且让它小于或等于工厂的生产能力乘上表示工厂开工与否的指示器OPEN。
注意:为了使工厂可以运出产+品,在这些约束里的二元变量OPEN必须取1的值。
8,解答
求解模型,我们将得到下面的工厂定位模型的解答:
Optimal solution found at step, 38
Objective value, 327.0000
Branch count, 3
Variable Value
OPEN(P1) 1.000000
OPEN(P3) 1.000000
VOL(P1,C1) 15.00000
VOL(P1,C2) 17.00000
VOL(Pl,C4) 3.0000
VOL(P3,C3) 22.00000
VOL(P3,C4) 9.000000
我们让工厂1和工厂3。从工厂1开工,我们分别运出15,17和3个单位给客户l,2和4;从工厂3,我们运出22个单位给客户3,运出9个单位给客户4。
复制过来
4,集合我们只建立一个基本集合CITIES,它代表了网络里的城市。我们用这个基本集合派生出一个集合ROADS,它代表了城市之间的连接。我们直接给出ROADS中的元素。所以,ROADS是一个疏集。
5,变量定义在CITIES集合上的属性F是用来存储每一个城市到终点城市的最短距离。定义在ROADS集合上的属性D表示两个城市之间的直达距离。
6,公式我们使用下面的语句计算各城市到城市10的最短距离:
复制过来
@FOR(CITIES(i)I i∥L]滞@SIZE(CITIES):
F(i)=@MIN(ROADS(i,j):D(i,j)+F(j))
);
7,解答
求解模型,我们就会得到下面的结果:
Variable Value
F(1) 19.00000
F(2) 19.00000
F(3) 14.00000
F(4) 20.00000
F(5) 8.000000
F(6) 7.000000
F(7) 12.00000
F(8) 5.000000
F(9) 2.000000
F(10) 0.000000
从城市1到城市10的最短距离F(1)为19。好奇的读者可发现相应的最短线路为:
(城市)1—3—5—8—10。
10.3 财政金融模型在这一节里,我们将开发一些与财政金融有关的模型。
10.3.1 MODEL7:GENPRT(Markowitz投资选择模型)
1,背景
1952年3月在美国的《金融》杂志上,Harry M.Markowi~发表了一篇题为“投资选择”的文章。在这篇文章里,他论证了如何通过选择那些相关程度不大的投资来减少资产投资的风险。与此同时,为了在风险和利润之间建立一个有利关系,他还拟定了一个基本原则:这就是众所周知的投资多样化。换句话说,就是不要将所有的“鸡蛋”放在一个“篮子”里。
理解Markowittz投资模型的关键是统计量:投资方差。从数学上看,投资方差是:
这里,Xi是用于第i项投资的投资额,如果i不等于j,则 ij是第i项与第j项的协方差;如果i等于j,则0;;是第i项投资的方差。
方差是表示利润波动的平均值。方差越大,投资风险就越大。协方差是表示一种股票的利润波动与另一种股票利润波动的相关性。协方差较大,则表明一种股票利润的增加很可能会带动另一种股票利润的增加。协方差接近0,则意味着两种股票的利润变化彼此独立。一个负的协方差意味着一种股票利润的增加可能会导致另一种股票利润的减少。
Markowi~模型是寻求最小投资方差的投资方案,同时使得所有期望利润总和达到一定水平。
2.问题假设你正在考虑向三种股票进行投资。通过历史资料,你计算出了一个期望利润、利润方差和各种股票之间利润的协方差。你希望通过向三种而不是一种股票投资来降低风险。你计划让利润增加12%。那么,为了达到这一目标并且使投资风险最小,你应该如何分配你的资金向三种股票投资?作为一种安全上的考虑,你规定任何一项单独的投资不得超过投资总额的75%。
3,模型模型10_3.1-l:Markowitz投资选择模型 GENPRT
4,集合我们定义了一个基本集合ASSETS,它表示模型里的三种股票。利用这个集合的自乘,我们派生了一个密集COVMAT,用来定义协方差矩阵。
5,属性在这个模型里,我们定义了4个属性。前3个属性RATE、UB和v用于存储数据。RATE存储每一种投资的期望利润,UB存储投资中用于某一项投资的上限值,而v存储协方差矩阵。
注意:协方差矩阵是对称的。在大型的投资模型里,这个矩阵只给出一半就行了,而在这个模型里,为了简单起见我们给出了整个矩阵。
最后一个属性x构成了这个模型的决策变量。具体地说,x(i)是表示用于第i项投资的投资比例。
6,目标函数这个模型的目标函数是使得投资风险达到最小。正如上面提到的,我们用投资方差来表示投资风险。从而得到下面的目标函数:
[VAR]MIN=@SUM(COVMAT(I,J):
V(I,J){X(I)%X(J));
7,约束我们有三种形式的约束:
(1)我们必须将资金全部用于投资;
(2)我们不可能在某一项上投资过多;
(3)期望利润必须达到或超过目标利润率,我们的目标利润率为12%。
使用下面的表达式可将所有的资金用于投资:
[FULL]@SUM(ASSE~X)=l;
具体地说,所有各项投资的比例之和必须等于1。如果没有这个约束,LINGO将试图寻求方差更低的投资方案。你可以将这个约束去掉,运行模型试试结果。
我们用下面的表达式保证对某项目的投资不至于太多:
@FOR(ASSET:@BND(O,X,UB));
用@BND函数限制变量的界限是最有效的方法。
我们用下面的表达式迫使投资的期望利润大于或等于目标利润:
[RET]@SUM(ASSET:RATE}X)>=GROWTH;
式左边是期望利润率,它是各项投资利润率与投资比率相乘相加的结果。
8,解答求解模型,我们将得到下面的MarkowitZ投资选择模型解答:
Optim~solution found at step,7
Objective value, 0.4173749
Variable Value
X(1) 0.1548631
X(2) 0.2502361
X(3) 0.5949008
Row Slack Or Surplus
VAR 0.4173749
FULL 0.0000000
RET 0.2409821E-01
投资方差达到最小值0.4174,此时用于第一种股票的投资为15.5%;第二种股票的投资为25%;第三种股票的投资为59.5%。
10.3.2 MODEL8:PRTSCEN(随机投资选择模型)
1,背景假设有一系列随机事件,每个事件的发生都会对投资利润有一定的影响。例如,增加利润率或中东战争等等。在随机投资选择模型里,建模者要处理一系列的随机事件,每一个随机事件在未来投资期里将以一定的概率发生。假设我们知道未来会有哪些随机事件及它们发生的概率,我们的目标是选择一个风险最小的投资方案,同时保持一定的利润水平。
在上面提及的Markowitz投资模型里,我们使用投资方差作为衡量风险的标准。然而,投资方差不是衡量风险的惟一标准。方差是表示利润偏离平均值的幅度。作为一个统计量,一个方差既可以表示利润超过平均值的20%,同时也可以表示利润不足平均值的20%。同大多数投资者一样,你一定会对利润低于平均值的风险感到焦虑。在我们的随机投资模型里,将通过增加两个新的风险指标来扩大我们的选项。这两个新的风险指标一个是下侧风险,一个是半方差风险。它们都注重考虑目标水平以下的利润。
下侧风险和半方差风险仅仅考虑那些利润低于目标的选项。下侧风险是表示目标与低于目标的利润之差的期望值;而半方差风险则是表示目标与低于目标的利润之差平方的期望值。所以,当存在较大不足时,半方差风险的值将是相当大的。
2,问题你将再一次考虑向三个股票ATT、GM和USX进行投资。你已经确定在未来的投资期里会有12个可能的随机事件。而且,你也预测了当随机事件发生时每一种股票利率的变化情况。对于投资,你希望增加15%的利润。你的目标是通过使用三个不同的风险指标——方差风险、下侧风险和半方差风险来建立一个期望风险最小的投资方案,同时保持利润的期望值达到一定的水平。
4,集合我们定义了两个基本集合——SCENE和STOCKS。集合SCENE表示12个随机事件,而集合STOCKS是表示三个待选的股票。我们用这两个集合相乘形成了一个密集SXI。对每一个事件下的每一种股票,我们将用集合SXI来建立一个利润表。
5,属性我们对随机事件集合定义了4个属性——PRB,R,DVU,DVL。PRB存储随机事件发生的概率,R存储每一个随机事件发生时投资于三种股票的期望利润值,对于每一个随机事件和股票分配计划,DVU为存储期望利润高于平均利润时的偏差值,DVL为存储期望利润低于平均利润时的偏差值。
属性x是定义在股票集合上。x表示向每一种股票投资的比例。X的元素必须被确定,它们构成了模型的决策变量。
最后,在集合SXI上我们定义了属性VE,它用来存储一张表格,表格里的每一行显示在随机事件发生的条件下每一种股票的利润。
6,目标函数在这个模型里,我们的目标是使投资风险达到最小。目标函数的默认设置是下面的方差达到最小:
[0BJ]MIN=VAR;
为了用其他两个风险指标进行求解,可以简单地将上面的变量名VAR替换为SEMIVAR或DNRISK。
7,公式在这个模型里,我们使用了6个公式:
(1)计算期望利润率(AVG)。
(2)迫使期望利润率超过我们的目标。
(3)计算在每一个随机事件下的期望利润率(R)。
(4)计算在每一个随机事件下的期望利润率与平均利润的偏差(DVU和DVL)。
(5)完成全部投资。
(6)计算三个风险指标(VAR、SEMEVAR和DNRISK)。
下面的表达式将计算出整个投资的期望利润率:
AVG=@SUM(SCENE:PRB%R);
我们是用每一个随机事件发生下的期望利润(R)与相应的概率(PRB)相乘再求和来计算出AVG的。我们用下面的约束来迫使期望利润大于或等于我们的目标:
AVG>=TARGET;
事件S下的期望利润是用下面的公式计算的:
R(S)=@SUM(STOCKS(J):VE(S,J)%X(J));
上式表示每一种股票的利润与相应的投资比例相乘再求和。每一个随机事件下的期望利润与平均利润的偏差可用下式计算:
DVU(S)-DVL(S)=R(S)一AVG
如果某个事件的期望利润大于平均利润,则DVU将是正数;如果某个事件的期望利润小于平均利润,则DVL将是正数。假设DVL和DVU都将影响目标函数,当DVU和DVL都大于0时不会有最优解。如果两个都大于0,则可以通过将其中的一个变为0而得到一个更好的解。基于上面的假定,我们将所有的偏差分为两大类。DVU代表了高于平均值的偏差(上偏差),它只用于方差指标的计算;另一方面,DVL代表了低于平均值的偏差(下偏差),它将被用于下侧风险指标和半方差指标的计算。
下面的约束将迫使我们进行充分地投资,它与Markowitz模型里的约束相同:
@SUM(STOCKS:X)=1;
我们用下列公式计算三个风险指标:
[VARI】VAR=@SUM(SCENE:PRB{(DVU+DVL)“2);
[SEMI】SEMIVAR=@SUM(SCENE:PRB$(DVL)“2);
【DOWN]DNRISK=@SUM(SCENE:PRB$DVL);
每一个公式都是由偏差变量的函数与相应的概率相乘再求和。方差指标是用上下偏差之和的平方;半方差指标是下偏差的平方;下侧风险指标是用下偏差而没有平方。
8,解答如果我们用三个风险指标求解模型,将会得到下面的解答:
Variance(方差) Semi-variance(半方差)Downside Risk(下侧风险)
ATT,530, 575 .511
GMT 357 .039 .489
1JSX 1 1 3 3R6 .000
用于股票ATT的投资比例是相当固定的。然而,用于股票GMT和USX的投资比例随着风险指标的变化将会发生很大的变化。
10.3.3 MODEL9:OPTION(优先认股权价格模型)
1,背景股票优先认股权是一个金融手段,它允许拥有者在截止日期之前以一个给定的价格(实行价格)购买一部分股票。一个常见的问题是“人们愿意出多大的价格来购买这样一个优先认股权?。我们可以容易地确定出人们愿意出价的范围。
假设一种股票的价格是$105,我们有机会购买优先认股权,实行价格是$100。我们至少愿意出价$5购买优先认股权,这是因为我们可以用$100的价格将股票买进,然后立刻以$105的价格卖出,最少可获利$5。所以,当股票的价格超过了它的实行价格时,我们至少愿意付出两个价格之间的差价。
当实行价格超过股票价格时,用实行价格买进再以市场价格卖出一定不是一个聪明的选择。在这种情况下,人们愿意付出的最小价格应该是$0。
无论如何,大多数人愿意为一个优先认股权付出的最大价格应该是股票的现行价格。假设优先认股权的价值高于现行股票价格与实行价格的差值。那么,我们就可以通过以一个较低价格购买股票来获得同样可观的期望利润。
如图10.3所示的图形说明了优先认股权价值的变化界限是股票价格的函数。
很不幸,这些界限比较松散。事实上,优先认股权的价值函数与图中的曲线P类似。这个曲线的形状受另外三个因素的影响。它们是:
(1)截止时间,
(2)股票价格的变更率或方差,
(3)利率。关于曲线P的基本公式直到1973年才被Fischer Black和Myron Scholes发现。1997年,由于在这方面的杰出贡献,他们被授予了诺贝尔经济学奖。
2,问题假设你认为NSM(国家半导体股票)将会上涨。为此,你愿意买下股票NSM的优先认股权。利用联机服务查询NSM 认购权的报价,你发现NSM 优先认股权正在以每股$6.625 的价格进行交易。这些股票优先认股权具有$40 的实行价格和133 天的认购时间。NSM 股票的现行价格是$40.75 。那么,NSM 优先认股权的交易价格是否公平?
3,模型模型10.3.3-1,优先认股权价格模型OPTION
4,集合与属性在这个模型里,只有一个基本集合WEEK,它表示有股票价格的27 个星期。在这成集合上,我们定义了两个属性P 和LOGP 。P 用于存储NSM 的原始价格资料,而LOGP用于存储价格的对数。
5,公式我们将简要地讨论模型里关键公式的结构。然而,公式理论上的推导超出了本书的范围。
在这个模型里,我们将分两步来计算优先认股权的价值。
第一步,我们将计算下面z的值:
Z=((I+YVAR/2)$
T+@LOG(S/K))/(YSD$T^.5)
这里,
I = 年利率
YVAR=股票价格的方差
T = 到达截止日期的时间(用年计算)
S =现行的股票价格
K =实行的股票价格
YSD=股票价格的标准差
第二步,我们用z的值及下面的公式计算优先认股权的期望值:
VALUE=S*@PSN(Z)一K%@EXP(一I}T)%
@PSN(Z-YSD%T^.5);
这里,
@PSN(z)= 标准正态分布分布函数在z点的值
@EXP(X)= e的x次方。
6,解答求解模型,可得出NSM优先认股权的价值为$6.575,它与报价$6.625相差不多。
10.3.4 MODELl0:PBOND(国债投资最优化模型)
1,背景在某些情况下,一个公司或某个人也许在未来一定时期里会面临一些债务。为了应付这些未来的债务,债务人可以确定一个最小成本的资产组合(例如,现金和国债)来偿还未来一系列的付款。有时,这个问题被归类于现金流匹配问题或债务废止问题。
2,问题假设你是国家彩票办公室主任。彩票奖金不是立刻全部兑付,而是在15年之内逐年兑付。已知在未来15年内每年为支付奖金所需要现金的确切数字。你打算用彩票收入的一部分来购买可靠性较好的国债,用以偿还未来一系列的付款。彩票收入的多余部分都将上缴国家用来资助教育基金。你应该将尽可能多的彩票收入上缴国家,所以,你计划购买一个成本最小的国债组合以应付未来对现金的需求。
如表10.5所示是未来15年内每年所需现金(用来支付奖金)的具体数目(单位:百万)。
表10.5 现金需求表年
0
1
2
3
4
5
6
7
8
9
10
ll
l2
l3
l4
需求
l0
ll
l2
14
15
l7
l9
20
22
24
26
29
3l
33
36
表10.6 国债信息表国债
年限
价格($ M )
息票($ M )
A
6
98
.06
B
13
.965
.065
对于没有用于购买国债的基金,可以用作短期存款。估计未来15年内,短期存款利率将在4 %左右。
那么,为了偿还将来的奖金款且使总费用达到最小,每一种国债要购买多少?短期存款需要多少?
3.模型模型10.3.4-1,国债投资最优化模型PBOND
4,集合我们定义两个基本集合——'BOND和PERIOD。集合BOND代表两种股票;集合PERIOD代表了未来15年的各个时期。
5,属性我们在集合BOND上定义了4个属性——MATAT、PRICE、CAMNT和BUY。MATAT存储了国债的期限,PRICE存储了国债的价格,CAMNT存储了国债的息票总数,BUY存储了购买每一种股票的数量。
属性NEED和SINVEST是定义在集合PERIOD之上的。NEED存储了每一时期的现金需求,SINVEST存储了每一时期短期存款的数量。
6,目标函数这个模型的目的是使初始现金费用达到最小。初始现金费用是存储在变量LUMP里的。这样,我们的目标函数就可以简单地描述如下:
MIN=LUMP;
7.公式在这个模型里,有三种公式:
(1)计算初始现金费用(LUMP)。
(2)一个时期所有现金来源等于同一时期现金的使用量(sources=uses)。
(3)关于BUY变量的正整数约束,它限制我们仅仅购买整量国债。
下面的表达式计算出初期现金费用总和:
LUMP=NEED(1)+SINVEST(1)+@SUM(BOND:PRICE:Ic BUY);
初期的现金需求有三个目的:
(1)支付初期彩票奖金(NEED(1))。
(2)建立短期存款基金(sINVEST(1))。
(3)购买国债(@sUM(BOND:PRIcE%BuY))。
在其余的14个时期,现金来源必须等于现金的使用量。我们可用下式达此目的:
@FOR(PER/0D(I)I I孝GT#1:
@SUM(BOND(J)IMATAT(J)群GE秽I:
CAMNT(J)$BUY(J))+
@SUM(BOND(J)lMATAT(J)为吧Q孝I:
BUY(J))+(1+STRTE):}:S玳VEST(I—1)=NEED(I)+SINVEST(I);
);
一个时期的现金有三个方面的来源:
(1)息票收入:
@SUM(BOND(J)l MATAT(J)帮GE#L CAMNT(J)}BUY(J))
(2)到期国债:
@SUM(BOND(J)lMATAT(J)为‘EQ孝L BUY(J))
(3)从前一个时期过来的短期存款:
(1+STRTE)%SINVEST(I一1)
上述现金必须等于下面的两项费用支出:
(1)彩票奖金:NEED(I)。
(2)短期存款投资:s玳VEsT(I)。
最后,限制国债的购买量一定是一个整数:
@FOR(BOND(J):@GIN(BUY(J)));
8,解答如果我们求解模型,将会得到下面的国债投资最优化模型的解答:
optimal s01ution flound at step,28
Objective value, 1 95.7265
Branchcount" 3
t Variable Value
LUMP 195.7265
BUY(A) 96.00000
BUY(B) 90.00000
SINVEST(1) 4.796526
SINVEST(2) 5.598387
SINVEST(3) 5.432322
SINVEST(4) 3.259615
SINVEST(5) 0.000000
SINVEST(6) 90.61000
SINVEST(7) 81.08440
SINVEST(8) 70.17778
SINVEST(9) 56.83489
SINVEST(10) 40.95828
SINVEST(11) 22.4466 1
SINVEST(1 2) 0.1 944784
SINVEST(1 3) 65.05226
SINVEST(14) 34.65435
SINVEST(15) 0.4052172E-01
你可以用$1,957,300,000的初期现金来支付未来$3,190,000,000的债务。为此,你必须购买A种国债$960,000,000和B种国债$900,000,000,同时存入$48,000,000的短期存款和支付初期彩票奖金$100,000,000。
10.4 排队等待模型在这一节里我们将介绍排队等待方面的四个模型,理论上的详细推导从简。
10.4.1 MODELll:EZQUEUE(Erlang排队模型)
1,背景长期以来,电话、通信和计算机工业一直使用排队模型来估计面对随机需求时一个服务系统的性能。两个最常用的模型是Erlang损失模型和Erlang等待模型。无论是哪一个模型,顾客都将随机地到达一些独立的服务器。在Erlang损失模型里,没有排队。所以,任何发现所有的服务器都在忙碌的顾客将会离去。而在Erlang等待模型里,有一个无限的排队空间。所以,任何发现所有服务器都在忙碌的顾客将会等待,一直到有一个服务器空闲为止。无论哪种情况,主要性能指标是发现所有服务器都在忙碌的顾客人数。
为了计算系统的性能,我们必须知道系统单位时间的负载和服务器的数量。负载是无单位的,它表示单位时间里工作量的指标。例如,如果每小时有20个顾客达到,每个顾客需要半个小时,那么,达到负载就是10(每小时达到顾客数20乘上每位顾客需要的时间0.5)。对于这两种情况,最关键的假设是:单位时间达到的人数是服从具有常数平均值的Poisson分布。等待情况(有一个排队)进一步要求服务时间服从指数分布。如果负载记为AL,服务器的数量记为NS,则在损失情况下发现所有服务器都在忙碌的期望人数比可用@PEL(AL,NS)算出;而在等待情况下发现所有服务器都在忙碌的期望人数比可用@PEB(AL,NS)算出。
2,问题假设你正在管理一个顾客服务部门。平均每小时会有25个顾客,接待一个顾客平均需要6分钟。如果要想使等待的顾客数不超过5%,那么,至少需要多少个服务器?
3,模型模型10.4.1一l:Erlang排队模型1 EZQUEUEl
4.解答
下面是Erlang排队模型的解答:
Feasible solution found at step,0
Variable Value
AR 25.00000
STM 6.000000
STH O.1000000
FB 0.5000000E-01
NS 5.475485
由于服务器的数值不能是小数,所以我们至少需要6个服务器,才能使等待的顾客数不超过5%。
假设你安装了足够数量的引入线路,使得发现所有服务器都在忙碌的顾客可以等待。而且,你将继续使用6个服务器。你要知道下面的数据:
(1)发现所有服务器都在忙碌的顾客比。
(2)等待顾客的平均等待时间。
(3)平均等待时间。
(4)平均等待人数比。
将前面的模型进行改进就可以计算出这4个统计量,详见模型10.4.1-2。
模型10.4.1—2:Erlang排队模型2 EZQUEUE2
注意:为了计算出存在排队情况下发现所有服务器都在忙碌的顾客人数比,我们使用的是@PEB函数而不是@PEL函数。求解修改后的模型,我们将得到下面的解答:
Variable Value
AR 25.00000
STM 6.000000,
STH 0.1000000
NS 6.000000
FB 0.474448 1E-01
WAITC 0.2857143E-01
WAITU 0.1 355566E-02
NWAIT 0.3388915E-01
从上面的解答可知:大约有4.7%的顾客在等待;等待顾客的平均等待时间为1.7分钟;所有顾客的平均等待时间为0.8分钟;平均有0.34个人在等待。
注意:时间单位是小时,所以期望等待的时间是0.02857.60=1.7分钟。
10.4.2 MODELl2:EZMREPAR(机器修理工排队模型)
1,背景这个排队模型说明了一个有限用户的服务需求模式。基本的假设是:如果有相当的用户在等待服务,那么进一步要求服务的用户比率将会减少,这一现象直到有较多的用户接受服务为止。这时才会有更多的用户要求服务。由于你可以将要求服务的用户看成一些机器,这些机器只是偶尔发生故障需要修理,所以,这一类模型称为机器修理工排队模型。
服务器被认为是修理工。在给定机器数量、修理工人数和排队有限负载的情况下,@PFS(Poisson有限源)函数可计算出正在修理的机器数量的期望值和正在等待修理的机器数量的期望值。下面的模型是为了模拟一个计算机分时系统,它可说明@PFS函数的作用。
每一个引入端口可以被认为是一个用户。通常,引入端口的数量是有限的。所以,有限源的假设可以成立。
2,问题假设你正管理着某公司的会计部门。你计划安装一台新的服务器来处理本部门曰渐增长的计算需求。然而,你对提供计算服务的服务器是否能应付当前和未来的需求表示怀疑。
假设部门有32个雇员(用户),他们将在整个工作时间连续不断地使用服务器。你做了一些研究,认为每个雇员(用户)每隔40秒就会提出一个请求。服务器处理一个请求的平均时间为2秒钟。问题是提供的服务器是否有足够的能力完成整个部门的需求?
3,模型模型10.4.2.1:机械修理工排队模型EZMREPAR
4.解答
下面是机械修理工排队模型的解答:
Variable Value
MTBF 40.00000
MTTR 2.000000
NUSER 32.00000
NREPR 1.000000
NDOWN 12.06761
FR 0.4983098
MTD 24.21707
可以认为这是一个负载很重的系统。平均起来,大约有12个用户等待服务。即便单独处理一个请求的时间为2秒,但是整个系统平均起来处理一个请求的时间为24秒。如果再增加一个服务器,则平均只有3个用户等待服务,整个系统处理一个请求的时间仅为3.65秒。
10.4.3 MODELl3:QUEUEM(稳定状态排队模型)
1.背景处理一般的排队模型有一个基本的原理,它就是进出速度相等原理(RIRO)。这个原理起源于一个排队系统的一系列稳定状态方程。RIRO假设:一个系统可以达到一个平衡状态。在平衡状态里,一个状态的移出速度必须等于那个状态的移入速度。假设稳定状态方程都出自这个假定,那么,我们就可以计算出一个系统在任何状态下的概率。
在下面的问题里,假设一个系统有若干个服务器和成批到达的“用户流”。
2,问题假设你正管理着一个发动机修理公司,该公司为某个州的汽车修理厂服务。发动机用卡车成批地运来。每辆卡车最多可运4台发动机。平均起来,一天有1.5批。一辆卡车装有1、2、3、4台发动机的概率分别为0.1、0.2、0.3、0.4。你现在有5个工作站,每个工作站一天可以重新安装2台发动机。
你想引入一个优先服务业务以保证用户可以一天之内返回。当然,这项业务的服务费用也是很高的。为了进行这项业务,你必须保证每天至少有一个工作站有90%的自由时间来处理这项优先业务。你现有的装备能够达到这一服务水平吗?
3,模型
4,公式模型计算出P(i)的概率,i=1,2,…,41。这里,P(i)是系统有i_1个发动机正在等待修理的概率。我们选择到41为止是由于有40台以上的发动机等待修理的概率几乎是0。
为了求解41个未知的P(i),我们将需要41个方程。其中有一个方程可以从概率之和等于1而获得:
@SUM(STATE:P)=l;
其余40个方程将来白于稳定状态的假设:在任何一个状态下,用户进入速度必须等于用户离开速度。我们将这些平衡方程分为两大类。在第一类里,其状态为:发动机的数量小于或等于服务器的数量。这一类的平衡方程是:
@FOR(STATE(N)I N棚正孝S:
P(N)}((N—1):l:MU+LMDA)=
P(N+1)%MU}N+
LMDA女@SUM(BSIZE(I)I I孝IJ孝N:A(I){P(N—I))
);
对发动机的数量小于或等于服务器的数量的状态,我们建立起等式:状态的流出速度
P(N)%((N-1)%MU+LMDA)
等于状态的流入速度
P(N+1)}MU:l:N+
LMDA术@SUM(BSIZE(I)I I棚孝N:A(I)术P(N—I))
同样,对发动机的数量大于服务器的数量的状态,可以产生下面的平衡方程:
@FOR(STATE(N)I N孝GT孝S#AND#N为‘I刁W LAST:
P(N):lc(S{MU+LMDA)=
P(N+1)$MU:l:S+
LMDA:l:@SUM(BSIZE(I)I I群IJ孝N:A(I):Ic P(N—I))
);
5,解答现将稳定状态排队模型的解答中关于P 的前10 个数值列表如下:
丫址iable 为恤lue
LMDA 1,50 ( ) ( X ),)
55,,X ) 0 ( ) 0 (〕
MU 2,0000 ( X )
LAST 4l,0O0 ( ) 0
P ( l ) 0,2450015
P ( 2 ) 0,1837511
P ( 3 ) 0,1515947
P ( 4 ) 0,1221179
P ( 5 ) 0,9097ll6E 一01
P ( 6 ) 0,5707410E 一01
P ( 7 ) 0,4276028E 一01
P ( 8 ) 0,3099809E 一01
P ( 9 ) 0,2187340E 一01
P ( 10 ) 0,1538 ( X ) 3E 一01
至少有一个工作站处于自由状态的概率等于系统只有4 个或少于4 个发动机的概率,后者等于前5 个P ( i )的和(0,7934 )。这种情况下可以计算出只有70 %的时间保证至少有一个工作站可用。用这个模型进行增加工作站的实验将会发现:要想实现优先服务的计划至少需要7 个工作站。
10.4.4 MODEL14,PKMX (排课模型)
1,背景所谓排课问题就是将n 个班级快速、合理地安排在n 个教室里上课。在现实生活中,这是一个普遍存在的问题。从表面上看,这个问题似乎很简单,其实也不尽然。教室有大有小,班级也有大有小。当班级总数和教室总数很大时,要想快速、合理、高效地排课也是很困难的。针对这一问题,我们提出了排课规则,定义了排课“费用”,结合Excel,给出了排课问题的数学模型。利用它,我们就可以快速、合理、高效地完成排课任务。2,问题假设有5 个班级要安排到5 个教室里上课,班级人数和教室容量如表10,7 所示。
表10.7 班级人数和教室容量教室
Al
A2
A3
A4
A5
教室容量
40
6O
80
120
100
班级
Bl
B2
B3
B4
B5
班级人数
30
40
60
80
120
试求出一个可行、合理、高效的排课方案。
3,排课规则及排课“费用”
首先我们给出排课的三个规则:
排课规则1:班级人数小于等于教室容量。
排课规则2:如果教室总数大于班级总数,要尽可能空出大教室。
排课规则3:在离差(离差=教室容量一班级人数)和相同的情况下,选择离差平方和最小的排课方案。
我们认为满足上面三个规则的排课方案就是可行、合理、高效的排课方案。为了说明排课规则3,请看下面两个排课方案:
方案1:班级B1一教室A1,班级B2一教室A2
方案2:班级Bl一教室A2,班级B2一教室A1
这两个方案的离差和都是30。由于方案1使得每个教室都留有一定的空间,增加少量学生听课不会有问题。而方案2中教室A1是满员的,不能增加任何人。所以,我们认为方案1比较合理。两个方案的离差平方和分别是500和900。按照排课规则3,我们就会选择方案1。
下面我们定义排课“费用”:
定义假设第i个班级的人数为ai;第j个教室的容量为bi(i'j=1,2,3,4,5)。C|i表示第i个班级指定到第i个教室上课的“费用”。则
???
否则注意:在实际问题中,常常会出现班级总数小于教室总数的情况。这时候,可以虚设几个班级,令其人数为零,使班级总数等于教室总数。
根据以上规则和定义,原问题就成了求解“费用”最小的指派问题。
4,模型模型10.4.4-1:排课模型PKMX
5,集合该模型定义了两个基本集合A和B。A用来表示教室,B用来表示班级。用集合A和B产生了一个派生集合AB。
6,变量在集合AB上定义了两个属性c和x。属性c用来存放排课“费用”,属性x是决策变量。如果x(i'j)=1,则第i个班级指派到第j个教室上课;如果x(i'j)=0,则第i个班级不指派到第j个教室上课。
7,目标该模型的目标就是求出“费用”最小的排课方案,所以可用下式描述:
min=@sum(AB(i'j):C(i,j)$X(i'j))
8,约束该模型有3种约束。第一种约束是:
@For(A(i):@sum(B(j):X(i’j))=1)
它限制一个班级只能到一个教室上课。第二种约束是:
@for(B(j):@sum(A(i):X(i’j))=1)
它限制一个教室只能安排一个班级上课。最后一种约束是:
.@for(A(i):@for(B(j):@BIN(X(i’j))))
它限制x只取0/1两个值。
9,数据与解答模型的数据是来自文件排课数据.xls,模型的解答也是输出到这个文件里。在排课数据.xls中定义了两个域:一个是“排课数据”域,范围:Sheetl!$c$4:$G$8;另一个是“排课方案”域,范围:Sheetl!$C$15:$G$19。如图10.4所示。
??
“排课数据”域中每个单元的数据是按定义1计算的,具有相类似的计算格式。例如:
C7=IF(AND(C2>=A7,A7>0),(C2-A7)$(C2-A7),100000)
从“排课数据”域中输入数据的语句是:
C=@OLE(tc:Lrny documents\排课数据.xls’,‘排课数据’)
而将解答输出到“排课方案”域的语句是:
@OLE('cArny documents悄}课数据.xls’,’排课方案’):x
10,说明
(1)模型中的教室总数是5,而实际问题中,往往教室总数要大得多。例如,假设彩室总数是100。这时,只要将模型中的5改成100即可。同时,文件排课数据.XLS中的两个域的范围要做相应的变动。
(2)当教室总数和班级总数不相等时,可以通过虚设教室(或班级)来实现相等。这时候,虚设教室的容量(或班级的人数)应为0。例如,假设前面问题中的班级1不存在,可将其人数定为O,相应的解答如图10.5所示。
排 课 方 案
教室容量 40
60
80
120
i00
班级人数
教室1
教室2
教室3
教室4
教室5
0
班级1
0
0
0
0
1
40
班级2
1
0
0
0
0
60
班级3
0
1
0
0
0
80
班级4
0
0
l
0
O
120
班级5
0
0
0
1
0
图10.5教室数与班级数不等的排课方案由于班级l是虚设的,对应的教室5空出,从表中可知它是可空出的最大教室。
10.5 市场营销模型在这一节里我们将开发市场营销方面的两个模型。下面分别进行详细介绍。
10.5.1 MODELl5:Markov(马尔可夫链模型)
1,背景马尔可夫链方法是用于模拟动态随机变量的标准方法。参考概率论教科书可获得详细资料。马尔可夫链方法的基本观点是:认为系统不论在任何点,下一个阶段的状态是一个离散型随机变量。系统的状态是由一个状态转移矩阵来描述的。这个矩阵给出了在给定状态下转入指定的其他状态的概率。下面给出一些状态转移的例子:
系统 状态 转移的原因
消费者品牌系统 最近有很多消费者购买 由于广告的原因消费者改变了想法
存货系统 现有的存货数量 由于需求的原因定购了新的材料一个有趣的问题是确定系统长期、稳定状态的概率。如果我们假设系统达到一种平衡,则必有离开某个状态的概率等于进入那个状态的概率。你一定记得:在前面的排队模型里有一个流进速度等于流出速度原理(RIRO)。如果我们设置:
pi=进入状态i的稳定状态概率
pii=从状态i到状态j的转移概率那么,借助于我们的RIRO假设,对于每一个状态i:
乞B pji=pi(1_如)
f≠,
将上式整理一下,我们得到:
F
pi。乙R pji
J
假设系统有n个稳定状态,利用上式可得n个方程,利用它们可求解n个未知的稳定状态概率。很不幸,由于这n个方程不是完全独立的,所以,仅用这n个方程得不到惟一的解。为了保证得到正确的解,我们必须加上最后的条件——概率的总和必须等于l。
2,问题假设你的公司正打算引进一种新的清洗剂,你很关心这种产品是否会在市场上获利。它将会与现有的其他三种产品进行竞争。
通过将上述4种产品在小范围内进行实验,我们获得了下面的购买转移矩阵:
A B C D
A 0.75 0.1 0.05 0.1
B 0.4 0.2 0.1 0.3
C 0.1 0.2 0.4 0.3
D 0.2 0.2 0.3 0.3
在这个矩阵里,新产品是A。这个矩阵是这样解释的:如果某个人最近购买产品A,则下一次他将以0.75的概率继续购买产品A;类似地,某个人最近购买产品B,则他将以0.3的概率购买产品D。看了矩阵之后,你可能会产生这样的联想:“啊,我们未来的产品A将有希望获得75%的市场。”你的这种想法正确吗?
3,模型模型10.5.1—1:马尔可夫链模型MARKOV
4,集合基本集合STATE代表了购买清洗剂A、B、C和D的4种状态。我们用STATE与自身相乘产生一个派生集合SXS。集合SXS用于建立下面的状态转移矩阵。
5,属性这个模型里有两个属性。第一个是SPROB,它是定义在集合STATE之上的,用于存储系统的稳定状态概率,我们将求解属性SPROB的值。第二个属性TPROB是定义在二维集合SXS之上的,它是用来存储状态转移矩阵的值。
6,公式首先,为了确保数据完整,我们用@WARN函数检验状态转移矩阵每一行的概率之和是否等于1。为此,我们用下面的表达式:
@FOR(STATE(I):
@WARN(。每一行的概率之和必须等于1’,
@ABS(1一@SUM(SXS(I,K):TPROB(I,K)))
孝GW.000001);
由于可能会有舍入误差,我们允许有一个适度的偏差,其公差为0.00001。如果一行的概率之和大于1.000001或小于0.999999,用户将收到一个警告。
接下来,稳定状态的概率之和必须等于l。可用下式表达:
@SUM(STATE:SPROB)=1;
最后,除了上面的方程,我们还需要另外的n一1个方程来求解n个稳定状态概率。
我们可以借助于RIRO原理,用下式来获得这些方程:
’@FOR(STATE(J)l J棚J孝@SIZE(STATE):
SPROB(J)=@SUM(SXS(I,J):SPROB(I),l:
TPROB(I,J))
);
7,解答马尔可夫链模型的解答是:
Variable Value
SPROB(A)0.4750000
SPROB(B)0.1 525000
SPROB(C)0.1 675000
SPROB(D)0.2050000
所以我们看到:新产品A最后只能获得47.5%的市场,比起你想象的75%要少得多。
10.5.2 MODELl6:CONJNT(联合分析模型)
1.背景当设计一个产品时,知道用户对产品各个属性的估价值是很有益处的。这可以让我们在有限的预算范围内设计出用户最喜欢的产品。例如,如果我们确定了用户对产品的长期担保给出很高的估价值,那么我们将注重产品的质量而看轻产品的外观。联合分析的基本想法是:虽然让用户精确地揭示出产品属性的相关效用非常困难,但是让他们陈述一下他们是喜欢产品的这个配置或是产品的那个配置还是比较容易的。假设这些列参数已经给定,你可以用联合分析逆向求解,从而求解出产品属性内在的效用函数。
2,问题假设你的公司正打算引进一种新的真空吸尘器。你做了一些用户调查,确定出用户对于该产品的担保时间和价格的不同配置有如下选择(最喜欢的值是9):
$129 $99 $79
2 Years 7 8 9
1 Year 3 4 6
None 1 2 5
为了得到最优的产品配置,你需要知道隐含在上面参数里的关于担保时间和价格的效用函数。
3,模型
4,集合在这个模型里有两个基本集合:WARRANTY是担保时间的集合;PRICE是价格的集合。-我们用WARRANTY和PRICE相乘形成一个派生集合WP,在这个集合上,我们定义了一个属性来存储用户对每一组(WARRANTY,PRICE)给出的打分(参数)。
这个模型里有一个有趣的派生集合WPWP:
WPWP(WP9 WP)l RANK(&l,&2)孝LT孝
RANK(&3,&4):ERROR;
这个集合是由W-P自己与自己相乘而得。这个集合里每一个元素含有两个关于产品的配置。而且,我们用一个元素条件来限制集合只含有那些第二个配置优先于第一个配置的产品配置组合。
例如,RANK(None,$l 29)<RANK(None,$99),贝0((None,$1 29),(None,$99))就在WPWP里。利用这个集合,我们可求出担保时间和价格的效用函数。
注意:这个集合元素总数的量级是n的2次方(n是产品配置的数目)。如果产品配置数很大,则该集合元素的总数将是很大的。
5,属性在这个模型里,我们定义了4个属性:W3NTl PWT,RANK和ERROR。WWT和PWT分别地存储担保时间和价格的效用。模型将求出WWT和PWT的值使总预报偏差达到最小。RANK存储用户选择的参数。最后,在给定包含在WWT和PWT里的效用值的前提下,对每一个配置(iJ)用WWT(i)+PWT(.j)估计它的分值。ERROR存储对配置预报的偏差。
6,目标函数这个模型的目标函数是相当简单,就是使得对所有产品配置的总预报偏差达到最小:
MIN=@SUM(WPWP:ERROR);
7,约束模型中只有一种约束,利用它们可计算出对产品配置预报的偏差。它们是:
@FOR(WPWP(i,j,k,1):ERROR(i,j,k,1)>=
1+(WWT(i)+PWT(j))一(WWT(k)+PWT(1))
);
如果WWT(i)+PWT(j)>WWT(k)+PWT(1),则说明预报错误,故ERROR(i,j,k,1)>:
WWT(i)+PWT(j)一(WWT(k)+PWT(1));女口果WWT(i)+PWT(j)<WWT(k)+PWT(1),
则说明预报正确,故ERROR(i'j,k,1)=O。上面的结论可以用下式表达:
ERROR(i,j,k,1)>=1+(WWT(i)+PWT(j))一(WWT(k)+PWT(1))
由于我们在定义WPWP集合时,(k,1)总是优先于(ij),如果预报它们相等将会发生错误。所以要在上式的右边加上常数1。
注意:由于ERROR的下界是0,我们又是求ERROR达到最小,所以当模型正确地预报出(k,1)优先于(i,j)时,ERROR(i,j,k,1)将趋向于O。
8,解答下面是联合分析模型的解答:
Variable Value Reduced Cost
WWT(LONG) 7.000000 0.0000000
WWT(MEDIUM) 2.000000 0.0000000
WWT(SHORT)0.0000000 0.0000000
PWT(HIGH)0.0000000 0.0000000
PWT(MEDIUM) 1.000000 0.0000000
PWT(LOW)4.000000 0.0000000
对于担保Short、medium和long的效用值分别为0、2和7;而对于价格high、medium和low
的效用值分别为0、1和4。
注意:由于目标函数值是零,所以,这个效用函数与用户对产品配置的选择完全吻合。