从囚徒困境到世风日下

在每个时代我们都会听到人们感叹世风日下,人心不古。这到底是对旧时代的幻觉还是一种真相呢?我们今天就来写个小程序,证明世风日下是的的确确在发生的。

我们先从博弈论的囚徒困境说起,两个囚犯面临这样的问题,要么同时咬紧牙关一起抗拒从严回家过年,或者坦白从宽刑期打折。但是如果一个人坦白了,而没有坦白的那个人就得牢底坐穿。参考以下表格可以得到结论:

囚徒困境
乙方抗拒 乙方坦白
甲方抗拒 无罪 / 无罪 5年 / 1年
甲方坦白 1年 / 5年 2年 / 2年
  1. 双方一起抗拒,全部无罪释放,收益最大。
  2. 甲方抗拒,乙方坦白,甲方坐牢5年,乙方坐牢1年。
  3. 甲方坦白,乙方抗拒,甲方坐牢1年,乙方坐牢5年。
  4. 甲乙都坦白,全部坐牢2年。

道德问题的本质是信任问题,上古时期民风淳朴,人与人之间都相信相信的力量,所以能相信一起做出收益最大的决策(至于两个淳朴的人为什么会坐牢?这...)。但信任这事,吃了几次亏之后,戒备心开始提升,做决策必须考虑对方不按套路出牌怎么办?如果这位大兄弟被社会多教育几次,他就会发现坦白是最优解,毕竟无罪释放需要对手合作,概率太低。

大多数人都是理性的,在受到惩罚后会调整自己的反应决策机制。我们可以构造一个模型,假设一个人初始是向善的,基本是信任对方的,但是每次遭受背叛后,他的信任值就会下降。而且人们一般对坏的事情印象深刻,所以自己行善被别人坑后,人品值下降会比遇到好人好事的上升更多一点。

为了模拟这种情况,写了一段程序模拟了一下:

import random

def init(users, n):
    for i in range(n):
        users[i] = 51 # 设置每个用户的初始人品值为51,最小为0,最大100。
        
def do_choice(users, i):
    r = random.randint(0, 100)
    return 1 if r < users[i] else 0 # 人品值越高,做出双赢选择1的概率更大。

def update_rp(users, i, v):
    users[i] += v
    if users[i] > 100:
        users[i] = 100
    if users[i] < 0:
        users[i] = 0
        
def gamble(users, rounds):
    n = len(users)
    i = 0
    while i < rounds:
        u1 = random.randint(0, n - 1) # 随机两个用户
        u2 = random.randint(0, n - 1)
        if u1 == u2:
            continue
        c1 = do_choice(users, u1)
        c2 = do_choice(users, u2)
        if (c1 == 1) and (c2 == 1): # 最优选择,双方人品值加1。
            update_rp(users, u1, 1)
            update_rp(users, u2, 1)
        elif (c1 == 1) and (c2 == 0): # 被用户2坑了,用户1变坏,人品值减1.5。坏事让人印象更深刻!
            update_rp(users, u1, -1.5)
        elif (c2 == 1) and (c1 == 0):
            update_rp(users, u2, -1.5)
        i += 1
        
def display_result(users):
    good, bad = 0, 0
    for v in users.values():
        if v >= 50:
            good += 1
        else:
            bad += 1
    print('good/bad: ' + str(good) + '/' + str(bad))

def simulation(n, rounds):
    users = {}
    init(users, n)
    gamble(users, rounds)
    display_result(users)
    
if __name__ == '__main__':
    simulation(100, 300)
    simulation(100, 1000)
    simulation(100, 5000)

结果是迭代次数越多,好人越少。参考输出如下:

good/bad: 62/38
good/bad: 28/72
good/bad: 5/95

那为什么这个世界不会全是坏人组成呢?我猜原因跟电脑一样,时间厂了系统卡得不能用总有人会忍不住格式化一下。

猜你喜欢

转载自blog.csdn.net/panda_lin/article/details/108780869
今日推荐