马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 大头目 于 2018-7-21 16:40 编辑
最近到一本书《自私的基因》里面提到一个故事很有意思,是一个变种的囚徒困境(但问题不是囚徒困境),能做成很有趣的程序,我自己能力有限,分享给各位,请大佬帮忙指导。
故事是这样的:
有一个庄家和两个赌徒,赌徒之间不能有任何沟通,当两个赌徒都选择”合作“,则各自从庄家那里拿到3元;当两个赌徒都选择”背叛“,则各自付给庄家1元;当一个赌徒选择”合作“,一个赌徒选择”背叛“,则选择合作的赌徒得0元,选择背叛的赌徒得5元。
有一个科学家召集了一个比赛,希望收集N个程序员的赌博策略,每两个程序都比1次(单场循环PK),最后得到最多钱的程序获胜。
我的问题是:
如下是我编程的2个策略PK的程序,如何最少的优化程序使得程序可以无限扩展策略,并且能够实现单场循环PK赛,使得最后得出获得钱最多的那个程序(每场PK所得的钱累计,算最后总的钱)?
附加题:
每轮循环结果出来后得钱总数最少得策略被剔除,并且复制当赛季第一的策略继续下一轮(可以理解为最差的抄袭最好的,参赛策略总数并不减少),请得出最后能活下来的三个策略。
#囚徒困境游戏
def Plan1():
yield 1
for i in range(1000):
yield R2
def Plan2():
for j in range(1000):
yield 0
def PK_test(P1,P2):
global S1
global S2
global R1
global R2
R1 = P1
R2 = P2
if P1 == P2 == 1:
S1 = S1 + 3
S2 = S2 + 3
elif P1 == P2 == 0:
S1 = S1 - 1
S2 = S2 - 1
elif P1 == 1 and P2 == 0:
S1 = S1 + 0
S2 = S2 + 5
elif P1 == 0 and P2 == 1:
S1 = S1 + 5
S2 = S2 + 0
else:
print('P value Error')
return S1,S2
if __name__ == '__main__':
Player1 = Plan1()
Player2 = Plan2()
S1 = 0
S2 = 0
for x in range(200):
print(PK_test(next(Player1),next(Player2)))
|