Межпроцессное взаимодействие между несколькими движками ИИ - PullRequest
3 голосов
/ 18 апреля 2011

Я хочу устроить конкурс искусственного интеллекта между друзьями.Скажем так: каждый игрок программирует метод, который получает доску и символ (X \ O) и возвращает место, которое он хочет сыграть в свой ход.Теперь моя проблема в том, как «соединить» два ИИ в другой программе, чтобы я мог протестировать всех пользователей и посмотреть, кто имеет лучший код.Единственный способ, которым я думаю, - это общаться с текстовым файлом - у всех ИИ есть поток, работающий на фоне, и проверять изменения в текстовом файле, движок обобщает детали игры (ход, доска, счет, игроки) в тексте.файл.

Как это можно сделать лучше?И еще одна маленькая вещь, это обычное время для каждого хода в соревнованиях ИИ?(Поскольку программа ИИ будет работать в разное время на разных компьютерах)

Ответы [ 7 ]

1 голос
/ 19 апреля 2011

Из вашего вопроса не ясно, нужно ли это делать онлайн или нет.

Если вы нашли «лучший алгоритм Tic Tac Toe», вы можете просто:

(может немного отличаться в зависимости от языка программирования)

  1. Определить интерфейс (например, ITicTacToeSolver)
  2. Пусть все ваши друзья реализуют его по-своему и отправят вам DLL со своим решением.
  3. Создайте игру, которая будет динамически загружать эти библиотеки DLL, и протестируйте их (сыграйте 1 000 000 игр с загруженным алгоритмом).
  4. Отслеживайте игровую статистику, чтобы увидеть, какой алгоритм лучше.
0 голосов
/ 13 мая 2011

Вы должны взглянуть на этот вопрос: Какой самый лучший броненосец ИИ?

В нем он создает соревнование / вызов искусственного интеллекта линкора. Это был очень высокий рейтинг, и было очень весело писать и смотреть.

Он использовал Турнир API http://tournaments.codeplex.com/ для запуска соревнования.

Кроме того, важно разрешить конкурсам участвовать несколько раз, т.е. по 1000 раз каждый. Это избавляет конкурентов от случайности и удачи.

0 голосов
/ 13 мая 2011

Если ваша цель - провести соревнование по программированию ИИ среди друзей, я бы посоветовал вам не тратить время на разработку и внедрение структуры для проведения соревнования.Используйте то, что уже существует для этой цели.Вы можете пропустить всю боль и страдания, связанные с исправлением ошибок в вашей платформе, и получить право на самое интересное: разработку ИИ.

Хорошей платформой является игра Robocode .Смотреть, как ваши роботы убивают друг друга, будет гораздо веселее, чем смотреть, как они играют в крестики-нолики.

0 голосов
/ 13 мая 2011

Я бы предложил, чтобы каждый из ИИ был исполняемыми файлами, общаясь с использованием стандартного ввода и вывода.Игровой движок (судья) отправляет AI_one полное состояние мира в качестве входных данных, а затем ожидает перехода от стандартного выходного сигнала.Затем он будет выполнять ход (если это разрешено законом) и повторяет процесс для AI_two, а затем переключаться между ними до тех пор, пока игра не закончится.В качестве отказоустойчивого рефери может проиграть одну из сторон, если сделать ход слишком долго.

Этот метод используется Задание Google AI .

Один очень большойПреимущество этого подхода состоит в том, что люди могут писать свои ИИ на разных языках, если они следуют общепринятому стандарту того, как сделать ход.

0 голосов
/ 18 апреля 2011

Выясните простой протокол SOAP. Вы можете просто создать интерфейс WSDL - его легко создать с помощью Windows Communication Foundatoin (WCF) или JMS.

Проще всего было бы иметь централизованный сервер, который мог бы служить в качестве рефери и следить за временем. Каждому игроку может быть назначен идентификатор.

Тогда у вас может быть следующий интерфейс (используйте 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.

Отсутствие централизованного сервера будет более сложным, поскольку им придется договариваться о согласованных выигрышах, времени и т. Д.

0 голосов
/ 18 апреля 2011

Используйте интерфейс и стандартный язык программирования - так что вы можете забыть о текстовых файлах и подобных глупостях.

0 голосов
/ 18 апреля 2011

Если программы ИИ конкурируют в такой игре, как крестики-нолики, как правило, каждая программа имеет ограниченное общее время «на обдумывание» (например, 5 минут), и программа, которая превышает выделенное время, проигрывает.

Обычно программы подключаются по какому-то простому протоколу, а не через текстовые файлы. Протокол может работать на стандартных устройствах ввода-вывода или через сокеты TCP / IP.

Чтобы нормализовать использование ЦП, вы можете запросить, чтобы в турнирных играх все программы были скомпилированы для работы на эталонной платформе, а затем вы предоставили два идентичных ПК, на каждом из которых работает один из активных участников. Тогда ваше турнир станет требованием, чтобы программы могли выполняться на этой эталонной платформе.

...