《决策模拟》讲义.docx
- 文档编号:7942063
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:22
- 大小:187.65KB
《决策模拟》讲义.docx
《《决策模拟》讲义.docx》由会员分享,可在线阅读,更多相关《《决策模拟》讲义.docx(22页珍藏版)》请在冰豆网上搜索。
《决策模拟》讲义
决策模拟
第一章计算机模拟概论
1.1模拟与计算机模拟
1.模拟
在给模拟下一个定义以前,先让我们一起看一下有关模拟的例子。
比如,要设计一个新型的飞机,设计师一般不是按图纸制造出飞机,直接由飞行员驾驶飞上蓝天,因为那样做很容易造成人员伤亡和财产损失,风险太大。
通常,设计师会先制造一个形状一样但体积很小的飞机模型,在风洞(可以调节出不同的风速和气流的复杂变化)试验室里观察飞机模型的状态,发现问题后再进行改进。
设计师通过多次类似的试验和改进,感觉没有什么问题了,才比较放心地设计真正的飞机。
当然,开始制造的真正的飞机也是要经过有经验的驾驶员试飞的,但它与在试验室进行试验的“试飞”不同。
人们通常将实验室里进行的飞机模型试验叫做“模拟”试验。
模拟的例子很多,比如两军交战,指挥官会摆上沙盘,设想敌方会从哪里攻打,我方又从哪里出击,演绎出多种行动方案;在部队实战演习时,自己的部队充当敌方,虽然射出的枪弹打不死人,但攻守的情势要逼真;要建设一个水库大坝。
可以先按比例建设一个小型的进行实验,以检验水坝的强度、水流的冲击力、泥沙的沉积状况等。
大家还可以想出其它类似的例子。
以上的例子与我们讨论的模拟有关。
我们可以从上面的例子归纳出“模拟”的几个特点。
(1)模拟对象的复杂性
在上例中,飞机在高空飞行遇到各种气流变化时,飞机的状态和性能会产生什么样的变化,这是设计师说不清楚的,有些情况甚至是想象不到的。
假如设计师能通过某一个公式把飞机的各种状况准确地计算出来,而且计算也不复杂,他也就不会再费力做模拟试验了。
同样,战场上的情况瞬息万变,指挥官想尽量想象出可能发生的情况,并模拟可能采取的对策。
水坝的设计也是一项复杂的工作,弄不好,会危害人民生命安全。
总之,需要模拟的事一般都是很复杂的,又是很重要的,
(2)模拟系统与模拟对象的相像性
在风洞里做试验的飞机模型与实际设计的飞机原型要尽量相像,飞机的机身与机翼的尺寸比例、飞机的比重要与飞机原型相同。
风洞中的气流变化也要与实际的高空气流变化尽可能相像。
甚至包括飞机模型的表面材料也要尽量一致。
利用沙盘策划作战方案,也要使沙盘尽量准确地反映战场的地形地貌,哪里是陡峭的山谷,哪里是险要的关隘,要能在沙盘上清楚地显示出来,这就是用沙盘比仅用地图好的地方。
但是,模拟总与真实的不同,有些方面也不需要相同。
比如,在风洞里试验的飞机模型里面,不一定要有机舱座位等,因为它们不与外界气流直接接触。
因此,对模拟系统与模拟对象的相象程度的要求与模拟的目的有密切关系。
比如,同样是一个新型的飞机,要试验旅客座位的舒适性和安全性,就必须制造出几排座位,用机械产生升空、降落和颠簸的状况,以观测旅客的感觉。
如果没有人身安全问题,可能直接由志愿者参加试验,因为“飞机”根本不升空,甚至可能连机翼都没有。
总之。
模拟的系统要与模拟对象相像,要能反映原系统本质性的特征,它依赖于模拟的目的。
(3)模拟系统的简化性与经济性
一般说来,模拟系统比原系统要简单,因为人们面对过分复杂的系统经常采取的是简化的办法。
飞机模型要比实际的飞机简化,不光要小,还可以不要发动机;作战沙盘要比实际的战场简单,不必把每一棵树都标出。
简化带来的一个优点是降低成本,减少费用,甚至能减少人员伤亡,这也是模拟方法的经济性。
(4)模拟系统的可控性
模拟系统不仅仅是简单,它应该具有可控性。
比如,风洞试验室应该能按试验人员的意愿产生不同方向和大小的气流,这可以让设计师观察到各种复杂的情况下飞机的性能。
有些情况可能是在实际中很难遇到的,比如,观察飞机在一个机翼失灵时的状况。
沙盘作战也要方便地显示敌我双方如何调动兵力,在很小的空间可以摆下千里战场局面,在短短的时间可以演绎出数月战场的变化。
(5)模拟试验的可重复性
模拟试验是科学的,其观察结果是稳定的,虽然可能存在微小的随机误差。
基于此性质,人们可以从多次试验结果分析出客观事物存在的规律性。
在以上所说的飞机试验模拟中,人们也可以通过不断调整设计的参数,改进飞机的性能。
同样,沙盘作战的对策模拟也能帮助指挥员看清敌我态势,周密思考,形成克敌制胜的作战方案。
2.计算机模拟
在了解了什么是“模拟”以后,让我们一起来看什么是计算机模拟。
与用风洞试验室进行飞机的试验设计不同,计算机模拟所用的模拟系统是利用计算机程序实现的。
它不是用有形的风洞和飞机模型,也不是用有形的作战沙盘。
我们说的计算机模拟主要是用计算机软件进行的模拟,不是指用计算机硬件。
比如,要实验一个新研制的计算机硬盘的性能,可以测试装了这种硬盘的计算机在电压不稳时的工作状况,连续开机几十小时,不停地让硬盘执行存取命令,那种模拟的对象是计算机硬件。
但现在人们通常说的计算机模拟是用计算机软件实现的。
这里所说的“软件”包括商用软件和自编的计算机程序。
商用软件是别人编写的有特定功能的比较完善的计算机程序。
让我们从一个掷硬币的游戏例子开始。
例1.1
游戏规则:
在一个游艺场所,有一种掷硬币的游戏,硬币是均匀的。
游戏参加者在每次掷硬币以前,要先付1元钱,连续掷硬币多次,直到累计出现的正面与反面次数之差等于3为止,不管正面多还是反面多都行。
在停止时游戏参加者可以得到10元钱。
游戏规定不得中间退出,所以要准备好足够的赌注。
这看来是一个小孩玩的游戏,或者是一个赌博问题,而可以看成实际经营管理中风险投资问题的抽象。
用掷硬币这种游戏的方式叙述,是为了简化问题,形象易懂。
面对如此一个投资机会,大家都可以凭经验来判断参加这一游戏是否值得。
一般说来,不能给出肯定的结论,因为大家知道掷硬币有随机性。
所以人们会猜测或判断平均说来是赢、是平还是输。
喜好数学的朋友首先可能想到这是一个求期望的问题,可以写出公式算一算。
但真地写公式时会发现其复杂性令人生畏。
有人会想到,何不在家里“模拟”一下,真地拿硬币掷一掷。
其结果可能是,甲掷了5次,4次正面,1次反面,赢了5元;乙掷了15次,6次反面,9次正面,输了5元。
哪一个结果可信呢?
聪明人会说:
“要估计平均值,应该进行许多次,再求平均。
”但掷多少次为好呢?
如果一个人要掷一天硬币,除了胳膊疼、心里烦以外,时间的成本也是应该考虑的。
在有了计算机以后,人们会想到能否让计算机去做上面的模拟试验呢?
因为计算机在算术方面比人们快得多,只要能解决“掷硬币”问题就行了。
所谓“掷硬币”,就是要求计算机能像实际掷硬币似地决定“出正面”或“出反面”,并体现硬币的均匀性和随机性。
要体现均匀性是容易的,只要简单地让“正面”与“反面”交替出现即可。
但是,它与实际掷硬币的情形相差太远。
在掷硬币时,出现“正”、“反”、“正”、“反”……的情况的概率极小,与连续出“正”或连续出“反”的情形一样。
也许有人提出质疑:
“这种情形的概率与任何一种排列顺序出现的概率是一样的。
”是的,但问题在于不能在多次重复时只是采用“正面”与“反面”交替出现的方式,没有变化。
解决问题的关键是要让计算机能产生出“变化的”序列,同时保持“正”、“反”出现的概率相同或非常接近。
换句话说,如果计算机能产生出遵循一定概率分布的随机数就好了。
关于产生随机数的方法我们以后再细讲,但我们可以告诉大家,这个问题已经解决了。
如果用Excel,只要调用rand()函数即可返回一个介于0和1之间的随机数。
如果熟悉C语言,可以利用其中的rand()或random()函数产生随机数。
以下给出了一个C语言的小程序,它可以模拟100次掷硬币的游戏。
#include
#include
voidmain(){
inti,n_head,n_tail;
intnum_test=100;
floatv,earnings=0;
for(i=0;i n_head=0; n_tail=0; do{v=(float)rand()/RAND_MAX; if(v<0.5){ n_head++; }else{ n_tail++; } earnings-=1; }while(abs(n_head-n_tail)! =3); earnings+=10; } printf("Onanaverage,youearned%fyuan.",earnings/num_test); } 只要你愿意,你可以改变程序中的num_test的值,产生1000次、10000次甚至更多次的模拟试验。 我们做了6次不同运行次数的试验,其结果如表1.1所示。 其中模拟1000万次的试验在奔腾II166的计算机上大约用了2分钟。 表1.1投资模拟的运行结果 模拟次数 100 1000 10000 100000 1000000 10000000 平均收益 2.080000 1.442000 0.997200 0.990440 0.995088 0.998228 面对多次运行的不同结果,如何做出正确的判断是计算机模拟中经常遇到的一个问题。 以下3点是应该注意的。 (1)不要期望结果十分相近,像上面那样的结果是很正常的。 (2)一般说来,运行次数多的更可靠一些。 运行次数与统计学里的抽样样本的大小是一致的。 (3)对于同样的运行次数,还可以用变换随机数种子的办法运行多次,再求出均值和方差,得到点估计和与置信度相应的区间估计。 我们也可以在上面的程序中,记载下收益的最小值、最大值。 除了计算出均值,还可以计算出收益的方差、标准差,进而做出某一置信度(比如95%)下的区间估计。 这一练习的机会留给大家。 有了以上的例子,现在我们对计算机模拟进行具体的讨论。 1)计算机模拟的特点 首先,计算机模拟具有一般模拟的特点。 (1)模拟对象的复杂性 模拟对象的复杂性常表现为计算的复杂性,不容易用数学显式表达或不便于运算求解,模拟对象的一些变量还可能具有随机性。 (2)模拟系统与模拟对象的相像性 计算机程序要反映模拟对象的本质关系。 要根据实际的模型建立相应的数学模型,再编制计算机程序。 (3)模拟系统的简化性与经济性 用计算机模拟除了开始编程序外,可以让计算机运行几乎无数多此,只是利用一点电能,不需要实际掷硬币掷得胳膊疼。 (4)模拟系统的可控性 人们可以很容易地改变程序中的参数值,观测相应结果的变化。 (5)模拟试验的可重复性 人们可以多次模拟,并且可以重复演示模拟的结果。 计算机模拟还有独特的特点,即模拟对象的数量化表示。 我们常用的计算机是数字计算机,所进行的是数字的运算,最适合解决能够量化的问题。 像上面举的掷硬币例子,可以用随机数的取值代表出正面或反面。 出现正面或反面对盈亏支付的影响是可以量化的。 前面的小程序里就反映了这种数量关系。 因此,要进行计算机模拟,模拟对象的主要元素和基本关系要能够用数量表示或近似表示才行。 有些不容易量化的问题,就不适合用计算机模拟。 比如,在做新的飞机设计时,可以用风洞进行模拟试验。 虽然风的变化可以用风向、风速及其变化来量化表示,飞机的升降、倾斜、颠簸也可以用某些点的坐标及其运动速度、加速度等进行表示,但由于各种不同形状的飞机在各种复杂的气流变化的情况下的状态变化不容易用数学公式表示出来,就不便于用计算机进行模拟。 当人们对空气动力学的研究更加深入,发现了相应的数学关系式,就有可能用计算机模拟来代替飞机模型设计,相应的费用比用风洞试验可能更便宜。 需要说明的是,模拟对象的量化表示并不意味着能写出解的表达式。 许多具有随机性的系统的状态是难以用数学式子写清楚的,但系统各元素之间的相互影响是可以量化表示的。 这类问题用通常的数学推导难以求解,但可以用模拟的方法求解。 虽然大多数情况下得到的是近似解,但在实际应用中人们并不在乎微乎其微的误差。 2)计算机模拟的基本步骤 计算机模拟的基本步骤如下: (1)确定问题 首先,要确定模拟要解决的问题,对问题给出具体的描述,关键要明确决策者的目标是什么。 (2)列举变量和参数 在分析模拟对象的基础上,抽象出某些变量,确定某些量作为参数。 参数在模拟过程中不变,但可以在模拟的多次运行中改变,以观测其对目标值的影响。 一般构造模拟模型要从简单入手,开始不要包括太多的变量,可以把变化不大的量作为参数或常数。 在得到初步结果后,若感觉需要进行更详尽的模拟,还可以包括更多的变量。 在我们前面的例子中,游戏结束的次数和收益值是变量,而最后所得的钱数(10元)就可以看作参数。 如果需要,可以将10元变为9元,看结果如何。 (3)构建模型 在前两步的基础上,找出各变量之间以及它们与各参数之间的相互关系,也就是用定量的方法写出各变量在模拟的过程中如何变化。 在我们前面所举的例子中,要找出游戏结束的次数如何决定、每次的收益如何计算。 (4)选择模拟工具 比如,是用掷硬币的办法模拟前面的投资问题,还是用计算机。 若用计算机,是用专用的模拟软件,还是用像Excel一样的通用电子表格计算软件,还是用高级语言自编程序,就像我们用C语言编模拟程序一样。 在此,我们不想全面比较各种方法的优缺点。 我们只想强调,选择方法需要根据问题的特点和使用者对各种工具熟悉的程度而定。 很多时候,同一个问题可以使用不同的模拟工具来解决。 (5)给参数赋值并给变量赋初值 参数赋值后,在一次模拟运行中保持不变。 对变量也要确定初始值,但在模拟中会发生变化。 比如,要模拟某公司的库存管理系统,可以把定货量作为参数,赋值为100,把某种商品的库存量作为变量,初值设为80,其他变量也要赋给相应的初值。 在模拟中库存量会发生变化,相应的总费用也会变化。 (6)运行并调试模型 进行实际的模拟,用计算机模拟一次、两次……直到适当的次数。 观测、分析所得到的结果,与实际的问题相对照,看结果是否有大的出入。 如果感觉有问题,应检查模型构建得是否合理、参数设置是否合适。 有时,变量初值的选择也对结果有较大的影响。 若发现有问题,应做相应的调整,重新运行模拟程序。 总之,对模型的检验与调试是非常重要的。 不要模拟刚出结果就急着写分析报告。 (7)进行全面的模拟分析 在前面经过试验和调试过的模型的基础上,决定模拟运行的次数。 模拟次数要足够多(当然要考虑模拟的成本),使模拟的系统进入平稳状态,获得比较稳定的结果。 还要对模拟的输出进行全面的分析,包括进行统计分析,比如均值、方差、置信区间等,有时还要对参数做灵敏度分析。 (8)写出模拟报告 最后,在前面工作的基础上,写出模拟报告。 除了包括第7步的内容外,应该恢复到开始的原问题。 写出的报告要让没有参加模拟的人看得懂,要切中决策者所关心的要点。 在报告的形式上也要讲究条理清晰、形象生动。 1.2计算机模拟在经济管理中的应用举例 在此,我们列举一些在经济管理领域运用计算机模拟的实例,其中有些是参阅有关文献,有些是我们在教学和研究中亲自做过的。 为了节省篇幅,除了特别说明,我们以后说的“模拟”都是指“计算机模拟”。 1.部分模拟应用举例 (1)模拟国家宏观经济运行,以观察各种政策的变化对主要经济变量带来的影响。 (2)模拟不同的人口政策对中国长期的人口、经济、家庭、社会等方面带来的影响。 (3)模拟草原牧区的草场、牲畜在不同的决策下(草场经营方式、存栏量、出栏策略、疾病防治措施、畜牧建设投资策略等)的状态变化。 (4)模拟一个生态系统(比如鱼群,它的生殖及死亡率与鱼群密度有关,也与其饵料的状况有关),观察不同的政策(捕捞、保护等)对该生态系统带来的影响。 (5)模拟银行的顾客服务系统,根据顾客到达的统计规律和服务时间的分布,确定银行的服务窗口设置和不同时间开放的数量。 (6)模拟航空公司的售票系统,根据不同类型旅客的历史统计数据,决定给不同等级的座位预留数量,配合不同的机票定价政策,模拟机票销售情况,为优化决策提供依据。 (7)模拟某个区域的各种交通车辆在道路系统中的运行情况,模拟中可以对交通信号灯的设置进行改变,以便做出最优的选择。 (8)模拟某企业的存储系统,以观察不同的定货政策对供货、生产、销售和资金占用带来的影响。 (9)模拟计算机网络系统的运行,以确定局域网内和局域网对外连接的网线通信能力的设计。 (10)模拟工厂的机器运行,观察机器出现故障的频率,以确定聘用维修人员的数量。 (11)模拟股市行情的变化情况,并做出买或卖的模拟决策,以便增长对股市投资知识的了解。 (12)模拟竞争性企业的经营过程,各企业分别做出生产、营销、财务、人事、投资等方面的决策,在模拟的市场上销售,用多项经营指标对各企业进行评估。 从以上列举的模拟应用的实例不难发现,模拟在经济管理中的应用是相当广泛的,而且所处理的大多是复杂的、带有随机因素的、用其他方法不易解决的问题。 2.计算机模拟的优点 (1)节省时间 用计算机可以在短时间内多次调整参数,进行多次试验,分析系统的变化,以提供决策依据。 有些问题即使可以做实际试验,一般也需要很长的时间,可能错过决策的良机。 (2)节省资金 用计算机进行模拟比实际试验在资金方面的节省是明显的。 在投资问题中,模拟时不需要真花钱投资。 模拟城市的交通系统,也不需要真地按不同的方案建设道路。 即使与一般的模拟(如风洞试验)比较,计算机模拟几乎不消耗实际的物质材料。 编写计算机程序只占用很小一点磁盘空间,运行后还可以删掉,再用来编其他的程序。 (3)规避风险 假设某人对股市挺感兴趣,但没有股市投资的经验。 如果他贸然进入股市,所面临的风险比有经验的人要大得多。 倘若有一个模拟股市的软件,他可以对着计算机模仿股市投资,即使输了,也不至于破产。 等积累了一定的经验,再进入股市,至少可以避免犯常识性的错误。 (4)虚拟现实 模拟不一定是先有了一个现实的系统,再比着葫芦画瓢,建立一个模拟模型。 模拟的对象可以是一个实际上根本不存在的系统,比如,模拟长江三峡的大坝在200米水位时的状态,而实际上大坝设计只有175米的水位。 再如,模拟中国若不采取计划生育政策人口的变化情况,虽然不符合中国的实际(已经实行计划生育政策多年),但这种模拟对分析中国的计划生育政策影响是很有必要的。 因此,不要把模拟狭义地理解为对现实系统的模仿和近似,它还可以回答更多的“如果……如何……”的问题(what–ifquestions)。 有些参数的改变可能超出人们常识的范围,也可能得出意想不到的结果。 笔者在1988年做鱼群生态模拟时就发现了鱼群数量变化曲线有时非常奇怪,实际上就是人们说的混沌现象。 由于我们当时研究的重点是渔业捕捞政策,没有对这一现象仔细研究,但至少可以给我们以启发。 可以说,模拟是人们不断地认识世界、发现真理的一种有用的研究方法。 模拟的英文词是simulation,在中文中有“模拟”和“仿真”两种译法。 根据以上的分析,“仿真”容易给人以简单模仿现实的感觉,所以我们在本书中愿意用“模拟”而不用“仿真”。 2.随机数与随机分布的产生方法 1.3随机数与随机分布的产生方法 在具体讨论如何利用计算机进行模拟以前,我们简单介绍用计算机产生随机数和随机分布的方法。 1.随机数 我们这里说的随机数是遵循均匀分布的随机变量。 我们先假定这些随机数是非负整数。 假若有一个均匀的正12面体,其中10个面上写上0,1,……9共10个数字,另两个面空白。 随机地掷(任意摇晃后随意上掷),若正上面有数字,则记下,若空白,不记。 抛掷多次,可以得出由0,1,……9组成的数列。 比如4,3,5,3,8,0,9,2,1,7,6,4……这就是一个随机数列。 用计算机产生随机数列的方法有多种,有一种“混合同余法”的随机数产生法比较流行。 要运用此方法,要先决定随机数的范围,比如0,1,……,m–1,共m个整数;再选定一个初始的随机数xo和参数a和c(a 以后的随机数的表达式如下: xn+1=(axn+c)(modulom) 其中运算(modulom)是用m去除前面的数所得的余数。 如果参数选择得当,所得到的随机数可以遍历从0到m–1这m个整数。 大家可以试验在m=8,a=5,c=7,x0=1时,所得的数列为1,4,3,6,5,0,7,2。 若再继续算下去,又从1开始同样的数列。 这样产生的所谓随机数其实并不真正随机,虽然8个数出现的概率相等,但先后次序确定了。 而且在同一个周期里,每个数只能出现一次,不像掷骰子,一个面可以连续出现。 其实,所有用计算机产生的随机数都是“伪随机数”。 只要这些随机数与实际的随机数比较相似,就可以在模拟中当作随机数来用。 随着人们对随机数的深入研究,提出了一系列的随机数产生方法,其功能越来越强,或者说,越来越像随机数。 在各种计算机语言中都有产生随机数的函数,包括Excel这样的数据表格软件。 图9.3.1显示的是用Excel产生的40个介于0和1之间的随机数。 在B2到F9的40个单元格中都是调用函数rand(),用拷贝的办法可以很快完成。 第G列和第10行是按行和按列的平均值,G10是所有40个随机数的平均值。 从理论上说,此平均值的期望是0.5,但实际上是有误差的。 有时均值甚至可能小于0.4或大于0.6。 如果用图9.3.1中的随机数,从B2开始,逐行数起,若随机数小于0.5,则认为硬币出正面,否则,认为是反面。 我们得到掷硬币的序列如下: 正反正反正反反正反正正反正反反反反,掷了17次才结束,输了7元。 如果从B2开始,逐列数起,得到掷硬币的序列如下: 正反正反正正正,掷了7次就结束了,赢了3元。 大家还可以想出利用这些随机数的其他方法。 图9.3.1用rand()函数产生的随机数 2.随机分布 我们已经学会了产生均匀分布随机数的方法,现在讨论如何产生服从其他分布的随机变量的值,简称产生随机分布。 我们知道随机变量的分布函数F(x)的值域是[0,1],而且是单调递增的。 我们可以先产生[0,1]上的均匀分布的随机数u,即F(x)=u,再用函数求逆的办法求相应的x,它就是所要的分布函数为F(x)的随机数。 在F(x)不是严格单调递增时,可以在求逆时取使F(x)=u的最小的x。 例如,指数函数的分布函数是F(x)=1–e–x/μ,对x≥0,它的期望为μ。 为了产生服从该分布的x,先产生一个在[0,1]上的均匀分布的随机数u,则有: 1–e–x/μ=u, 反解可得x=–μln(1–u),所以在Excel里只要用公式–0.5ln(1–rand())就可以产生服从均值为0.5的指数分布的随机数。 由于1–u和u都服从[0,1]上的均匀分布,以上公式还可以简化为–0.5ln(rand())。 在Excel中提供了常用分布的随机数产生函数,如表9.3.2所示。 对引用函数所需要的参数,在用Excel工具栏选用函数时会给出提示。 表9.3.2Excel中常用概率分布的分布函数的反函数形式 分布 函数 分布 函数 正态分布 NORMINV() 对数正态分布 LOGINV() β分布 BETAINV() Г分布 GAMMAINV() t分布 TINV() 卡方分布 CHIINV() F分布 FINV() 第二章计算机模拟工具 2.1计算机模拟工具介绍 计算机模拟的实现需要借助计算机软件,或者是专用的计算机模拟语言,像GPSS、Simscript等,或是利用计算机编程语言,如Basic、C等。 下面我们介绍的是如何用Excel
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 决策模拟 决策 模拟 讲义