80 lines
2.5 KiB
Python
80 lines
2.5 KiB
Python
"""
|
||
sb策略和真人收益对比,其中分别比较sb0,sb0.2,所有人平均,获胜者平均,获胜者最高,统计10-15共6组
|
||
"""
|
||
import json
|
||
import numpy as np
|
||
import math
|
||
from matplotlib import pyplot as plt
|
||
from island.matches import Matches
|
||
from island.match import Match
|
||
|
||
human_avg = np.zeros(6)
|
||
human_count = np.zeros(6)
|
||
winner_avg = np.zeros(6)
|
||
winner_count = np.zeros(6)
|
||
winner_max = np.zeros(6)
|
||
|
||
"""
|
||
omega = np.ceil(5/(3-(x*2.6)))
|
||
fb0 = 5-omega*(3-(x*2.6+(1-x)*4.5))
|
||
fb = fb0 - (15-omega)*(3-2.6)
|
||
y = fb/2
|
||
"""
|
||
r = np.arange(10, 16)
|
||
x = 0.1924
|
||
|
||
sb0 = (8 - 0.4 * (r - 2)) / 2
|
||
o = math.ceil(5 / (3 - (x * 2.6)))
|
||
sb1 = (5 - o * (3 - (x * 2.6 + (1 - x) * 4.5)) - 0.4 * (r - o)) / 2
|
||
|
||
for m in Matches.from_profile('SURVIVE').data:
|
||
info = m.query('game', 'created').select('info').first()['info']
|
||
conf = json.loads(info['config'])
|
||
game_end_at = int(info['game_end_at'])
|
||
foods = {}
|
||
for p in m.query('player', 'join').select('pid').raw_data:
|
||
foods[p['pid']] = conf['start_resource']
|
||
|
||
for i in range(1, game_end_at + 1):
|
||
for a in m.query('action', 'done').where(lambda x: x['rno'] == i).raw_data:
|
||
foods[a['a']] += conf['payoffs']["%s%s" % (a['act_a'], a['act_b'])][0] * a['tr'] / 1440.0
|
||
foods[a['b']] += conf['payoffs']["%s%s" % (a['act_a'], a['act_b'])][1] * a['tr'] / 1440.0
|
||
for j in foods.keys():
|
||
foods[j] -= conf['rounds']['consumption']
|
||
human_count += len(foods)
|
||
for j in foods.keys():
|
||
if foods[j] > 0:
|
||
winner_avg[game_end_at - 10] += foods[j]
|
||
human_avg[game_end_at - 10] += foods[j]
|
||
winner_count += 1
|
||
if foods[j] > winner_max[game_end_at - 10]:
|
||
winner_max[game_end_at - 10] = foods[j]
|
||
if foods[j] > 3:
|
||
print(m.name, j, foods[j])
|
||
|
||
human_avg /= human_count
|
||
winner_avg /= winner_count
|
||
|
||
idx = np.arange(6)
|
||
bw = 0.15
|
||
|
||
fig = plt.figure(figsize=(5,3))
|
||
ax = fig.gca()
|
||
|
||
ax.bar(idx-2*bw, sb0, bw, color='tomato', label='Sacrifice(n=4)')
|
||
ax.bar(idx-bw, sb1, bw, color='limegreen', label='Sacrifice Max(n=4)')
|
||
ax.bar(idx, human_avg, bw, color='blueviolet', label='Human Average')
|
||
ax.bar(idx+bw, winner_avg, bw, color='gold', label='Winner Average')
|
||
# ax.bar(idx+2*bw, winner_max, bw, color='deepskyblue', label='Winner Max')
|
||
|
||
ax.set_ylabel('Average Reward')
|
||
ax.set_ylim(0,3.5)
|
||
ax.set_xlabel('Match Ends At')
|
||
ax.set_xticks(idx + bw / 2)
|
||
ax.set_xticklabels(('10', '11', '12', '13', '14', '15'))
|
||
ax.legend(ncol=2)
|
||
fig.tight_layout()
|
||
# plt.show()
|
||
plt.savefig("graph/sb_vs_human.eps")
|
||
|