swdata/food_loss.py
2018-08-19 23:26:08 +08:00

91 lines
3.2 KiB
Python

import json
from matplotlib import pyplot as plt
from matplotlib import patches as pch
from island.match import Match
from island.matches import Matches
import numpy as np
from scipy.stats import pearsonr
class Solution:
def __init__(self, mode):
self.mode = mode
self.matches = Matches.from_profile_expr(lambda r: mode in r)
def food_loss(self):
survivals = {}
with open('survivals.json', 'r') as f:
survivals = json.load(f)
fl = [[],[]]
payoff = {
'C': {
'C': 2.6,
'D': 0
},
'D': {
'C': 4.5,
'D': 0.5
}
}
for m in self.matches.data:
info = m.query('game', 'created').select('info').first()['info']
game_end_at = int(info['game_end_at'])
for p in m.query('player', 'join').raw_data:
pid = p['pid']
for i in range(2, game_end_at):
if pid not in survivals[m.name][str(i)]: break
c, t = 0, 0
for r in m.query('action', 'done').where(lambda x: x['rno'] == i - 1 and (x['a'] == pid or x['b'] == pid)).raw_data:
if r['act_a' if r['a'] == pid else 'act_b'] == 'C':
c += 1
t += 1
is_coop = 0 if c * 2 >= t else 1
f = -3.0 if self.mode == 'SURVIVE' else 0
for r in m.query('action', 'done').where(lambda x: x['rno'] == i and (x['a'] == pid or x['b'] == pid)).raw_data:
if r['a'] == pid:
f += payoff[r['act_a']][r['act_b']] * r['tr'] / 1440.0
else:
f += payoff[r['act_b']][r['act_a']] * r['tr'] / 1440.0
fl[is_coop].append(-f)
print(len(fl[0]), len(fl[1]))
print(sum(fl[0]) / len(fl[0]), sum(fl[1]) / len(fl[1]))
return fl
if __name__ == '__main__':
sc = Solution('CLASSIC')
fc = sc.food_loss()
ss = Solution('SURVIVE')
fs = ss.food_loss()
blue = '#0984e3'
red = '#d63031'
green = '#00b894'
c = [blue, red]
labels = ['Dissipative', 'Classic']
fig = plt.figure(figsize=(8, 6))
ax = fig.gca()
index = np.arange(2)
widths = 0.3
vp1 = ax.violinplot(fs, positions=index-widths/2, widths=widths, showmeans=True, showmedians=True)
vp2 = ax.violinplot(fc, positions=index+widths/2, widths=widths, showmeans=True, showmedians=True)
hdl1 = pch.Patch(facecolor=vp1['bodies'][0].get_facecolor()[0])
hdl2 = pch.Patch(facecolor=vp2['bodies'][0].get_facecolor()[0])
vp1['cmeans'].set_edgecolor(green)
vp1['cmeans'].set_linestyle(':')
vp2['cmeans'].set_edgecolor(green)
vp2['cmeans'].set_linestyle(':')
ax.set_ylabel('Food Loss')
ax.yaxis.grid(True, linestyle='--')
# ax.set_title('Scores by group and gender')
ax.set_xticks(index)
ax.set_xticklabels(['C', 'D'])
ax.set_ylim(-6, 4)
ax.set_xlabel("Previous Move")
ax.legend([hdl1, hdl2], labels)
fig.tight_layout()
# plt.show()
plt.savefig("graph/FoodLoss.svg")