《市场竞争模拟》讲义0916Word文档下载推荐.docx
《《市场竞争模拟》讲义0916Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《市场竞争模拟》讲义0916Word文档下载推荐.docx(58页珍藏版)》请在冰豆网上搜索。
人们通常将实验室里进行的飞机模型试验叫做“模拟”试验。
模拟的例子很多,比如建造一个水库大坝也要经过模拟试验,大家还可以想出其它的例子。
从上面的例子可以看出“模拟”的几个特点:
(1)模拟对象的复杂性
在上例中,飞机在高空飞行遇到各种气流变化时,飞机的状态和性能会产什么样的变化,这是设计师说不清楚的,有些情况甚至是想象不到的。
假如设计师能通过某一个公式把飞机的各种状况准确地计算出来,而且计算也不复杂,他也就不会再费力做模拟试验了。
(2)模拟系统与模拟对象的相象性
在风洞里做试验的飞机模型与实际设计的飞机原型要尽量相象,飞机的机身与机翼的尺寸比例、飞机的比重等要与飞机原型相同。
风洞中的气流变化也要与实际的高空气流变化尽可能相象。
甚至包括飞机模型的表面材料也要尽量一致。
但是,飞机模型里面,不一定要有机舱座位等,因为它们不与外界气流直接接触。
因此,模拟系统是模拟对象那个复杂系统的近似或抽象,它要能反映原系统中重要的本质性的特征。
当然,这里所说的“本质”依赖于模拟的目的。
比如,同样是一个新型的飞机,要试验旅客座位的舒适性和安全性,就必须制造出几排座位,用机械产生升空、降落和颠簸的状况,以观测旅客的感觉。
如果没有人身安全问题,可能直接由志愿者参加试验,因为“飞机”根本不升空,甚至可能连翅膀都没有。
(3)模拟系统的可控性
模拟系统比原系统要简单,这是显而易见的。
但是,模拟系统不仅是简单,它应该具有可控性。
比如,风洞实验室应该能按试验人员的意愿产生不同方向和大小的气流,这可以让设计师观察到各种复杂的情况下飞机的性能。
有些情况可能是在实际中很难遇到的,比如,观察飞机在一个机翼失灵时的状况。
(4)模拟试验的可重复性
模拟试验是科学的,其观察结果是稳定的,虽然可能存在微小的随机误差。
基于此性质,人们可以从多次试验结果分析出客观事物存在的规律性。
在以上所说的飞机试验模拟中,人们也可以通过不断调整设计的参数,改进飞机的性能。
2.计算机模拟
在了解了什么是“模拟”以后,让我们一起来看什么是计算机模拟。
与用风洞实验室进行飞机的试验设计不同,计算机模拟所用的模拟系统是利用计算机程序实现的。
它不是用有形的风洞和飞机模型,也不是用有形的计算机。
如果要模拟计算机在电压不稳时的工作性能,那时模拟系统就是计算机硬件。
但现在人们通常说的计算机模拟是用计算机软件实现的。
这里所说的“软件”包括商用软件和自编的计算机程序。
商用软件不过是别人编的有特定功能的比较完善的计算机程序而已。
在具体讨论计算机模拟以前,先介绍一个掷硬币的游戏(参见FrederickS.Hillier&
GeraldJ.Lieberman)。
例1.1掷硬币游戏的规则如下:
每扔一次硬币就要花1元钱,连续扔硬币,不得中间退出,直到累计出现的正面与反面次数之差的绝对值等于3为止。
游戏参加者在结束时可以得到10元。
这看来是一个小孩玩的游戏,或者是一个赌博问题,而实际是经营管理中大量遇到的风险投资问题的抽象。
用掷硬币这种游戏的方式叙述,是为了简化问题,形象易懂。
面对如此一个投资机会,大家都可以凭经验做出判断:
参加这一游戏是否值得。
一般说来,不能给出肯定的结论,因为大家知道掷硬币有随机性。
所以人们会猜测或判断平均说来是赢、是平还是输。
喜好数学的朋友首先可能想到这是一个求期望的问题,可以写出公式算一算。
但真地写公式时会发现其复杂性令人生畏。
有人会想到:
何不在家里“模拟”一下,真的拿硬币掷一掷?
其结果可能是:
甲掷了5次,4次正面,1次反面,赢了5元;
乙掷了15次,6次反面,9次正面,输了5元。
哪一个结果可信呢?
聪明人会说:
“要估计平均值,应该进行许多次,再求平均”。
但掷多少次为好呢?
如果一个人要掷一天硬币,除了胳膊疼、心里烦以外,时间的成本也是应该考虑的。
在有了计算机以后,人们会想到:
能否让计算机去做上面的模拟实验呢?
因为计算机在算术方面比人们快得多,只要能解决“掷硬币”问题就行了。
所谓“掷硬币”,就是要求计算机能象实际掷硬币似地决定“出正面”或“出反面”,并体现硬币的均匀性和随机性。
要体现均匀性是容易的,只要简单地让“正面”与“反面”交替出现即可。
但是,它与实际掷硬币的情形相差太远。
在掷硬币时,出现“正”、“反”、“正”、“反”、......的情况的概率极小,与连续出“正”或连续出“反”的情形一样。
也许有人提出置疑:
“这种情形的概率与任何一种排列顺序出现的概率是一样的”。
是的,但问题在于不能在多次重复时只是采用“正面”与“反面”交替出现的方式,没有变化。
解决问题的关键是要让计算机能产生出“变化的”序列,同时保持“正”、“反”出现的概率相同或非常接近。
换句话说,如果计算机能产生出遵循一定概率分布的随机数就好了。
关于产生随机数的方法我们以后再细讲,但我们可以告诉大家,这个问题已经解决了。
如果用Excel,只要调用rand()函数即可返回一个介于0和1之间的随机数。
如果熟悉C语言,可以利用其中的RAND()或random()函数产生随机数。
以下给出了一个C语言的小程序,它可以模拟100次掷硬币的游戏。
#include<
stdio.h>
stdlib.h>
voidmain(){
inti,n_head,n_tail;
intnum_test=100;
floatv,earnings=10;
for(i=0;
i<
num_test;
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);
}
printf("
Onanaverage,youeared%fyuan."
earnings/num_test);
}
只要你愿意,你可以改变程序中的num_test的值,产生1000次、10000次甚至更多次的模拟实验。
我们做了6次不同运行次数的实验,其结果如下表所示。
其中模拟1000万次的实验在奔腾II166的计算机上用了2分钟。
模拟次数
100
1000
10000
100000
1000000
10000000
平均收益
2.080000
1.442000
0.997200
0.990440
0.995088
0.998228
面对多次运行的不同结果,如何做出正确的判断是计算机模拟中经常遇到的一个问题。
以下三点是应该注意的:
(1)不要期望结果十分相近,象上面那样的结果是很正常的。
(2)一般说来,运行次数多的更可靠一些。
运行次数与统计学里的抽样样本的大小是一致的。
(3)对于同样的运行次数,还可以用变换随机数种子的办法运行多次,再求出均值和方差,得到点估计和与置信度相应的区间估计。
我们也可以在上面的程序中,记载下收益的最小值、最大值;
除了计算出均值,还可以计算出收益的方差、标准差,进而做出某一置信度(比如95%)下的区间估计。
这一练习的机会留给大家。
有了以上的例子,现在我们对计算机模拟进行具体的讨论。
1)计算机模拟的特点
首先,计算机模拟具有一般模拟的特点:
模拟对象的复杂性常表现为计算的复杂性,不容易用数学显式表达或不便于运算求解,模拟对象的一些变量还可能具有随机性。
计算机程序要反映模拟对象的本质关系。
要根据实际的模型建立相应的数学模型,再编制计算机程序。
人们可以很容易地改变程序中的参数值,观测相应结果的变化。
人们可以多次模拟,并且可以重复演示模拟的结果。
计算机模拟还具有以下特点:
(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米的水位。
再如,模拟中国若不采取计划生育政策人口的变化情况,虽然不符合中国的实际(已经实行计划生育政策28年),但这种模拟对分析中国的计划生育政策影响是很有必要的。
因此,不要把模拟狭义地理解为对现实系统的模仿和近似,它还可以回答更多的“如果...如何...”的问题(what-ifquestions)。
有些参数的改变可能超出人们常识的范围,也可能得出意想不到的结果。
笔者在1988年做鱼群生态模拟时就发现了鱼群数量变化曲线有时非常奇怪,实际上就是人们说的混沌现象。
由于我们当时研究的重点是渔业捕捞政策,没有对这一现象仔细研究,但至少可以给我们以启发。
可以说,模拟是人们不断地认识世界、发现真理的一种有用的研究方法。
模拟的英文词是simulation,在中文中有“模拟”和“仿真”两种译法。
根据以上的分析,“仿真”容易给人以简单模仿现实的感觉,所以我们在本书中愿意用“模拟”而不用“仿真”。
二、用Excel进行决策模拟
计算机模拟的实现需要借助计算机软件,或者是专用的计算机模拟语言,象GPSS、Simscript等,或是利用计算机编程语言,如BASIC、C等。
下面我们介绍的是如何用Excel进行模拟。
我们也可以把Excel当成一种特殊的语言,它可以用于通常的表格数据运算,这是大家熟悉的。
它也可以用来进行计算机模拟,这对许多人来说是陌生的。
由于Excel软件十分普及,学会用Excel做模拟的一个好处是不需要为模拟环境发愁。
接下来,我们将利用Excel模拟的方法来解决前面例1.1的掷硬币游戏问题。
我们将根据前面的计算机模拟步骤对如何解决上述问题逐步加以说明。
2.1掷硬币游戏
规则:
每扔一次硬币就要花1元钱,连续扔硬币,不得中间退出,直到投掷达1000次或累计出现的正面比反面次数多3为止。
参加者在游戏结束时可得到10元。
我们的目标是:
在掷硬币游戏规则下决定是否要参与此游戏。
也就是说,我们想估计得到玩此游戏的最终收益(报酬减去成本)有多大;
同时,我们还需要考虑到自己的风险承受程度。
在本例中,游戏结束时的次数和收益值是变量,而正面与反面相差的次数(3)和结束时可得到的钱(10元)可以看作参数。
所谓的“构建模型”,就是找出变量之间及变量和参数之间的关系。
在本例中就是要找出游戏结束的次数如何决定、每次的收益如何计算。
如单元格F7和G7的批注所示。
我们所选择的模拟工具是Excel。
接下来,我们将从空白的Excel表开始一步步得到最终的模拟结果。
我们在空白的Excel表中填入表头,如下所示:
首先,我们需要在Excel中模拟游戏规则中的投掷硬币动作。
这很容易通过函数Rand()和If()来实现。
我们在“序号”列中输入1至1000。
具体方法是:
先在单元格A4中输入1,将光标定位在该单元格,然后点击菜单“编辑”“填充”“序列”。
在弹出的对话框中选择“序列产生在‘列’”,“类型”为“等差数列”,并将“终止值”设为1000。
点击“确定”即可。
接下来我们利用函数Rand()来产生随机数。
我们只需在单元格B4内输入公式“=RAND()”,然后将此单元格复制、粘贴到“随机数”列的其它999个单元格中,即产生1000次随机数。
注意:
函数Rand()能产生0至1之间的一个随机数,从而模拟了投掷硬币出现正反面的随机性。
我们继续用IF()函数来确定硬币的正反面。
我们以“1”表示“正面”,“0”表示“反面”。
在单元格C4内输入公式“=IF(B4>
=0.5,1,0)”,然后将此单元格复制、粘贴到“是否正面”列的其它999个单元格中。
该IF函数的作用是:
如果刚才产生的随机数大于或等于0.5,那么该单元格的值就为1,即本次投掷的硬币为正面;
如果随机数小于0.5,那么该单元格的值就为0,即本次投掷的硬币为反面。
这样,我们就实现了随机投掷硬币1000次的正反面结果。
接下来,我们需要根据题目所给出的条件“直到累计出现的正面与反面次数之差的绝对值等于3为止”来判断“是否结束”。
因此,我们需要计算出累计正面的次数和累计反面的次数,并计算它们的差值,从而判断“是否结束”,类似地,我们也是利用IF()函数和求和函数SUM()来实现上述过程。
我们分别在单元格D4和E4内输入公式“=SUM(C$4:
C4)”和“=A4-D4”,然后分别将此两单元格复制、粘贴到“累积正面”列和“累积反面”列的其它999个单元格中。
接下来,我们利用IF()函数来判断“是否结束”,以“1”表示“结束”,“0”表示“不结束”。
因为第1次不可能结束,所以我们可以直接在单元格F4中填入“0”。
我们从第2次投掷硬币起开始判断,于是我们在单元格F5中输入公式“=IF(D5-E5=B$2,1,0)”,并将此单元格复制、粘贴到“是否结束”列的其它998个单元格中。
Excel中的相对引用、绝对引用和混合引用
随着公式的位置变化,所引用单元格位置也是在变化的是相对引用;
而随着公式位置的变化所引用单元格位置不变化的就是绝对引用。
混合引用具有绝对列和相对行,或是绝对行和相对列。
当选中公式中的单元格地址时,使用F4键能简单地对单元格的相对引用、绝对引用和混合引用进行切换。
上面单元格F5中所输入公式中的B$2即为混合引用,具有绝对行和相对列。
不过,这样做存在一定的问题,即可能会出现游戏已经结束但对游戏是否结束的判断仍然继续的情况!
如上图中本来第5次投掷硬币后游戏已经结束,但程序仍然对第6次及以后游戏是否结束做出判断。
因此,我们需要加入一个约束条件来消除上述情形的发生,也就是说,采用两层嵌套IF函数的方法。
具体的做法是:
我们在单元格F5中输入公式“=IF(F4=1,1,IF(D5-E5=B$2,1,0))”,即“如果‘上次已经结束’,则本次结束,否则对‘本次是否结束’进行判断”。
我们将此单元格复制、粘贴到“是否结束”列的其它998个单元格中。
最后,我们需要计算玩此游戏的最终收益,也就是最后所得报酬减去每次投币所花的钱。
因为第1次不可能结束,所以我们可以直接在单元格G4中填入“-1”(因为每次投币需要花1元钱)。
类似“是否结束”列的做法,我们从第2次投掷硬币起开始判断,在单元格G5中输入公式“=IF(F4=1,G4,IF(F5=1,D$2-A5,-A5))”,即“如果‘上次已经结束’,则本次赢得等于上次赢得,否则根据‘本次是否结束’来计算赢得——如果结束,则得到‘最终报酬’减去‘已经投币的花费’;
否则即为‘已经投币的花费’”。
我们将此单元格复制、粘贴到“赢得”列的其它998个单元格中。
然后,在单元