对于社会科学来说,复杂理论和基于参与者模型还是一种比较新颖的思路和方法。所以,迄今为止还没有关于这一领域的综合性教材,也极少有大学开设相关课程。如果有人对基于参与者模型的研究方法有兴趣,他们多半要靠自学了。
不久前,在密歇根大学,我曾开设了一门关于社会科学中的复杂理论的介绍课程。该课程的基本内容是希望通过案例分析和项目设计来学习怎样建立基于参与者模型。它吸引了来自政治学、经济学、人类学、生物物理学和计算机学等等领域的许多本科生和研究生,政治学、数学、商学甚至精神病学等等学科的教研人员对它也饶有兴趣。备课的过程需要我收集大量相关领域的资料,也迫使我精选出其中真正具有参考价值的部分,而讲课的经历则让我明白了初学者最有可能碰到的问题是哪些。正因如此,我现在给出的这份学习指引基本上能满足丰富而又有针对性的要求。
学生们的背景千差万别、见解大相径庭,这使我真切地感受到,传统的学科训练在塑造我们对宇宙的理解方面有着多么强劲的影响。比如,经济学的学生下意识地就会把“行为”和“选择”画上等号,而“选择”对于他来说自然就意味着“理性选择”。这其实已经在几个概念中跳了好几步。若是一个政治学的学生,就会去怀疑这番跳跃的可靠性,但一个人类学的学生则会毫不犹豫地告诉你它是没有道理的。对于一个学生物物理或者计算机的人,所谓“选择”则仅仅是一种具体问题具体分析的最优化或者适应性举动了。
虽然这些学科之间的观点南辕北辙,复杂理论的概念和基于参与者模型的技术却都是它们强有力的研究工具。甚至,正是如这二者一般的通用工具,使得不同学科的研究者之间可能互相学习。就像博弈论是社会科学和进化论生物学中一致的战略研究方法,复杂理论也是一种研究思路,适用范围和博弈论同样广泛。例如,我的学生所做的课程项目,就涵盖了从捕鱼权的制度设计、数字图书馆的设计到解释交通堵塞甚至蛋白质的折叠问题等等千奇百怪的内容。
本附录中所提供的材料可供教师或者独立学习基于参与者模型的学生参考。
如果你真的动手建立并且运行一个基于参与者模型而不是仅仅纸上谈兵的话,从中你能体会到一种真正的乐趣。有时候,这些参与者好像真的站了起来,在你身边走来走去,因为你的设计而活动,看着自己设计的创造物行动起来实在是一大快事。事实上,虽然你是造物主,你的“参与者小社会”却会常常做出一些你自己做梦也想不到、做不出的事情来。正如凯文·凯利(Kelly,1994,p.351)所说,人类有着赋予他人生命和自由的爱好——他们喜欢说,“这就是你的生命”。
参考文献
Kelly,Kevin.1994.Out of Control:The Rise of Neo-Biological Civilization.Reading,Mass.:Addsion-Wesley.
基于参与者模型的学习指引
[内容提要]本附录将会深入学习社会科学中的复杂理论和基于参与者模型所需的有关资源。以下将分三部分进行介绍:
关于计算机模拟技术的建设;
关于如何建立基于参与者模型的练习;
关于社会科学中的基于参与者模型的简要课程的课程提纲。
本书还有配套网站。[1]网站上提供了本书中涉及的大部分模型以及附录中练习的源代码和相关文件。此外,网站还包含了关于复杂理论、基于参与者模型及其合作的文献、人员、组织、软件和教育信息,以兹参考。
基于参与者模型的计算机模拟技术
编写你自己的基于参与者模型
为基于参与者模型而设计的编程环境有好几种:
1.StarLogo。这是一种适用于研究分散系统的行为的模型编程环境,特别为学生而开发。雷斯尼克(Resnick,1994)就此进行了十分详尽清楚的介绍。虽然并非旨在为严肃的研究所用,StarLogo对于以前从未接触过编程的人来说,却是一种针对基于参与者模型编程的便捷上手方式。它可以通过互联网上的Macintosh机免费得到。Logo产品中还有一种版本Microworlds Project Builder,可以同时运算更多的参与者,则需通过购买获得。Logo的用户界面十分友好,不管在PC机还是Macintosh机上都可以使用。
2.Swarm。如果需要高级编程,则应该使用Swarm编程环境,它可以提供适用于参与者模型的丰富工具。它容许嵌套定义参与者层次,完全控制事件发生的时间进程,随时探测并报告参与者及其环境的状态。在Santa Fe 研究所的网站上可以免费下载。设计者的初衷是希望Swarm的使用者们能共享自己开发的模拟工具。该系统需在UNIX中运行,并要求使用Objective C编程。对于熟悉这二者的人来说,Swarm不失为一个好选择,因为若要方便地执行一个新模型并分析其动态机制,它真是一个有力的工具。
选择编程语言
StarLogo不能用于严肃研究,而Swarm又需要对编程技术十分熟悉,二者都有一定的局限性,于是许多建模者希望能有一些使用标准编程语言的通用工具可供选择。这就涉及选择哪种编程语言的问题。我的看法是,虽然编程语言多种多样,适宜初学者使用的应该是过程语言中的一种。[2]最常用的过程语言有Basic,FORTRAN,Pascal和C,它们各有其历史和特点:
1.Basic专为初学者而设计,可能是最简单易用的编程语言。Basic适用于小型项目,不过若包含了大量的计算,它就会比其他语言运行得慢些。Basic的早期版本十分原始,但近来的版本已经好用得多了。比如,Visual Basic就已经有了能构造友好的用户界面的工具,调试工具也已比较完善。此外,它还可以在以Excel为代表的电子数据表软件中使用。这种将编程语言和电子数据表软件合为一体的做法,就使得对编程语言的完全控制和对数据表的直观观察与感觉的结合变得十分方便。
2.FORTRAN是一个老编程语言,也不如其他语言用起来方便。不过因为它历史悠久、流行面广,许多程序员还是习惯使用它,许多老的程序也是用它编的。不过对于初学者来说,干脆还是学一种新一些的语言更好。
3.Pascal是为专业编程员设计的第一种语言。它易掌握、结构化,有利于养成良好的编程习惯。本书中绝大多数模拟都是用Pascal编写的程序。
4.C语言是专业程序员们最常用的过程语言。它设计的初衷之一是使计算机之间的对话相对容易些。其中有一些快捷方式虽然方便,但一来初学者没有必要掌握,二来它们会使得自己的C代码对于别人来说更难理解。除了普及性和兼容性外,C语言的优点还在于它是当前最流行的面向对象的语言C++的基础。正是因为有了面向对象的语言,那些庞大项目的编程才易于实现,而且,将部分老程序用于新的编程环境才得以可能。因此,Java语言才会以C++为基础,而它自己也才成为万维网架构工具。
那么初学者究竟该选择哪一个呢?如果你是初次接触编程的话,那么我还是建议你不要学FORTRAN,而是根据手边已有的资源另选一种合适的语言。因为最重要的是,当你有问题的时候身旁能有人为你答疑解惑。比如,正好有朋友或合作伙伴精通Pascal,那么就用Pascal吧。此外,如果你想选修关于编程的课程而正好又有一门是关于C语言的,那它也不失为一个好选择。如果不幸的是,你实在找不到谁可以寻找帮助,也没有什么课程可供指导,那就根据你编程的目的打算严肃到什么程度而选择吧。若你只是想小试牛刀,找找亲手编程的感觉,或者只打算测试一个简单的想法,那VB就够用了。但若你确定自己在很长一段时间内都会编写程序,而且希望使用一种不断发展的语言,那C或者C++当然是不二之选。
一个好的基于参与者模型编程所应达到的目标
基于参与者模型的编程应该达到以下三个目标:有效性、可用性和可扩展性。
有效性目标指的是,所设计的程序应能正确地实现该模型。(至于模型本身能不能准确地代表真实世界那就是另一种有效性了,与此处的讨论无关。)要满足有效性标准,看似简单,实则困难。问题的关键在于,当出现意料之外的结果时,要能分得清它是编程的错误呢,还是模型本身就会有令人惊异的推论。比如,在第七章介绍的社会影响模型中,幅员辽阔的国家中稳定的区域就比领土小些的国家少。因此,我们需要仔细分析这是模型本身的结论还是程序的缺陷。[3]
可用性目标能保证你以及后续运行该程序的人能够解释它的结果,理解它的工作原理。在你编程的时候可以随心所欲地改变自己希望得到的结果,这就意味着你可能会编出一系列的程序,每个版本都和其他版本有这样那样的不同。它们差异的方面,可能在于数据处理的方式各异,可调节的参数不同,甚至控制参与者行为的规则也不一样。把这些都记录下来是十分必要的,尤其是当编程者希望能够把改写后程序运行的结果与先前版本的结果相比较,以找出造成如此差别的原因在哪里时,保留一份良好的编程追踪必不可少。
可扩展性目标是为了后续的使用者(包括你自己)能够根据新的用途方便地改写该程序。例如,当研究者用这个模型完成了一篇论文后,可能会想看看如果添加一个新特征会有什么变化。此外,其他研究者可能某天为了试试模型新添的变量效果如何而修改该程序。如果在编程和存档时能把这个目标牢牢记在心里,所编出的程序的可扩展性就会好得多。
项目管理
为了达到有效性、可用性和可扩展性的目标,整个研究工作都必须相当仔细。它涉及的就不止是编程,而必须将文件编制和数据分析问题也考虑进去。我发现,有时候自己会太过急于看到模拟的结果。不管是自己编写程序、编制文件,还是让研究助手做这项工作时,我都有这样的倾向。但快速得来的结果却常常是不可信的。好的习惯要求在开始时放慢速度,再在长期的应用中逐渐加速。要防止大错,避免花更多的努力来澄清误解,就必须要养成一个好习惯。
如果你是刚开始尝试计算机模拟,那好好花些功夫养成好习惯是极为值得的。具体应怎么做取决于你自己的编程经验和项目的要求。总之,这里的目标在于养成一系列有效率的习惯,而耗费的管理成本却减至最小。根据自己的经验,我可以提出以下建议以兹参考:
1.将绝大部分变量都定义为长名而不是短名,因为后者可能在一个月后你自己也难以理解了。只有少数确实很常用的变量才适用于i和j或者x和y这样的定义法,除此以外,我们很有必要多花些时间来输入或者剪切、复制长变量名,因为它会清楚得多。
2.在程序最前面列出所有变量。有一些编程语言,比如Pascal和C语言,要求你在使用前要将所有变量及其类型(比如,是整数还是浮点类型)都定义清楚。而有一些语言,以VB为代表,却容许你自己选择是否要做出清晰的变量声明。不过,我建议你应该强迫自己养成在使用变量前将其尽可能定义清楚的习惯,这会大大节省你调试程序的时间,因为如果在代码里有哪个变量名拼错了,编译程序就会提醒你这是个非法变量,而不会把它当成一个新变量。
3.写下有益的评论。比方说,当你定义一个变量的时候,就在评论里写清楚,它所代表的是什么,以及应该如何把它与相关变量区分开来。类似的,在代码中间用评论把每个子程序的用途和它怎样与主程序联系起来都写明白也十分重要。把评论和代码写得一样多真的是个好做法,过些时日,甚至数月数年之后,你就会明白它们是多么的有用了。
4.把程序的序列设计清楚,使它们能够向上兼容。这样一来,新版本就能把老版本中的所有有用特征都包含进去。比如,假设你设计的模型里有一个10×10的数组,每个元素都有4个相邻元素。那么你可以通过环绕映射来实现,也就是把南北边界和东西边界的元素各自对应设为相邻元素。以后如果你又想把它做成有边界的平面映射时,就用不着删去原来那个环绕映射中与边界有关的那部分代码,而只需把它们单独分隔出来作为一个子程序,再编写另一个子程序把这些边界与新的映射联系起来就可以了。最后,再添一个控制变量作为开关,来确定某一次运行用的究竟是环绕映射还是平面映射。这样,以后你再想重新用环绕映射时就很轻松了。
5.把输出完整地标示清楚。一个程序的输出包括:该次运行的日期和时间、次序编号、程序版本号、决定运行性质的参数环境,以及采用的随机数种。这样,以后你就可以把该次运行精确地复制出来。而如果该程序的不同版本之间像前面说的那样是向上兼容的话,不管你用它的哪个新版本,都可以把以前的运行再复制一遍。
6.编程要谨慎小心。动手时花几分钟多想想能帮你节约大量的时间,免得以后费时费力地再去寻找里面那些让人头疼的缺陷。我已经说过,首先把变量都定义清楚可以免除很多笔误带来的麻烦,而使用长文件名能保证几个月后不会连你自己也搞不清楚“XKLT”这等文件名是什么意思,避免了不必要的尴尬。此外,谨慎的做法还包括把计划中的变量的极限都声明清楚,然后你就可以放心地使用编译器来进行自动调试了。例如,若变量Agent_X_Location取值在1和Max_X_Coordinate之间,那就要想办法保证你所用的编译器能明白这一点,或者你自己在代码里实现它。最后,尽量少用指针。因为虽然用它对于某些关系的编写程序是最方便的,但若一个指针定义错了,就会弄出一些奇怪的错误症状,分辨和修复它们会很麻烦。所以,有必要使用指针时,一定要多加小心。
7.把代码的每个版本都存档说明清楚。说明文件应该包括以下内容:该模型的精确说明,计算中所采用的算法,输入的细节,以及对输出的说明。其中,把输出解释清楚尤其紧要,因为它们通常只是标记得很简单的一列数据,若一个月不碰,很可能你自己也看不懂了。在大多数情况下,对新版本的说明只要简单明了就可以了:“版本2.3与版本2.2唯一的不同之处在于增加了一个平面映射的选项。这通过设Flat_Map为真来实现。如果Flat_Map为假,映射仍如前面的版本一样为环绕映射。”它不用写得如何的精致简约,但一定要保证完整和准确。当然,一般来说,在程序里加入必要的文件说明就可以了。不过,若能把完整的说明书写成备忘录,以后管理起来,又会方便很多。
8.用商用程序来进行大部分数据分析。在你自己的程序里,只做如算平均数一样的简单数据处理,从而把必要的输出尽可能缩减,其他的就用别人开发好的可靠软件去运算。比如,一个好的数据表软件能帮你处理变量,进行简单的统计分析,用各种方式绘制数据图表。除数据表外,用Mathematica一类的程序也很好用,因为它除了会统计分析和作图,还能提供一个良好的记事结构,把你的工作轨迹记录清楚。
9.验证程序时,除了最终结果外,还要检查微观动态过程。由于基于参与者模型常常会有一些出人意料的结果,一般来说你不可能用已知的结果来验证它的输出。相反,你要做的应该是保证自己的程序已经正确处理了所有的细节。比如,你应该检查的是一个给定的基于参与者模型在不同的可能环境中表现如何。与常见的数据分析比起来,这就要求你的临时报告要写得更加详细一些。
10.如果建模和编程的不是同一个人,那你们就应该确保彼此对对方的每一步行动都一清二楚。两个人很容易就会觉得他们各自已经完全理解了对方,但常常是过了很久却发现原来在他们所谓的一致意见上,两人还是有着微妙的分歧。要验证基于参与者模型本就比较困难,所以要编好这样的程序,在建模者和编程者之间做到彻底的、准确的交流就显得特别重要了。
要做好项目处理比编好一个程序难得多。因为你还要设计出一整套的系统方法,用以得到输出、分析数据、解释结果。例如,当你在解释一次特定的运行结果时,好的做法是写下备忘以供自己日后参考。而像文件说明,虽然不必精致简约,却一定要十分准确。比方说,假设你想试试平面映射和环绕映射的运行有何不同时,就应该把前一组运行和后一组运行的结果在备忘里加以对比。这样的备忘要包含能确认输出的信息,比如该程序的版本、参数环境和此次运行的编号。这其实是举手之劳,只要用文字处理软件打开输出文件,选定相关信息,剪切复制到你写的备忘里就可以了。然后再把你对数据的理解记下来,包括从你对相关数据的分析中复制一、两个图表。这样,一系列的备忘就组成了一个“实验笔记本”,把你对建模过程的理解详细地记录了下来。以后,在你的最终报告里,这些备忘正是其中数据分析部分的基础。
练习
学习基于参与者模型最好的办法是自己动手建立和运行几个模型。以下一组练习可供你选用。你掌握了编程语言后,每个练习只要花几天时间就可以做完了。它们既适用于课堂教学,也适用于自学。前三个练习可以参考网上已有的源代码稍加修改来完成。[4]
练习1:谢林的倾覆模型(Schelling's Tipping Model)
托马斯·谢林(Thomas Schelling)最著名的成果是他的威慑理论,其实他也是基于参与者模型领域中的一名先锋人物。他强调,从制定个体的行为规则出发、通过模拟去揭示大规模的输出的含义是十分重要的。并将这称为“微观动机和宏观行为”(Schelling,1978)。
他曾经设计了一个模型,证明即使在忍耐力很强的人们之间,也会出现完全隔绝的邻里关系。这就是著名的倾覆模型(Schelling,1978,pp.137-155)。其实这个模型很简单。其中空间就是一个64格的棋盘,代表了人们所居住的地区。行动者有两类,用一分和五分的硬币来代表。当然,你也可以把它们想成黑方和白方。随机地把硬币放在格子里,每个格子不超过一个。基本的思路是,一个行动者若要感到满足,那他的近邻中至少要有1/3都和他类型相同。所谓近邻指的就是他旁边格子的占有者。比如,如果旁边8个格子都被占了,那至少其中要有3个和他一样,该行动者才会觉得满意。如果行动者满意了,那他就停下来不动;如果没满意,就会继续移动。在谢林的原始模型中,他会一直移动到最近一个会让他感到满足的格子中去。为了把练习简化一些,这里我们将这个模型稍加改编,只规定未满足的行动者会随机移动到某一个空格中去。
现在要做的练习就是执行该模型,研究它的行为方式。另外,特别重要的是,检验谢林对自己的这个倾覆模型所做的一个推论:“或许……如果冲浪者对游泳者的存在的介意程度小于游泳者对冲浪者的介意程度……冲浪者要享受到的水域面积就多于游泳者。”
更加具体地说,假设有20个冲浪者和20个游泳者。[5]对于冲浪者来说,只要有1/3的邻居是冲浪者,他就满意了。但对于游泳者来说,至少要有一半的邻居是同类他才能满足。将行动者从1到40加以编号,然后每次循环中行动的次序都保持一致。运行模型进行40次循环。在24个空格里,如果哪个格子的邻居是比游泳者多的冲浪者,就在里面写上A,如果其邻居是比冲浪者多的游泳者,就写上B(这个用手工填写就可以了,要设计成程序自动操作反倒麻烦许多)。然后看看,如果A占的格子比B多的话,就说明冲浪者占据的水域面积真的比游泳者多。重复10次,就可以大致看到结果的分布情况了。
如果你是初学者,可以借鉴我已经写过的关于执行这个改编模型的源代码和文件说明,源代码有VB的也有Pascal的。要完成这个练习可以要求对源代码做一些简单的改动,因为这里假设的是两类行动者感到满足的条件不一样。
练习2:谢林倾覆模型(续)
本练习的目的是看看若二类行动者的数目不等情况又会有什么变化。你可以继续采用前一个练习中的改编谢林模型。通过这个练习,我们要回答两个问题并解释其原因:
1.数目少的类型是不是比数目多的类型聚集得更紧密些呢?
2.此时的调整过程是不是比两类行动者数目相等时更快些呢?
具体地说,我们还是假设两方分别是黑方和白方,他们感到满足的标准都和原始模型一样(即都相同)。仍然采用前一个练习中的A与B的标示法来考察密度问题。
程序必须运行到每个行动者都不会再有进一步的调整为止,为此,一个简单的办法就是设计至少40次循环,保证每个行动都至少都被验证过一次。如果当前的循环中已经没有任何变动发生,那就说明每个行动者都感到满足而不会再有调整了。如前所述,初学者可以借鉴已有的源代码,再加以必要的修改。
练习3:扩展的社会影响模型
下面提供的是一个对已有模型进行扩展的练习,我们将以第七章中介绍的社会影响模型为基础。该模型十分简单,即使扩展以后操作起来也不难。这个练习的目的就是看看通过扩展能给既定的模型带来些什么新见解。
在第七章的“模型扩展”部分,我们已经简要地列出了一些建议。现在将对其中的两个进行更加详细的讨论。
初始地理差异。在基本模型里,文化特征的初始值是随机分配的。我们为某些特征或者所有特征都赋予特定的值,就可以进行很多有趣的实验。举例来说,假定一个人想要研究看起来很普遍的“南面的都不同”的现象。最简单的处理办法就是,在北面场所设定一两个文化特征,而南面场所设不同的值。初始小小的差异,是否最终会导致区域的形成?如果是这样,那么南北区域最终的分界线是否接近最初我们设定的南北分界线?另一个有趣的实验是研究,数量上的初始优势扩散到整个空间里,这有多容易或者多难?研究这个问题的方法是,在空间里初始分配特征的价值时,故意地轻度偏向,然后观察它如何克服趋势,压倒随机变量的影响,最终支配整个空间。
文化吸引。一些文化特征在演化过程中比其他文化更容易被别人所采用。比如,对人们来说,阿拉伯数字比罗马数字更容易接受,不要说其他了。文化特征的微分吸引也许是因为更高级别的技术原因所致(正如数字系统中的情况),或者是由看起来很武断的偏好所致。模型化这个过程,就是对一些文化特征赋予高的值,给其他特征赋低的值。假定认为,更有吸引力的文化特征会驱逐那些不那么有吸引力的特征。那么一个特征必须具备怎样的吸引力才可能占到支配地位呢?微分吸引的过程会导致更大(于是也就更少)的区域吗?
附带地说一下,我对这两类扩展所提出的问题还有第七章提到的其他问题并没有很好的答案,它们都是开放性的研究主题。
社会影响模型的源代码和文献都可以在互联网上获得,包括用Visual Basic和Pascal语言写的代码。[6]
练习4:起立鼓掌
假设有许多观众正端坐在礼堂里观赏一场精彩的演出。演出结束,掌声响起,大家甚至起立鼓掌。现在这个练习就是要对这个起立鼓掌的过程建模。你可以把你的模型会有哪些潜在的有趣方向考虑进去,也应该想一想是不是有一些经济或者社会现象原理可以用同样的思路建模。[7]
练习5:人浪
足球场里坐满了观众。有人站起来大呼一声:“人浪。”此时,如果人人都遵守规则A的话,那一轮人浪就产生了:当一边(或者两边)有人站起来了,那自己也站一秒钟。
简单一点说,假设只有20个人,坐在一个圆形的场地里。可以把他们看成一条直线,只是要记着第20个人既和第1个也和第19个人相邻。
现在,再假设人们按规则B行事,即除遵循规则A以外,只要某人坐下来,那她/他至少要坐两秒钟。
练习的第一步是,比较仅在规则A和在规则A和B的组织之下,行为结果会有什么不同。
第二步,将以下部分或全部事实考虑进去,对A-B模型进行修改:
1.人浪实际上是向一个方向流动,而非两个方向。
2.即使有人从来都不站起来,人浪也可以继续。
3.人浪最终会渐渐平息。
4.有人需要保持坐着的状态超过两秒钟。
关于社会科学中基于参与者模型的简要课程
如果你希望能够更加系统地学习复杂理论在社会科学中的应用,那么可以参考一下我们下面将要给出的关于此问题的简要课程的提纲。它主要面向高年级本科生和研究生,所需的预备知识不多:只要在你想做练习的时候,已经掌握了某种编程语言就可以了。
本课程的设计首先应该考虑到复杂理论本身还是一个崭新的、快速发展的领域,这有两层含义:第一,现在还没有任何一本关于复杂理论的综合性教科书。因此,最好的学习方法就是阅读原始研究文献;第二,由于社会科学中复杂理论的基本方法是基于参与者模型的,多学习各种各样具体的模型就十分有益。因为每一个具体模型的报告不仅包含了建模的思路,而且给我们提供了分析模拟数据的有用技术,引导我们该如何从模型中得出推论,以理解真实的社会问题。即使你本来就只对单一的学科感兴趣,多多阅读不同主题的研究报告,也能从中抽取出可以应用到自己领域中的有益思路来。
本课程包含了基于参与者模型在社会科学中的大量应用,包括选举、市场、居住分隔、社会影响、战争、联盟、国家形成、组织变迁等等。这个模型可以检验的事件很多,比如路径依赖、对初始条件的敏感性、自组织结构的出现、适应环境改变的变化,甚至基于参与者模型的价值判断标准本身。
前一部分的练习建议在阅读完材料后就马上进行,前三个练习可以在前四周完成,后两个最好在第七周之前完成。
如果你是教师,想开设一个一学期的课程,那我要建议你在阅读和练习中增加一个主要的项目,它可以是建立和分析一个原始的基于参与者模型(或者部分地由其他模型改编而来的模型),也可以是对某个特定领域中复杂理论的应用情况的回顾和评论。要求学生独立完成或者分组完成都可以。而最后的几周应该留出来让学生们就自己做的项目提交报告。
此外,网上还有其他补充阅读材料可供你们参考。[8]
参考文献
Poundstone,William.1985.The Recursive Universe:Cosmic Complexity and the Limits of Scientific Knowledge.Chicago:Contemporary Books.
Resnick,Mitchel.1994.Turtles,Termites,and Traffic Jams:Explorations in Massively Parallel Microworlds.Cambridge,Mass.:MIT Press.
Schelling,Thomas.1978.Micromotives and Macrobehavior.New York:Norton.
译后记
本书引言和第一章由高笑梅翻译,第五章和第七章由张震翻译,其余部分由梁捷译出,并统校全书。郑娟亦对全书翻译提供了很大的帮助。韦森老师一直关心本书的翻译,并且热情做序。上海人民出版社范蔚文老师为此书的出版花费了大量的心血,在此谨志衷心的感谢。译者水平有限,译文中的错误和不当之处在所难免,还望读者批评指正。
梁捷