运筹学 实验说明书.docx
《运筹学 实验说明书.docx》由会员分享,可在线阅读,更多相关《运筹学 实验说明书.docx(45页珍藏版)》请在冰豆网上搜索。
运筹学实验说明书
<<运筹学>>实验指导书
信息管理与信息系统教研室
桂林电子工业学院计算机系
2005年8月
目录
实验一线性规划1
一、实验目的:
1
二、实验类型:
设计型1
三、实验内容:
1
(1)投资问题1
(2)人力资源分配问题1
(3)生产计划问题1
(4)套裁下料问题(选做)2
(5)配料问题(选做)2
四、实验步骤及实验要求:
2
附1:
用LINGO解决线性规划问题的例子3
1.确定决策变量和目标函数3
2.确定约束条件3
3.确定数学模型3
4.求解4
实验二运输问题6
一、实验目的:
6
二、实验类型:
设计型6
三、实验内容:
6
(1)产销平衡的运输问题。
6
(2)产销不平衡的运输问题。
6
(3)生产与存储问题7
(4)转运问题7
四、实验步骤及实验要求:
8
附1:
运输问题求解举例8
1.确定约束变量和约束条件10
2.建立目标函数10
3.建立数据集11
4.确定数学模型并求解12
附2:
使用LINGO解决运输问题的常用操作13
实验三目标规划(选作)15
一、实验目的:
15
二、实验类型:
设计型15
三、实验内容:
15
(1)生产问题目标规划15
(2)运输问题目标规划15
四、实验步骤及实验要求:
16
提示:
16
实验四整数规划17
一、实验目的:
17
二、实验类型:
设计型17
三、实验内容:
17
(1)投资场所的选择17
(2)固定成本问题17
(3)指派问题18
(4)分布系统设计问题18
四、实验步骤及实验要求:
18
附1:
整数变量的语法定义:
18
附2:
整数规划例子19
附3:
0-1整数规划19
实验五图与网络分析(选做)22
一、实验目的:
22
二、实验类型:
验证型22
三、实验内容:
22
(1)最短路径问题22
(2)关键路径问题22
四、实验步骤及实验要求:
23
附1:
利用ORMS软件最短通路的方法23
附2:
利用ORMS软件求关键路径的方法25
实验六动态规划28
一、实验目的:
28
二、实验类型:
综合设计型28
三、实验内容:
28
(1)最短路线问题。
28
(2)小规模货郎担问题(TSP)。
28
四、实验步骤及实验要求:
28
附1:
用动态规划(DP)解最短路线问题29
附2:
货郎担问题(TSP)求解29
附3:
常用的几个函数简介31
1.变量界定函数31
2.集操作函数32
3.集循环函数32
4.输入和输出函数33
实验一线性规划
一、实验目的:
(1)熟悉LINGO软件环境;
(2)了解并熟练掌握LINGO语言的数学模型的结构;
(3)掌握用LINGO语言来解决线性规划问题。
(4)了解灵敏度分析的含义。
二、实验类型:
设计型
三、实验内容:
采用LINGO软件解决下列实际应用问题。
(1)投资问题
某部门在今后五年内考虑给下列项目投资,己知:
项目A,从第一年到第四年每年年初需要投资,并于次年末回收本利115%;
项目B,第三年初需要投资,到第五年未能回收本利125%,但规定最大投资额不超过4万元;
项目C,第二年初需要投资,到第五年未能回收本利140%,但规定最大投资额不超过3万元;
项目D,五年内每年初可购买公债,于当年末归还,并加利息6%。
该部门现有资金10万元,问它应如何确定给这些项目每年的投资额,使到第五年末拥有的资金的本利总额为最大?
(2)人力资源分配问题
福安商场是个中型的百货商场,它对售货人员的需求经过统计分析,如下所示:
表1
时间
所需售货员人数
星期日
28人
星期一
15人
星期二
24人
星期三
25人
星期四
19人
星期五
31人
星期六
28人
为了保证售货人员充分休息,售货人员每周工作五天,休息两天,并要求休息的两天是连续的,问应该如何安排售货人员的作息,既满足了工作需要,又使配备的售货人员的人数最少?
(3)生产计划问题
明兴公司面临一个是外包协作还是自行生产的问题。
该公司生产甲、乙、丙三种产品,这三种产品都要经过铸造、机加工和装配三个车间。
甲、乙两种产品的铸件可以外包协作,亦可以自行生产,但产品丙必须本厂铸造才能保证质量。
有关情况见表2;公司中可利用的总工时为:
铸造8000小时,机加工12000小时和装配10000小时。
公司为了获得最大利润,甲、乙、丙三种产品各生产多少件?
甲、乙两种产品的铸造应多少由本公司铸造?
应多少由外包协作?
(4)套裁下料问题(选做)
某工厂要做100套钢架,每套用长为2.9m,2.1m和1.5m的园钢各一根。
已知原料每根长7.4m,问应如何下料,可使所用原料最省。
表2
工时与成本
甲
乙
丙
每件铸造工时(小时)
5
10
7
每件加工工时(小时)
6
4
8
每件装配工时(小时)
3
2
2
自产铸件每件成本(元)
3
5
4
外协铸件每件成本(元)
5
6
-
加工每件成本(元)
2
1
3
装配每件成本(元)
3
2
2
每件产品售价(元)
23
18
16
(5)配料问题(选做)
某工厂要用三种原料1,2,3混合调配出三种不同规格的产品甲、乙、丙,已知产品的规格要求、产品的单价、每天能供应的原材料数量及原材料单价,分别见表3和表4。
该厂应如何安排生产,使利润收入为最大?
表3
产品名称
规格要求
单价(元/千克)
甲
原材料1不少于50%原材料2不少于25%
50
乙
原材料1不少于25%原材料2不超过50%
35
丙
不限
25
表4
原材料名称
每天最多供应量
单价(元/千克)
1
100
65
2
100
25
3
60
35
四、实验步骤及实验要求:
(1)确定各个问题的变量,建立各个问题的约束条件,目标函数;
(2)建立各个问题的数学模型;
(3)将该数学模型描述为LINGO语言,求解其结果;
(4)灵敏度分析;
(5)完成实验报告。
[注:
LINGO软件的缺省值是不进行灵敏度分析,因此我们需要改变系统原有的默认值。
过程如下:
点击LINGO菜单中的Options,选中GeneralSolver,在Dualcomputations中选中Rrices&Range即可。
]
附1:
用LINGO解决线性规划问题的例子
某公司可以生产两种品牌的计算机:
STANDARD计算机和TURBO计算机,生产一台STANDARD计算机可获利100元,生产一台TURBO计算机可获利150元。
STANDARD计算机生产线每天可以生产100台STANDARD计算机,TURBO计算机生产线每天可以生产120台计算机。
但是生产一台STANDARD计算机所需人力1小时.人,生产一台TURBO计算机所需人力2小时.人,该公司共有人力为160小时.人。
问如何安排生产使得该公司的获利最大。
通常情况下,最优化数学模型包括三部分:
决策变量:
每一个问题都用一组决策变量来表示某一个方案;这组决策变量的值就代表一个具体方案。
最优化的目标就是找到一组决策变量的值,使得其目标函数达到最优值,并要求这组决策变量的值符合约束条件。
目标函数:
目标函数一各公式,其目的用来表达你所希望达到的最优目标,一般他都是用决策变量的线性函数来表示,按照问题的不同,一般都是求目标函数的最大化或者最小化。
约束条件:
限定模型中变量所取值的范围,这些限制条件一般是用一组线性等式或者不等式表示。
求解方法如下:
1.确定决策变量和目标函数
令,变量STANDARD和TURBO分别表示该公司每天应该生产STANDARD计算机和TURBO计算机的台数,则该公司可获得最大利润的目标函数用LINGO语言表示为:
MAX=100*STANDARD+150*TURBO;
注意:
LINGO语言的每一条逻辑上行应该以分号(;)结束。
否则会出现语法错误。
2.确定约束条件
下一步就应该对生产线和劳力进行约束。
因为STANDARD计算机生产线每天可以生产100台STANDARD计算机,TURBO计算机生产线每天可以生产120台计算机。
用LINGO语言可以如下表示:
STANDARD<=100;
TURBO<=120;
注意:
在LINGO语言中,可以用<来表示<=;同样地,我们也可以用>来表示>=。
对劳力的约束条件我们可以如下地表示:
STANDARD+2*TURBO<=160;
3.确定数学模型
这样我们可以得到整个问题的数学模型:
!
Hereisthetotalprofitobjectivefunction;
MAX=100*STANDARD+150*TURBO;
!
Constraintsontheproductionlinecapacity;
STANDARD<=100;
TURBO<=120;
!
Ourlaborsupplyislimited;
STANDARD+2*TURBO<=160;
其中!
表示注释行的开始。
注意:
在LINGO中,所有变量名是字母开头,数字与字母以及下化线”_”的符号串,且符号串的长度步超过32位。
4.求解
将上面的数学模型输入到LINGO中,点击菜单中的LINGO选项,再点击Solve,如果该数学模型不存在语法错误,则输出一些相关的数据以及计算结果,如下图:
其中Objectivevalue为计算结果,即最优值为14500,即该公司获得的最大利润为14500元。
Globaloptimalsolutionfoundatiteration:
2表示通过两次迭代获得结果.中间栏的value表示当STANDARD的取值为100,TURBO的取值为30时,目标值取得最大值。
ReducedCost表示如果该栏中某项的值为X,即如果该项相对应的变量的值增加1,那么相应最优值会减少X.Slack和Surplus分别表示松弛量和剩余量。
该栏的第三项为90,即表示源程序中非注释行第三行即TURBO的实际值比所允许的值差90。
DualPrice为影子价格,该栏第4项的值为75,即表示如果源程序中非注释行第4行右端的值增加1,那么最优值会增加75。
其中Module:
LP表示该问题为线形规划问题.等等.
实验二运输问题
一、实验目的:
(1)进一步熟悉LINGO软件环境;
(2)掌握如何建立运输问题的数学模型;
(3)了解并掌握如何LINGO来解决运输问题;
(4)掌握LINGO语言中@FOR,@MIN,@MAX以及@SUM的使用。
二、实验类型:
设计型
三、实验内容:
采用LINGO软件解决下列几种运输问题
(1)产销平衡的运输问题。
某公司从两个产地A1,A2将物品运往三个销地B1,B2,B3,各产地的产量、各销地的销量和各产地运注各销地的每件物品的运费如下表所示:
表一
B1
B2
B3
产量(件)
A1
6
4
6
200
A2
6
5
5
300
销量
150
150
200
问应如何调运,使得总运输费最小?
(2)产销不平衡的运输问题。
设有三个化肥厂供应四个地区的农用化肥。
假定等量的化肥在这些地区使用效果相同。
各化肥厂年产量、各地区年需求量及从各化肥厂到各地区运送单位化肥的运价如下表,试求出总的运费员节省的化肥调拨方案。
表二
I
II
III
IV
产量
A
16
13
22
17
50
B
14
13
19
15
60
C
19
20
23
-
50
最低需求
30
70
0
10
最高需求
50
70
30
不限
(3)生产与存储问题
光明仪器厂生产电脑绣花机是以销定产的。
已知1至6月份各月的生产能力、合同销量和单台电感绣花机平均生产费用见下表。
又已知上年末库存103台绣花机,又如果当月生产出来的机器当月不交货,则履要运到分厂库房,每台增加运输成本0.1万元,每台机器每月的平均仓储费、维护费为0.2万元,在7-8月份销售淡季,全厂停产1个月,因此在6月份完成销售合同后还要留出库存80台。
加班生产机器每台增加成本1万元。
问应如何安排1-6月份的生产使总的生产(包括运输、仓储、维护)费用最少?
表三
月份
正常生产能力(台)
加班生产能力(台)
销量(台)
单台费用(万元)
1
60
10
104
15
2
50
10
75
14
3
90
20
115
13.5
4
100
40
160
13
5
100
40
103
13
6
80
40
70
13.5
(4)转运问题
腾飞电子仪器公司在大连和广州有两个分厂,大连分厂每月生产400台某种仪器,广州分厂每月生产600台某种仪器。
该公司在上海与天津有两个销售公司负责对南京、济南、南昌与青岛四个城市的仪器供应,又因为大连与青岛相距较近,公司同意大连分厂也可以向青岛接供货,这些城市问的每台仪器的运输费用我们标在两个城市间的弧上,单位为百元,问应该如何调运仪器.使得总的运输费最低。
四、实验步骤及实验要求:
(1)确定各个问题的变量;
(2)建立各个问题的约束条件;
(3)写出各个问题的目标函数;
(4)建立各个问题的数学模型;
(5)将该数学模型描述为LINGO语言,求解其结果。
(6)完成实验报告。
附1:
运输问题求解举例
运输问题是线性规划的一类特殊问题,在求解运输问题的过程中,我们也可以采用单纯型方法。
比如对于上述的产销平衡的运输问题,我们可以这样求解。
设Xij表示从产地Aj调运到Bj的运输量(i=1,2;j=1,2,3),例X12表示由A1调运到B2的物品数量,现将安排的运输量列表如下:
销地运费单价产地
B1
B2
B3
产量(件)
A1
X11
X12
X13
200
A2
X21
X22
X23
300
销量
150
150
200
500
从上表可写出此问题的数学模型。
满足产地产量的约束条件为:
X11十X12十X13=200
X21十X22十X23=300
满足销地销量的约束条件为:
X11十X21=150,
X12十X22=150,
X13十X23=200.
使运输费最小的目标函数为:
minf=6X11十4X12十6X13十6X21十5X22十5X23
所以此运结问题的线性规划的模型如下:
目标函数:
minf=6X11十4X12十6X13十6X21十5X22十5X23
约束条件:
X11十X12十X13=200
X21十X22十X23=300
X11十X21=150,
X12十X22=150,
X13十X23=200.
Xij>=0.(I=1,2;j=1,2,3)
将上述模型按照实验一的方法转化为LINGO语言之后,求解可以得到最优值。
上面这个例子的数据非常少,我们很容易建立起数学模型,但是在很多情况下,我们需要处理很多数据,按照这种方法建立其数学模型显然是非常单调枯燥的。
下面一个例子来说明:
例设W公司有六个仓库可以提供给八个客户存储货物,每个仓库所装的货物不能超过它的容量,同时每个客户对仓库也有一定的要求。
现需要计算每个如何装配货物使得装配的费用最少。
每个仓库的容量如下:
仓库容量
160
255
351
443
541
652
客户总容量要求
135
237
322
432
541
632
743
838
每个单元商品的装配费用为:
V1V2V3V4V5V6V7V8
Wh162674259
Wh249538582
Wh352197433
Wh476739271
Wh523957265
Wh655228143
按照实验一的方法,我们可以建立如下目标函数:
MIN=6*VOLUME_1_1+2*VOLUME_1_2+6*VOLUME_1_3+7*VOLUME_1_4+4*VOLUME_1_5+8*VOLUME_6_5+VOLUME_6_6+4*VOLUME_6_7+3*VOLUME_6_8;
其中变量VOLUME_I_J表示为每个客户J分配的仓库I所装配widgets的数量,很明显,按照这种方式来写目标函数是非常枯燥的,并且非常容易出错。
求解方法如下:
1.确定约束变量和约束条件
该模型有两个约束条件:
第一个约束是每个客户对仓库容量的要求,我们称之为要求约束条件(demandconstraints);第二个叫容量约束(capacityconstraint),即,所有某仓库所装的商品的所占用的总的空间不能超过该仓库的容量。
我们以第一个客户的要求为例,应该为第一个客户分配的仓库的所有空间的总和应该等于35。
这样,如果用基于标量的符号,可以创建出下列约束:
VOLUME_1_1+VOLUME_2_1+VOUUME_3_1+VOLUME_4_1+VOLUME_5_1+VOLUME_6_1=35;
然后,对其他七个客户建立类似的要求约束。
显然这个过程非常冗长而容易出错,同样我们可以用LINGO建模语言来简化其描述方式。
使用数学符号,我们可以用一个语句表述所有这八个要求约束:
∑iVOLUMEij=DEMANDj,foralljinVENDORS
用LINGO语言表述为:
@FOR(VENDORS(J):
@SUM(WAREHOUSES(I):
VOLUME(I,J))=
DEMAND(J));
其含义为对每个投资者,分配给同一个投资者的仓库总容量应该等于投资者的需求。
其数学表示和LINGO语法表示的对照如下:
数学概念LINGO语法
foralljinVENDORS@FOR(VENDORS(J):
∑i@SUM(WAREHOUSES(I):
VOLUMEijVOLUME(I,J))
==
DEMANDjDEMAND(J));
同样的,我们可以用数学公式表示其容量约束:
∑jVOLUMEij<=CAPi,foralliinWAREHOUSES
用LINGO语言表述为:
@FOR(WAREHOUSES(I):
@SUM(VENDORS(J):
VOLUME(I,J))<=
CAPACITY(I));
其含义为对每个仓库J,分配给客户的容量之和应该小于其总容量。
那么整个约束条件为:
MODEL:
MIN=@SUM(LINKS(I,J):
COST(I,J)*VOLUME(I,J));
@FOR(VENDORS(J):
@SUM(WAREHOUSES(I):
VOLUME(I,J))=
DEMAND(J));
@FOR(WAREHOUSES(I):
@SUM(VENDORS(J):
VOLUME(I,J))<=
CAPACITY(I));
END
2.建立目标函数
下面我们建立目标函数。
对此我们可以用数学公式Minimize∑ijCOSTij*VOLUMEij。
LINGO也可以用类似的方法来表达此含义:
MIN=@SUM(LINKS(I,J):
COST(I,J)*VOLUME(I,J));
其意义为:
对每个客户J和每个仓库I,如果存在LINKS关系,那么就求COST(I,J)*VOLUME(I,J)使得他们的和最小。
显然,此表达式简单直观。
下表是目标函数的数学表示和LINGO语法表示的对照:
数学公式LINGO语法
MinimizeMIN=
∑ij@SUM(LINKS(I,J):
)
COSTijCOST(I,J)
**
VOLUMEijVOLUME(I,J)
从上面的约束条件可以看出,我们没有给变量分配数据,为此,我们需要定义数据集。
3.建立数据集
在实际建模时,总是发现存在一组或多组相互关联的目标。
这些相关联的目标可以用一个集合的形式来表示。
LINGO中可以定义相关对象的集合。
集合以关键字SETS开始,集合以关键字ENDSETS结束。
一旦定义了数据集合,在LINGO中我们用一组循环函数(比如:
@FOR)来对集合的每个成员进行操作。
下面我们看看如何定义集合:
在上面的例子中我们需要定义如下3个集合:
1.仓库集合;
2.客户集合;
3.仓库与客户的笛卡儿积的映射
其相应的数据集和可以LINGO语言如下地表示:
SETS:
WAREHOUSES/WH1WH2WH3WH4WH5WH6/:
CAPACITY;
VENDORS/V1V2V3V4V5V6V7V8/:
DEMAND;
LINKS(WAREHOUSE,VENDORS):
COST,VOLUME;
ENDSETS
上面的第二行表示WAREHOUSES有六个数据成员,分别为WH1,WH2,WH3,WH4,WH5和WH6,并且每个成员都有一个属性称为CAPACITY。
类似的我们上面的第三行定义了八个客户,每个客户都具有一个称为DEMAND的属性。
最后一个集合LINKS是仓库与客户的笛卡儿积的映射,共有6*8=48个成员,每个成员均有两个属性COST和VOLUME。
定义这种集合的语法不同于前面的定义。
LINKS(WAREHOUSE,VENDORS)指出了LINKS集合是集合WAREHOUSE和集合VENDORS的派生。
在本例中LINGO可以生成48个(warehouse,vendor)这样的序偶对,每个序偶对都是集合LINKS的元素。
为了进一步说明这个问题,我们列出一些成员,如下表:
成员索引所对应的成员
1(WH1,V1)
2(WH2,V2)
3(WH3,V3)
……
47(WH47,V47)
48(WH8,V8)
数据输入
LINGO允许用户以独立的方式来输入数据,比如在上面的例子中,可以采用如下的方式来输入数据:
DATA:
CAPACITY=605551434152;
DEMAND=3537223241324338;
COST=62674259
49538582
52197433
76739271
23957265
55228143;
ENDDATA
采用这种方式来输入数据的时候,以关键字DATA开始,集合以关键字ENDDATA结束。
这样就初始化了集合WAREHOUSES的属性CAPCITY和集合VENDORS的属性DEMAND