我目前正致力于卡牌游戏的人工智能Wizard。 向导是一个特技游戏,每个玩家在实际游戏开始之前说明他认为他会采取多少技巧。
在阅读了一些论文和本书Artificial Intelligence: A Modern Approach的某些部分后,我决定首先使用开放式卡片设计我的游戏算法,以便每个玩家都有完整的信息。 所以我刚开始并使用UCB选择策略实现了蒙特卡罗树搜索算法。我已经在java中实现了所有东西,它似乎运行得很好,但我的机器人还没有达到最佳状态。特别是预测你获得的技巧似乎是一项艰巨的任务,我使用了与玩法相同的MCTS。
所以基本上我的算法扩展了游戏的当前状态(例如,2个玩家已经下了他们的出价),创建了一个新节点(例如3个玩家已经出价),然后只是随机玩,直到游戏结束。然后评估分数并通过节点备份。
我认为改进算法的下一步是在树搜索中添加一些启发式算法,以便从一开始就忽略很可能导致丢失的分支。
我的问题是:你认为这是一个好方法吗?还有什么其他方法可以承诺,或者你还有其他什么方法吗?
答案 0 :(得分:3)
我不知道比赛,但我可以给你一般的建议。如果
,蒙特卡洛方法是一个很好的解决方案根据这些条件,MCTS是您能做的最好的。
但如果你能够构建一个强大的启发式功能,那么你必须直接使用“Min-Max / Alpha-Beta Pruning”算法(或类似的算法)。通常,使用这些算法可以获得更强的AI。
这就是原因,因为GO使用MCTS但是使用Chess我们仍然使用Min-Max。
但算法仅占人工智能的10%。游戏-AI编程中最困难(也是最美丽)的部分是利用游戏机制来修剪搜索空间并构建最强的启发式:)
例如,你可以从一个着名的纸牌游戏开始理解AI:扑克(http://webdocs.cs.ualberta.ca/~games/poker/)。然后你可以将这些技术扩展到你的游戏中。