swdata/count_decision_time.py
2018-12-04 19:30:33 +08:00

89 lines
3.1 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.

"""
计算决策时间以及最终博弈对象
A:平均决策时间是用户每轮的总操作时间/最后建立博弈关系的数量
A:最大博弈对手数量是45秒/平均决策时间
Q:那平均决策时间就是从一轮开始,到这一轮中最后一个操作完成之间的间隔对吗
A:对的
Q:具体比方说A在10秒的时候发出了请求对面B5秒确认那么A的决策时长是10秒还是15秒B的决策时长是5秒还是15秒呢
A:A是10秒B是15秒
"""
import csv
import json
import numpy as np
from island.matches import Matches
# type
R_START = 0
A_SEND = 1
A_RECEIVE = 2
A_REPLY = 3
A_REPLY_RECEIVE = 5
A_COUNT = 4
"""
k -> "game:player:round"
v -> [(type,value)]
"""
kvstore = {}
ms = Matches.from_profile_expr(lambda r: True)
for m in ms.data:
info = m.query('game', 'created').select('info').first()['info']
game_end_at = int(info['game_end_at'])
last_ts = int(info['next_start']) + 45
round_start_ts = m.query('game', 'sunrise').orderby('created_at').raw_data
for rno in range(1, game_end_at+1):
for r in m.query('action', None).where(lambda x: x['rno'] == rno).orderby('created_at').raw_data:
if r['act'] == 'request':
key = "%s:%d:%d" % (m.name, r['from'], rno)
if key not in kvstore:
kvstore[key] = [(R_START, last_ts)]
kvstore[key].append((A_SEND, r['created_at']))
key = "%s:%d:%d" % (m.name, r['to'], rno)
if key not in kvstore:
kvstore[key] = [(R_START, last_ts)]
kvstore[key].append((A_RECEIVE, r['created_at']))
elif r['act'] == 'approve' or r['act'] == 'deny':
kvstore["%s:%d:%d" % (m.name, r['from'], rno)].append((A_REPLY, r['created_at']))
kvstore["%s:%d:%d" % (m.name, r['to'], rno)].append((A_REPLY_RECEIVE, r['created_at']))
elif r['act'] == 'done':
kvstore["%s:%d:%d" % (m.name, r['a'], rno)].append((A_COUNT, r['created_at']))
kvstore["%s:%d:%d" % (m.name, r['b'], rno)].append((A_COUNT, r['created_at']))
if rno-1 >= len(round_start_ts):
break
else:
last_ts = round_start_ts[rno-1]['created_at']
result = []
total_decision_time = 0
for rk, r in kvstore.items():
dt = 0
cur = 0
cnt = 0
for k,v in r:
if k == R_START:
dt = v
elif k == A_SEND:
cur = v
elif k == A_REPLY:
cur = v
elif k == A_COUNT:
cnt += 1
if cur == 0:
continue
else:
if cnt <= 1:
dt = cur - dt
else:
dt = (cur - dt) / cnt
if dt * (cnt if cnt > 0 else 1) > 45:
print("???%s => %f" % (rk, dt))
continue
total_decision_time += dt
result.append([dt, cnt])
print("Total decision: %d, time: %d, avg: %f" % (len(result), total_decision_time, total_decision_time / len(result)))
#Total decision: 9625, time: 136406, avg: 14.172055
with open('outputs/decision.csv', 'w') as f:
csv.writer(f).writerows(result)