0

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

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

到目前为止,我已经写了这个:

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

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

我将不胜感激任何输入或反馈!谢谢!

4

1 回答 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)
于 2016-03-21T20:17:29.730 回答