我想在一些朋友之间安排人工智能比赛。 让我们说tic tac toe, 每个玩家编程一个方法,获得棋盘和一个符号(X \ O)并返回他想要在他轮流玩的地方。 现在我的问题是它如何在另一个程序中“连接”两个AI,这样我就可以测试所有用户,看看谁拥有最好的代码。 我想到的唯一方法是与文本文件进行通信 - 所有AI都在后台运行线程并检查文本文件的更改,引擎摘要游戏详细信息(转向,板,分数,玩家)到文本文件。
如何才能做得更好? 还有一件小事,人工智能竞赛中每个回合的时间框架都是常见的吗? (因为AI程序将在不同的计算机上运行不同的时间)
答案 0 :(得分:1)
您的问题不清楚是否必须在线执行。
如果您在找到“最佳Tic Tac Toe算法”之后,您可以简单地:
(这可能会略有不同,具体取决于编程语言)
答案 1 :(得分:0)
如果人工智能程序在像tic tac toe这样的游戏中竞争,通常每个程序都会限制总的“思考”时间(例如5分钟),并且超过其时间分配的程序将会丢失。
通常,程序通过某种简单的协议连接,而不是通过文本文件连接。该协议可以在标准I / O上运行,也可以通过TCP / IP套接字运行。
为了规范CPU使用率,您可以请求对于锦标赛游戏,所有程序都编译为在参考平台上运行,然后您提供两台相同的PC,两者都运行其中一个活跃的参赛者。然后,您的锦标赛成为可以在此参考平台上执行程序的要求。
答案 2 :(得分:0)
使用界面和标准编程语言 - 这样你就可以忘记那样的文本文件和bollocks。
答案 3 :(得分:0)
找出一个简单的SOAP协议。您可以简单地创建一个WSDL接口 - 使用Windows通信(WCF)或JMS轻松创建。
最简单的方法是让一台中央服务器作为裁判并跟踪时间。可以为每位玩家分配一个ID。
然后您可以拥有以下接口(使用WCF或JMS创建WSDL SOAP协议)
function int requestGame(int opponentID, int color)
- if called with color = -1, randomly assigns a color and returns it (0=white, 1=black).
- otherwise you can request a color, and returns it if accepted, -1 if not accepted.
- could use -1 to request random opponent.
function int getRemainingTime(int color)
- returns the time remaining on clock for color
function bool play(int color, int i, int j)
where color = 0 - white - 1 black,
i, j are board coordinates,
- returns true if it is a legal move
function bool won(int color)
- returns true if color has won the game.
没有集中式服务器会更复杂,因为他们必须就商定的胜利,时间等进行协商。
答案 4 :(得分:0)
我建议让每个AI都是可执行文件,使用标准输入和输出进行通信。游戏引擎(裁判)将世界的完整状态作为输入发送给AI_one,然后等待从标准输出移动。然后它将执行移动(如果合法)并重复AI_two的过程,然后在两者之间交替直到游戏结束。作为一个失败保障,裁判可以让一方失去,如果需要太长时间才能采取行动。
此方法由Google AI challenge使用。
这种方法的一个非常大的优势是人们可以用不同的语言编写AI,只要他们遵循商定的标准来进行移动。
答案 5 :(得分:0)
如果您的目标是在朋友之间进行AI编程竞赛,我建议您不要浪费时间设计和实施举办竞赛的框架。使用已存在的东西用于此目的。您可以跳过在框架中修复错误的所有痛苦和心痛,并直接进入有趣的部分:开发AI。
一个好的框架是Robocode游戏。看着你的机器人相互杀戮会比看他们玩井字游戏更有趣。
答案 6 :(得分:0)
你应该看看这个问题: What is the best Battleship AI?
在其中他创造了战舰AI竞赛/挑战。它的评级非常高,编码和观看也很有趣。
他使用锦标赛API http://tournaments.codeplex.com/参加比赛。
此外,重要的是允许提交多次竞争..即每次1000次。这消除了竞争对手的大量随机性和运气。