Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- class Player:
- def __init__(self, team, name, rating):
- self.team = team
- self.name = name
- self.rating = rating
- class Match:
- def __init__(self, p1, p2, winner):
- self.p1 = p1
- self.p2 = p2
- self.winner = winner
- def loser(self):
- if self.winner == self.p1: return self.p2
- else: return self.p1
- def tostr(self):
- if self.p1 == self.winner:
- return "%s, %s, %0.4f" % (self.p1.name, self.p2.name, self.likelyhood())
- else:
- return "%s, %s, %0.4f" % (self.p2.name, self.p1.name, self.likelyhood())
- def likelyhood(self):
- return 1.0 / (1.0 + 10.0**((self.loser().rating-self.winner.rating)/400.0))
- J1 = Player("J", "Murakaka Daisuke", 3216)
- J2 = Player("J", "Iyama Yuta", 3550)
- C1 = Player("C", "Lian Xiao", 3481)
- C2 = Player("C", "Ke Jie", 3628)
- K1 = Player("K", "Lee Sedol", 3523)
- class NongshimIter(object):
- def __init__(self):
- self.teams = {}
- self.teams["J"] = [J1, J2]
- self.teams["C"] = [C1, C2]
- self.teams["K"] = [K1]
- self.matches = []
- self.next_team = None
- self.next_player = {}
- self.next_player["J"] = 0 # 0 based
- self.next_player["C"] = 0
- self.next_player["K"] = 0
- self.enumerate_all = []
- def state_tostr(self):
- s = ""
- for m in self.matches: s += m.tostr() + " "
- for k,v in self.next_player.iteritems():
- s += "np[%s]=%d " % (k, v)
- return s
- def __iter__(self):
- return self
- def set_next_match(self, p1, p2, winner, next_team):
- self.matches.append(Match(p1, p2, winner))
- self.matches.append(Match(p1, p2, winner))
- #print "set_next_match", self.matches[-1].tostr()
- self.next_team = next_team
- self.next_player[p2.team] += 1
- def undo_match(self):
- self.next_player[self.matches[-1].p2.team] -= 1
- del self.matches[-1]
- def gen(self, i):
- #print "next level", len(self.matches), i, self.state_tostr()
- #print
- if i > 5: return
- if len(self.matches) == 0:
- self.next_player["J"] += 1 # Init first player special case
- self.set_next_match(J1, K1, J1, "C")
- self.gen(i+1)
- self.undo_match()
- self.set_next_match(J1, K1, K1, "C")
- self.gen(i+1)
- self.undo_match()
- else:
- winner = self.matches[-1].winner
- loser = self.matches[-1].loser()
- #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]
- if self.next_team and len(self.teams[self.next_team])-1 >= self.next_player[self.next_team]:
- p2 = self.teams[self.next_team][self.next_player[self.next_team]]
- self.set_next_match(winner, p2, winner, loser.team)
- self.gen(i+1)
- self.undo_match()
- self.set_next_match(winner, p2, p2, loser.team)
- self.gen(i+1)
- self.undo_match()
- elif len(self.teams[loser.team])-1 >= self.next_player[loser.team]:
- p2 = self.teams[loser.team][self.next_player[loser.team]]
- self.set_next_match(winner, p2, winner, None)
- self.gen(i+1)
- self.undo_match()
- self.set_next_match(winner, p2, p2, None)
- self.gen(i+1)
- self.undo_match()
- else:
- self.enumerate_all.append(self.matches[:])
- #print self.state_tostr()
- n = NongshimIter()
- n.gen(1)
- for enum in n.enumerate_all:
- likelyhood = 1.0
- for m in enum:
- print m.tostr() + ",",
- likelyhood *= m.likelyhood()
- print "%s, %0.4f" % (enum[-1].winner.team, likelyhood)
Advertisement
Add Comment
Please, Sign In to add comment