swdata/s_r.py
2023-03-15 21:16:16 +08:00

97 lines
2.5 KiB
Python
Raw 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.

"""
计算s_r即当轮剩余可用时间总和
输出:
json格式
{
"GID": [s_0, s_1, ..., s_n]
}
"""
import json
from island.match import Match
from island.matches import Matches
class Sr:
def __init__(self):
self.details = {}
self.survivals = {}
with open('outputs/survivals_new.json', 'r') as f:
self.survivals = json.load(f)
self.seasons = [
Matches('wos-data-2022-pd')
]
self.results = {}
def get_s_r(self, m: Match, r: int):
"""
获取该轮所有剩余时间
S_r = 存活人数*1440 - 每个成功完成的博弈时间*2
:param m: Match
:param r: Round ID
:returns: s_r
"""
actions = m.query('action', 'done').where(lambda x: x['rno'] == r).raw_data
total_tr = len(self.survivals[m.name][str(r)]) * 1440
for act in actions:
total_tr -= act['tr'] * 2
return total_tr
def calc_season(self, season: Matches):
"""
calc s_r
"""
result = {}
for m in season.data:
game_end_at = int(m.query('game', 'created').first()['info']['game_end_at'])
sr = []
for r in range(1, game_end_at + 1):
sr.append(self.get_s_r(m, r))
result[m.name] = sr
return result
def calc(self):
result = {}
for s in self.seasons:
result.update(self.calc_season(s))
with open('outputs/S_R.json', 'w') as f:
json.dump(result, f)
self.results = result
def save_plot(self, name: str):
if name not in self.results:
print(f'{name} not found')
return
import numpy as np
from matplotlib import pyplot as plt
result = self.results[name]
x = np.arange(1, len(result) + 1)
fig = plt.figure(figsize=(6, 3))
ax = fig.gca()
ax.plot(x, result, 'o--', color='limegreen', linewidth=2, label=r"S_r")
ax.tick_params(labelsize=14)
ax.set_xlim(1, len(result))
ax.set_xticks(x[::2])
ax.set_xlabel("Rounds", size=22)
ax.set_ylabel(r"$S_r$", family='sans-serif', size=22)
plt.legend(numpoints=2, fontsize=14)
plt.tight_layout()
# plt.show()
# plt.savefig("graph/theta_plot.eps")
plt.savefig(f'graph/s_r_{name}.pdf')
if __name__ == '__main__':
e = Sr()
e.calc()
e.save_plot("G646")
e.save_plot("G903")
e.save_plot("G936")
e.save_plot("G933")