bqnC8G09R1B05

Authorkera
Submission date2017-07-21 09:28:31.327030
Rating7456
Matches played348
Win rate73.28

Use rpsrunner.py to play unranked matches on your computer.

Source code:

import random
import math

def calcOutput(hist):
  q = [0 for k in range(3)]
  for i in range(0,3):
    q[i] = 1*w[i][c*9];
    for k in range(0,c*9):
      q[i] = q[i] + hist[k] * w[i][k]
  return q

def cvtHand(a):
  if a == 0:
    return 'R'
  if a == 1:
    return 'P'
  if a == 2:
    return 'S'

def cvtNum(a):
  if a == 'R':
    return 0
  if a == 'P':
    return 1
  if a == 'S':
    return 2

def calcHand(q):
  er = math.exp(b*q[0])
  ep = math.exp(b*q[1])
  es = math.exp(b*q[2])
  br = er / (er+ep+es)
  bp = ep / (er+ep+es)
  bs = es / (er+ep+es)
  rand = random.random()
  if(rand < br):
    return 'R'
  elif(rand < br+bp):
    return 'P'
  else:
    return 'S'

def calcNextHist(op):
  nextHist = []
  nextHist.extend(hist)
  del nextHist[0:9]
  oph = [0 for k in range(3)]
  oph[cvtNum(op)] = 1
  nextHist = nextHist+oph+[0 for k in range(6)]
  return nextHist

def maxA(tmp):
  ret = tmp[0]
  for i in range(1,len(tmp)):
    if ret < tmp[i]:
      ret = tmp[i]
  return ret

def calcTeacher(op):
  teacher = [0 for k in range(3)]
  nHist = calcNextHist(op)
  winHandNum = (cvtNum(op)+1)%3
  loseHandNum = (cvtNum(op)+2)%3
  for i in range(0,3):
    nHist[c*9-6+i] = 1
    if winHandNum == i:
      nHist[c*9-3+0]=1
    elif loseHandNum == i:
      nHist[c*9-3+1]=1
    else:
      nHist[c*9-3+2]=1
    teacher[i] = g*maxA(calcOutput(nHist))
    nHist[c*9-6+i] = nHist[c*9-3+0] = nHist[c*9-3+1] = nHist[c*9-3+2]=0

    if winHandNum == i:
      teacher[i] += 1
    if loseHandNum == i:
      teacher[i] -= 1
  return teacher

def learn(op):
  dw = 0.000001
  idw = 1.0 / dw
  teacher = calcTeacher(op)
  out = calcOutput(hist)
  for i in range(0,3):
    oriError = pow(teacher[i] - out[i],2)/2
    error = pow(teacher[i] - out[i]+dw,2)/2
    w[i][c*9] += (error-oriError) * idw * r
    for j in range(0, c*9):
        w[i][j] += hist[j] * (error-oriError) * idw * r


def updateHist(op, my, h):
  oph = [0 for k in range(3)]
  myh = [0 for k in range(3)]
  reh = [0 for k in range(3)]
  del h[0:9]
  oph[cvtNum(op)] = 1
  myh[cvtNum(my)] = 1
  if (cvtNum(op)+1)%3 == cvtNum(my):
    reh[0] = 1
  elif (cvtNum(op)+2)%3 == cvtNum(my):
    reh[1] = 1
  else:
    reh[2] = 1
  for i in range(0,3):
    h.append(oph[i])
  for i in range(0,3):
    h.append(myh[i])
  for i in range(0,3):
    h.append(reh[i])

if input == '':
  c = 8
  g = 0.9
  r = 1.0/(c*3+1) * 1.0
  b =  0.5
  w = [[0 for k in range(c*9+1)]for j in range(3)]
  hist = [0 for k in range(9*c)]
else:
  learn(input)
  updateHist(input, oldOutput, hist)

output = calcHand(calcOutput(hist))
oldOutput = output