2016-03-21 59 views
0

我对人工智能非常陌生,大多都有理论计算机科学/人工智能的经验。作为一个小项目,我试图在几年前的简化版Google AI挑战中实现minimax算法。不幸的是,经过大量尝试和伪代码阅读之后,我还没有能够成功实现它。Minimax实现星球大战Python

星球大战是两个玩家与他们自己的行星之间的游戏。玩家可以决定从他自己的哪个行星发送一半的船只到中立或对手的行星。这样就有可能接管对手的行星。当对手没有行星时你赢了。

由于我却写成这样:

max_depth = 4 

def minmax(pw, depth): 
    max_player(pw, depth) 
    return [max_source,max_dest] 

def min_player(pw, depth): 
    if depth > max_depth: 
    return evaluate_state(pw) 
    min_score = 10000 

for my_planet in pw.my_planets(pw): 
    for not_my_planet in pw.not_my_planets(pw): 
     sim = simulate_move(pw) 
     simulated_pw.SimulateAttack(my_planet, not_my_planet) 
     score = max(sim, depth +1) 
     if score < min_score: 
      score = min_score 
return min_score 

def max_player(pw, depth): 
    if depth > max_depth: 
     return evaluate_state(pw) 
    max_score = -10000 
    global max_source 
    global max_dest 
for my_planet in pw.my_planets(pw): 
    for not_my_planet in pw.not_my_planets(pw): 
     sim = simulate_move(pw) 
     sim.SimulateAttack(my_planet, not_my_planet) 
     score = min(sim, depth +1) 
     if score > max_score: 
      score = max_score 
      max_source = my_planet 
      max_dest = not_my_planet 
return max_score 

def do_turn(pw): 
    source = None 
    destination = None 

# (1) Implement an algorithm to determine the source planet to send your ships from 
source = minmax(pw, 4)[0] 

# (2) Implement an algorithm to determine the destination planet to send your ships to 
destination = minmax(pw, 4)[1] 

# (3) Attack/Defend 
# If the source and destination variables contain actual planets, then 
# send half of the ships from source to destination. 
if source is not None and destination is not None: 
    pw.issue_order(source, destination) 

但试图对另一个机器人玩的时候,终端给出了这样的回报:

Johannas-MacBook-Pro:PlanetWars johannakorte$ python play.py -1 MinMax2.py  -2 BullyBot.py -s 

Game[1]: Something went wrong, engine output dump: 

------------------------- 

Engine entering main game loop. Mode serial 

Game state turn 0 

Player 1 said: Traceback (most recent call last): 

Player 1 said: File "src/python/MinMax2.py", line 74, in <module> 

Player 1 said:  main() 

Player 1 said: File "src/python/MinMax2.py", line 69, in main 

Player 1 said:  do_turn(pw) 

Player 1 said: File "src/python/MinMax2.py", line 52, in do_turn 

Player 1 said:  source = minmax(pw, 4)[0] 

Player 1 said: File "src/python/MinMax2.py", line 14, in minmax 

Player 1 said:  max_player(pw, depth) 

Player 1 said: File "src/python/MinMax2.py", line 36, in max_player 

Player 1 said:  for my_planet in pw.my_planets(pw): 

Player 1 said: TypeError: my_planets() takes exactly 1 argument (2 given) 

Player 1 timeout: you missed a turn! Consider to make your bot faster, or increase the maxTurnTime. 

Game state turn 1 

Game state turn 2 

Couldn't write to stdin of player 1 

好像我的机器人缺少转由于速度不够快或者没有做出决定。

我将不胜感激任何意见或反馈!谢谢!

回答

2

您的代码因此行崩溃:for my_planet in pw.my_planets(pw):

for my_planet in pw.my_planets():代替它将至少摆脱一个错误。这是因为pw是一个类,意味着该类的所有功能都会自动将self作为第一个参数。你不,也不应该提供这个第一个参数!

要使用一个简化的例子说明它:

class MyClass(object): 
    def __init__(self): pass 
    def show42(self): 
     return 42 
class1 = MyClass() 

# This will work: 
print(class1.show42()) 
# 42 

# ... but this will crash 
print(class1.show42(class1)) 
# It will crash with: TypeError: show42() takes exactly 1 argument (2 given)