swdata/sb_vs_human.py
2022-04-28 11:56:07 +08:00

80 lines
2.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
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")