Guest User

Untitled

a guest
Mar 2nd, 2016
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.49 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3.  
  4. class Player:
  5. def __init__(self, team, name, rating):
  6. self.team = team
  7. self.name = name
  8. self.rating = rating
  9.  
  10. class Match:
  11. def __init__(self, p1, p2, winner):
  12. self.p1 = p1
  13. self.p2 = p2
  14. self.winner = winner
  15. def loser(self):
  16. if self.winner == self.p1: return self.p2
  17. else: return self.p1
  18. def tostr(self):
  19. if self.p1 == self.winner:
  20. return "%s, %s, %0.4f" % (self.p1.name, self.p2.name, self.likelyhood())
  21. else:
  22. return "%s, %s, %0.4f" % (self.p2.name, self.p1.name, self.likelyhood())
  23. def likelyhood(self):
  24. return 1.0 / (1.0 + 10.0**((self.loser().rating-self.winner.rating)/400.0))
  25.  
  26. J1 = Player("J", "Murakaka Daisuke", 3216)
  27. J2 = Player("J", "Iyama Yuta", 3550)
  28. C1 = Player("C", "Lian Xiao", 3481)
  29. C2 = Player("C", "Ke Jie", 3628)
  30. K1 = Player("K", "Lee Sedol", 3523)
  31.  
  32. class NongshimIter(object):
  33. def __init__(self):
  34. self.teams = {}
  35. self.teams["J"] = [J1, J2]
  36. self.teams["C"] = [C1, C2]
  37. self.teams["K"] = [K1]
  38. self.matches = []
  39. self.next_team = None
  40. self.next_player = {}
  41. self.next_player["J"] = 0 # 0 based
  42. self.next_player["C"] = 0
  43. self.next_player["K"] = 0
  44. self.enumerate_all = []
  45.  
  46. def state_tostr(self):
  47. s = ""
  48. for m in self.matches: s += m.tostr() + " "
  49. for k,v in self.next_player.iteritems():
  50. s += "np[%s]=%d " % (k, v)
  51. return s
  52.  
  53. def __iter__(self):
  54. return self
  55.  
  56. def set_next_match(self, p1, p2, winner, next_team):
  57. self.matches.append(Match(p1, p2, winner))
  58. self.matches.append(Match(p1, p2, winner))
  59. #print "set_next_match", self.matches[-1].tostr()
  60. self.next_team = next_team
  61. self.next_player[p2.team] += 1
  62.  
  63. def undo_match(self):
  64. self.next_player[self.matches[-1].p2.team] -= 1
  65. del self.matches[-1]
  66.  
  67. def gen(self, i):
  68. #print "next level", len(self.matches), i, self.state_tostr()
  69. #print
  70. if i > 5: return
  71. if len(self.matches) == 0:
  72. self.next_player["J"] += 1 # Init first player special case
  73. self.set_next_match(J1, K1, J1, "C")
  74. self.gen(i+1)
  75. self.undo_match()
  76. self.set_next_match(J1, K1, K1, "C")
  77. self.gen(i+1)
  78. self.undo_match()
  79. else:
  80. winner = self.matches[-1].winner
  81. loser = self.matches[-1].loser()
  82. #print self.next_team, self.next_team and len(self.teams[self.next_team])-1, self.next_team and self.next_player[self.next_team]
  83. if self.next_team and len(self.teams[self.next_team])-1 >= self.next_player[self.next_team]:
  84. p2 = self.teams[self.next_team][self.next_player[self.next_team]]
  85. self.set_next_match(winner, p2, winner, loser.team)
  86. self.gen(i+1)
  87. self.undo_match()
  88. self.set_next_match(winner, p2, p2, loser.team)
  89. self.gen(i+1)
  90. self.undo_match()
  91. elif len(self.teams[loser.team])-1 >= self.next_player[loser.team]:
  92. p2 = self.teams[loser.team][self.next_player[loser.team]]
  93. self.set_next_match(winner, p2, winner, None)
  94. self.gen(i+1)
  95. self.undo_match()
  96. self.set_next_match(winner, p2, p2, None)
  97. self.gen(i+1)
  98. self.undo_match()
  99. else:
  100. self.enumerate_all.append(self.matches[:])
  101. #print self.state_tostr()
  102.  
  103. n = NongshimIter()
  104. n.gen(1)
  105. for enum in n.enumerate_all:
  106. likelyhood = 1.0
  107. for m in enum:
  108. print m.tostr() + ",",
  109. likelyhood *= m.likelyhood()
  110. print "%s, %0.4f" % (enum[-1].winner.team, likelyhood)
Advertisement
Add Comment
Please, Sign In to add comment