Speed Clue
Cluedo / Clue - классическая настольная игра с неотразимым игровым компонентом. Speed Clue - вариант для 3-6 игроков, который подчеркивает этот компонент, используя только карты. В результате единственное различие между стандартным Cluedo и Speed Clue заключается в том, что каждый игрок, находящийся в игре, может делать любые предложения, которые он пожелает, в свой ход, вместо того, чтобы ждать, пока он не достигнет определенной комнаты, в зависимости от бросков костей и предложений других игроков. Если вы никогда ранее не играли в Cluedo или хотите быть уверены в явных различиях между двумя версиями, вы можете найти здесь полное правило Speed Clue .
Цель
Напишите и отправьте программу AI для игры в Speed Clue до 15 мая 2014 года, 00:00 по Гринвичу. После этого я проведу турнир, используя все легальные записи. Участник, чей ИИ выигрывает большинство игр в турнире, побеждает в соревновании.
AI Технические характеристики
Вы можете написать свой ИИ практически на любом языке, который выберете, используя любые методы, которые используете, при условии, что он строго использует протокол приложения через соединение TCP / IP для игр с сервером. Подробное объяснение всех ограничений можно найти здесь .
Как играть
Начните с разветвления конкурса GitHub . Добавьте каталог в
entries
каталог, названный с использованием вашего имени пользователя StackExchange, и разработайте свой код в этой папке. Когда вы будете готовы подать заявку, сделайте запрос на внесение изменений, а затем следуйте этим инструкциям, чтобы объявить вашу запись на этом сайте.
Я дал некоторый код и JAR-файлы в core
каталоге, чтобы вы начали; см. мой сайт для приблизительного руководства для материалов. Кроме того, другие игроки отправляют вспомогательный код в дополнение к своим записям, чтобы помочь вам начать работу. Потратьте некоторое время, чтобы изучить записи, и не забудьте проверить свою запись с записями других перед отправкой!
Полученные результаты
Place | User | AI | Result
------+--------------+--------------------+-------------------------------------------------------
1 | gamecoder | SpockAI | 55.75%
2 | Peter Taylor | InferencePlayer | 33.06%
3 | jwg | CluePaddle | 20.19%
4 | Peter Taylor | SimpleCluedoPlayer | 8.34%
5 | gamecoder | RandomPlayer | 1.71%
---- | ray | 01 | Player "ray-01" [3] sent an invalid accuse message: ""
Приведенные выше результаты показывают процент побед каждого квалифицированного ИИ из 25 200 действительных матчей, в которых он участвовал. Всего было 30 000 матчей, которые учитывались при подсчете результатов, и 6 100 или около того, которые были сброшены со счетов при 01
дисквалификации.
Почетное упоминание должно идти к 01
ИИ луча . Мое первоначальное тестирование показало, что оно было самым сильным, и я ожидал, что оно выиграет соревнование. Тем не менее, он, кажется, имеет очень неустойчивую ошибку, которая, насколько я могу догадаться, приводит к устранению всех возможных решений. Турнир завершил все матчи с тремя игроками и начал матчи с четырьмя игроками (12 000 игр!), Когда 01
была обнаружена ошибка. Если я просто рассмотрим турнирную таблицу с тремя игроками, результаты будут выглядеть так:
Place | User | AI | Result
------+--------------+--------------------+--------
1 | ray | 01 | 72.10%
2 | gamecoder | SpockAI | 51.28%
3 | Peter Taylor | InferencePlayer | 39.97%
4 | Peter Taylor | SimpleCluedoPlayer | 17.65%
5 | jwg | CluePaddle | 16.92%
6 | gamecoder | RandomPlayer | 2.08%
Я планировал провести некоторый сбор данных о результатах, но я исчерпан. У меня были технические трудности в том, чтобы заставить соревнование проходить все время (сбои питания, перезагрузка системы), что требовало полной переписывания сервера соревнований, чтобы сохранить его прогресс по мере продвижения. Я прокомментирую и внесу все изменения в код со всеми файлами результатов, которые были сгенерированы на случай, если кто-то все еще заинтересован. Если я решу заняться интеллектуальным анализом данных, мои результаты также будут добавлены в хранилище.
Спасибо за игру!
источник
you must accept two port numbers: the first will be the port to which your program will listen, and the second will be the port to which your program will send.
Зачем два порта?Ответы:
AI01 - Python 3
Я не могу найти лучшего названия для этого :-P.
Идентификатор : ray-ai01
Технология : Python 3
Избранное : да
Аргументы :
ai01.py identifier port
Описание : Работа по умозаключению. Когда количество карт, неизвестных владельцу, меньше порогового значения, этот ИИ начинает устранять все невозможные решения путем рекурсивного глобального вывода. В противном случае он использует локальный вывод.
Код AI можно найти здесь .
источник
SpockAI
. Это очень хорошо работает против01
. Я не знаю, победит ли он в конкурсе, но я рад, что количество ваших побед уменьшилось; )SimpleCluedoPlayer.java
Этот класс использует
AbstractCluedoPlayer
, который обрабатывает все операции ввода-вывода и позволяет логике работать с простым типизированным интерфейсом. Все это на GitHub .Это бьет случайного игрока с высокой вероятностью (в худшем случае это требует 15 предложений, тогда как случайный игрок получает в среднем 162), но его легко победить. Я предлагаю это, чтобы заставить мяч катиться.
источник
SpockAI
Идентификатор:
gamecoder-SpockAI
Repo Entry: нажмите здесь
Избранное: Да
Технология: Java 7 на основе
com.sadakatsu.clue.jar
Аргументы:
{identifier} portNumber [logOutput: true|false]
Описание:
SpockAI
это игрок Speed Clue, созданный на основе класса,Knowledge
который я написал.Knowledge
Класс представляет все возможные состояния , что игра могла бы дать то , что произошло до сих пор. Он представляет игровые решения и возможные комбинации игроков в виде наборов и использует итеративные вычеты, чтобы максимально сократить эти наборы каждый раз, когда что-то узнают.SpockAI
использует этот класс, чтобы определить, какие предложения гарантируют наиболее полезные результаты в худшем случае, и случайным образом выбирает одно из этих предложений по очереди. Когда ему нужно опровергнуть предложение, он пытается либо показать карту, на которой он уже показал ИИ предложения, либо показать ему карту из категории, для которой у него меньше всего возможностей. Он обвиняет только тогда, когда знает решение.Эвристика, которую я использовал для определения наилучшего предложения, заключается в следующем. После того, как вся информация была получена из предложения, возможное решение и возможные комбинации рук игрока будут сокращены (если в предложении нет новой информации). Теоретически, лучшее предложение - это то, которое максимально уменьшает количество возможных решений. В случае ничьей, я предполагаю, что предложение, которое больше всего уменьшает количество возможных рук для игроков, лучше. Таким образом, для каждого предложения я пробую все возможные результаты, которые не приводят к противоречию в знаниях. Предполагается, что результат, который будет иметь наименьшее улучшение в подсчете количества решений / рук, будет результатом предложения. Затем я сравниваю результаты всех предложений и выбираю, какой из них имеет лучший результат. Таким образом, я гарантирую оптимальное получение информации в худшем случае.
Я подумываю о том, чтобы добавить общий анализ возможных решений и возможных комбинаций игроков, чтобы сделать его
SpockAI
еще сильнее, но посколькуSpockAI
это уже самый медленный и наиболее ресурсоемкий вход, я, вероятно, пропущу это.Отказ от ответственности:
Я собирался выпустить ИИ для этого конкурса несколько недель назад. В нынешнем виде я не смог начать писать свой ИИ до пятницы на прошлой неделе, и я продолжал находить нелепые ошибки в своем коде. Из-за этого единственным способом, которым я смог приступить
SpockAI
к работе до истечения крайнего срока, было использование большого пула потоков. Конечным результатом является то, что (в настоящее время) SpockAI может достичь + 90% загрузки ЦП и 2 ГБ + использования памяти (хотя я виню сборщик мусора в этом). Я намерен участвоватьSpockAI
в конкурсе, но если другие считают, что это является нарушением правил , я присваиваю титул «победитель», а второе место должноSpockAI
выиграть. Если вы считаете, что так, оставьте комментарий к этому ответу.источник
InferencePlayer.java
Полный код на Github (примечание: здесь используется то же,
AbstractCluedoPlayer
что и раньшеSimpleCluedoPlayer
).Истинное ядро этого игрока - его
PlayerInformation
класс (здесь слегка подрезанный):Он объединяет информацию о предложениях, которые игрок не опроверг (указав, что у них нет ни одной из этих карт), предложения, которые он опроверг (указав, что у них есть хотя бы одна из этих карт), и карты, местоположение которых является определенным. Затем он итеративно применяет некоторые базовые правила для уплотнения этой информации в ее сущности.
Я не думаю, что можно получить какую-либо более детерминированную информацию (кроме как с помощью ложных обвинений, которые, я полагаю, слишком редки, чтобы беспокоиться), хотя я, возможно, что-то упустил. Там является потенциал для более сложного игрока , для оценки вероятности того, что игрок X имеет карты Y ...
Другая область, которая, вероятно, допускает значительное улучшение, - это решение, какое предложение сделать. Я пытаюсь максимизировать получение информации, используя довольно неуклюжий подход с применением тяжелой силы, но существует много плохо обоснованных эвристических подходов в оценке относительных достоинств знаний, полученных в результате различных гипотетических опровержений. Тем не менее, я не собираюсь пытаться настраивать эвристику, пока кто-то еще не отправит достойного противника.
источник
/tmp
. Это должен быть простой патч; Я посмотрю в ближайшее время.CluePaddle (ClueStick / ClueBat / ClueByFour) - C #
Я написал ClueBot, клиент C #, для которого легко реализовать AI и различные AI, включая самую серьезную попытку под названием CluePaddle. Код находится по адресу https://github.com/jwg4/SpeedClueContest/tree/clue_paddle, и стартовый запрос начал объединять его с апстримом.
ClueStick является проверкой концепции, которая в основном просто угадывает и игнорирует большую часть того, что происходит. ClueBat - еще один глупый ИИ, за исключением того, что он пытается использовать недостаток в ClueStick, чтобы заставить его делать ложные обвинения. ClueByFour - разумный ИИ, в котором он делает разумные предложения и запоминает карты, которые ему показывают другие.
CluePaddle является самым умным. Он пытается выяснить, кто имеет, что основано не только на том, какие опровержения были предложены, но также и на основании того, какие игроки не предложили опровержение данного предложения. Он не учитывает, сколько карт у каждого игрока, но это нужно исправить. Он включает в себя пару довольно длинных классов, поэтому я не буду публиковать здесь весь код, но следующий метод дает представление.
Если 4 играют друг против друга, CluePaddle выигрывает, безусловно, в большинстве игр, причем ClueByFour второй, а две другие нигде.
Только CluePaddle является конкурентной записью (пока). Использование:
Если кто-то еще хочет создать C # AI, просто создайте проект ConsoleApplication в решении, реализуйте
IClueAI
интерфейс в классе, а затем сделайте свойProgram
наследникProgramTemplate
и скопируйте то, что делают другие проектыMain()
. Единственная зависимость - это NUnit для модульного тестирования, и вы можете легко удалить все тесты из кода (но не устанавливайте NUnit).источник
CluePaddle
Проект не компилируется, утверждая , чтоNUnit
не установлен , даже если другие проекты делать компиляции. Те, которые компилируются, в конечном итоге останавливаются во время тестирования, а Java сообщает об ошибке сброса соединения. Не могли бы вы помочь мне определить, сделал ли я что-то не так?ClueStick
это единственный ИИ, который останавливается, когда я пытаюсь запустить его. Два других соревнуются в пробном турнире и в итоге дисквалифицируются за те же нарушения.ClueByFour
дисквалифицируется за неспособность повторить недоказанное предложение, выдвинутое им в качестве обвинения, когда у него нет ни одной из карточек.ClueBat
получает дисквалификацию за то, что предъявил обвинение, у которого есть карты, которые он либо показал, либо имеет в руке. Пожалуйста, проверьте пересмотренные ограничения AI для обеспечения соответствия.CluePaddle
. Я сделаю запрос на получение позже.