我是人工智能的新手,大多数都有理论计算机科学/人工智能方面的经验。作为一个小项目,我试图在几年前的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
似乎我的机器人因为不够快或没有做出决定而错过了转机。
我很感激任何输入或反馈!谢谢!
答案 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)