运行

运行程序

if __name__ == '__main__':
    society = Society()
    society.do_humans_meeting()
    society.print_info()

.py 文件的末尾,添加如上的代码,然后运行整个 .py 文件,即可。
Python 中有不少 __ 包裹的属性,有全局性的,比如 __name____file__,也有常是针对于某个 class(类) 的,比如 __init____dict____eq__ 等等,都有其特别用处,本课程后面也会介绍到。
__name__ 比较常用,如果当前 .py 是直接运行的,其值为 __main__。一个 .py 也并不总是被直接运行的,也可能是作为 package/module 在其它地方被 import

鹰鸽博弈模拟的结果本身有不小的随机性,下面是一个运行的结果,仅供参考:

program costed seconds: 3.29087400436

init status: total 50, 38.0% are pigeon;  money: pigeons 95, eagles 155

last status: total 22, 95.5% are pigeon;  money: pigeons 5521076316, eagles 2403530

death: 50.0 humans, 56.0% dead, 14.0% are pigeon

不同参数,不同结果

写代码的时候,我们要尽可能让代码处于一个相对可变动的状态,从某种角度来说,是 可配置化
在具体工作中,如果作为程序员承接了一个项目的开发后,实现的过程中,其代码应该倾向于有较高的适应性,未来后续产品经理或者其他需求方,调整需求甚至产生新的需求,可能只需要在旧代码中改几个参数就可以了。
这个 可配置化 也有个 ,过分了,会让代码变得复杂,但如果没有这方面灵活性的考虑,又会让代码变得很死板。不过,在一些场合下,我们为了快速实现一些效果,临时代码而已,就不讲究了。

我们模拟鹰鸽博弈的过程中,预先设定了一些参数,这些参数会对全局的结果有非常大的影响。
比如 INIT_MONEY 的数值比较大,那么相对不容易破产而进入死亡的状态。还有比如下面所示,初始 50 人,但每人平均 10000 次 交锋,人少而交锋次数多,随着一些人的死亡,总的交锋次数 50 x 10000 并不会减少,意味着两两交互的次数实际上是非常高的,于是最终会进入鸽子居多数的美好时代。

INIT_HUMAN_NUMBER = 50
MILESTORE_TIMES = 10000

INIT_MONEY = 5
PER_HUMAN_COST_BASE = 10

简而言之,你可以根据自己的想法,去调整这些参数,然后看最终的模拟结果如何。
当然,数值也不要过大,不然整个程序的运行时间会非常长。