2016-03-21 60 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)