Minimax实施Planet Wars Python

时间:2016-03-21 17:09:59

标签: python python-2.7 artificial-intelligence minimax minmax

我是人工智能的新手,大多数都有理论计算机科学/人工智能方面的经验。作为一个小项目,我试图在几年前的Google AI挑战的简化版本上实现minimax算法。不幸的是,经过大量的尝试和伪代码阅读后,我还没能成功实现它。

Planet Wars是两个拥有自己行星的玩家之间的游戏。每一个转弯,玩家都可以决定将自己的一半行星发送到中立或对手的行星上。通过这种方式,可以接管对手的行星。当对手没有星球离开时你赢了。

到目前为止,我已写过:

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

似乎我的机器人因为不够快或没有做出决定而错过了转机。

我很感激任何输入或反馈!谢谢!

1 个答案:

答案 0 :(得分: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)
相关问题