Задний план
Игра Морра простая игра. В «оригинальной» версии несколько игроков одновременно выбрасывают 0-5 своими руками, угадывая общую сумму рук каждого. Версия, которую я здесь использую, была изменена, чтобы увеличить потенциал для нетривиальной стратегии, и она описана ниже:
- Есть два игрока.
- Как и в каменных ножницах, игроки двигаются одновременно.
- Каждый ход каждый игрок выбирает число 0-5, а также угадывает выбор своих оппонентов 0-5. Это означает, что два числа выводятся каждый ход. Для уточнения оба выходных числа должны быть в диапазоне 0-5 включительно.
- Если вы правильно угадали выбор своего оппонента, но оппонент не угадал правильно, вы выиграли определенное количество очков, равное сумме двух сыгранных чисел. Например, если сыграно 3 и 5, правильное предположение будет стоить 8 баллов.
- Если оба или ни один из игроков не угадают правильно, очки не начисляются.
- Человек с наибольшим количеством очков после 1000 раундов побеждает в этой игре.
Турнир
Турнир будет проводиться в круговом стиле и будет проводиться путем создания каждой возможной пары участников. За каждую победу участник получает 2 победных очка. Каждая ничья приводит к 1 победному очку. За потерю не набираются победные очки.
Интуитивно, победитель турнира должен быть участником с наибольшим количеством победных очков против других.
Как войти
Будет два способа подачи ботов на соревнования. Первый и наиболее предпочтительный метод заключается в реализации интерфейса Java, предоставляемого контроллером. Второй способ - написать независимую программу.
Давайте сначала рассмотрим метод Java. Интерфейс, который вам нужно реализовать, это Player
и он определяет два метода: public String getName()
идентифицирует вашего бота и public int[] getMove(String[] args)
принимает args
в качестве массива шесть строк mychoices myguesses myscore opponentchoices opponentguesses opponentscore
. Примером является следующее:
042 045 0 324 432 6
Это означает, что я выбрал 0 в первом раунде и предположил, что мой противник собирается бросить 0. Мой противник бросил 3 и предположил, что я брошу 4. В третьем раунде мой оппонент сделал правильное предположение, что я брошу 2, что означает, что он получает 2 + 4 = 6 баллов.
Ваш метод вернет массив из двух целых чисел, которые вы выбираете и угадываете соответственно. Пример {4,2}
для выбора 4 и предположения 2.
Вот пример полного Java-бота, написанного как метод. Если вы хотите, ваше представление должно включать только то, что происходит в getMove
методе.
import java.util.Random;
/**
* A simple example Morra bot to get you started.
*/
public class ExampleBot implements Player
{
public String getName()
{
return "ExampleBot";
}
public int[] getMove(String [] args)
{
//easiest way I know to break down to create a move history
//(just contains their throw history)
char[] theirThrowsC = args[3].toCharArray();
int[] theirThrows = new int[theirThrowsC.length];
for(int i = 0; i < theirThrowsC.length; i++)
{
theirThrows[i] = Integer.parseInt(Character.toString(theirThrowsC[i]));
}
//get my score
int myScore = Integer.parseInt(args[2]);
Random r = new Random();
int guess = r.nextInt(6);
if(theirThrows.length > 0)
{
guess = theirThrows[theirThrows.length-1];
}
//throws a random number, guesses what they threw last
return new int[] {r.nextInt(6),guess};
}
public static int otherMethod(int example) //you can write additional static methods
{
return 0;
}
}
Как независимая программа
В настоящее время я ограничен в поддержке других языков. Помимо Java, я могу принимать программы, написанные на Python 3.4, Perl 5 или Ruby 2.1.5. Если есть язык, который, кажется, нужен нескольким людям, я сделаю все возможное, чтобы добавить его.
Ввод вашей программы будет аргументами в командной строке. Это может выглядеть так:
perl awesomebot.plx 042 045 0 324 432 6
Вывод вашей программы должен быть вашим выбором, за которым следует ваше предположение, за которым следует пробел.
Пожалуйста, включите в свой ответ точную команду, необходимую для его запуска. Имейте в виду, что я использую Windows 8.1.
Дополнительные правила
Сохранение состояния и тайм-ауты
Ваша программа сможет создать один текстовый файл в локальном каталоге, где вы можете хранить информацию. Эта информация будет храниться в течение всего турнира, но впоследствии будет удалена. Дайте файлу имя, которое я могу опознать.
Время ответа вашего кода составляет 500 миллисекунд. Невозможность ответить в срок (или неверный ход) приведет к конфискации этого конкретного матча. Представления Java в настоящее время имеют пассивный тайм-аут (который я могу обновить до активного), в то время как представления не-Java имеют активный тайм-аут, когда их процесс завершается через 500 миллисекунд.
Больше правил подачи
- Вам разрешено несколько заявок, если они соблюдают правила и не помечают команду.
- Каждая запись должна быть уникальной. Вы не можете сделать точную копию логики другого бота на другом языке.
- Боты не могут взаимодействовать друг с другом (формировать команду любого рода).
- Вы не можете использовать логику других ботов внутри вашего бота, например, чтобы идентифицировать вашего конкурента и предсказать его действия. Конечно, вы можете попытаться определить стратегию вашего противника.
- Не пытайтесь связываться с контроллером, другими участниками или моим компьютером. Не подключайтесь к внешним источникам информации.
Контроллер
Текущая версия контроллера находится здесь . Он написан на Java 8. Файл «Турнир» является основным контроллером, который также содержит список участников (если вы хотите провести свои собственные соревнования).
Leaderboard
Мне не очень часто удавалось обновлять таблицу лидеров. Я довольно занят в эти выходные. Под «довольно занятым» я подразумеваю отсутствие доступа к компьютеру с 6:30 до 21:30. Вот результаты после 5 пробежек. По какой-то причине бот «Эхо» продолжал терять свои права (возможно, я виноват, я еще не исследовал).
170 - Quinn and Valor
158 - Historian
142 - DeltaMax
140 - MorraCowbell
132 - Extrapolator
115 - Rainbolt
102 - Popularity
100 - Interpolator
83 - CounterBot
80 - Basilisk
76 - Erratica
65 - Trendy
63 - Scholar
62 - RandomGuesser
60 - KingFisher
59 - NullifierBot
55 - EvolvedBot
48 - Confused
кредит
Большое спасибо Rainbolt и Peter Taylor за помощь с контроллером.
источник
Ответы:
Морра Ковбелл
Для любого, кто ищет значение в названии этого бота, имя Morra заставляет меня думать о Space Italian , поэтому я решил, что мне нужно имя, которое сыграло на этом. Среди других кандидатов Морра дурачила тебя и Морра за меня .
Это полный класс, реализующий
Player
интерфейс. Объяснение ниже.объяснение
Я начал с анализа игр с меньшим количеством пальцев. Простейший нетривиальный способ допускает вызовы
0
или1
и имеет следующую таблицу выплат (значения - это выплаты для игрока строки):(0,0)
Стратегия доминирует(0,1)
, так что мы можем уменьшить таблицуТеперь
(1,0)
стратегия доминирует(0,1)
, поэтому мы можем еще больше сократить таблицу доИ теперь
(1,1)
доминирует(0,1)
, поэтому мы в конечном итогеПоэтому всегда игра
(0,1)
- это равновесие Нэша. Но любопытно, что это не единственный. Это симметричная игра с нулевой суммой, поэтому ожидаемый выигрыш равен 0, и любая смешанная стратегия, объединяющая(0,1)
и(1,0)
где(0,1)
выбирается по крайней мере 50% времени, достигает этого выигрыша. Таким образом, мы имеем одномерное пространство равновесий Нэша.Кажется, что это так, хотя я не доказал этого, что у
n
Морфра-пальца есть многомерныйn
многогранник равновесий Нэша, которые представляют собой смешанные стратегии,n+1
(pick, guess)
для которых парыpick + guess = n
.Магические числа в коде выше кодируют 32 вершины 5-мерного многогранника равновесий Нэша. Я нашел их, настроив экземпляр линейного программирования, который представлял многогранник, и затем использовал случайные целевые функции. Причина кодирования всех 32, а не выбора одного, проста: ожидаемый выигрыш равен 0, поэтому мне нужно добиться большего, чем ожидалось, чтобы получить победу. По сути, я предполагаю, что другой игрок использует смешанную стратегию, и оцениваю распределение на основе их истории выбора. Затем я выбираю многогранную вершину, которая максимизирует мой ожидаемый выигрыш по сравнению с этим предполагаемым распределением.
QuinnAndValor демонстрирует уязвимость предположения о том, что другой игрок использует смешанную стратегию. Обнаружив игрока, который использует стратегии из равновесия Нэша, он может переключиться в режим случайного блуждания, где, играя в неравновесную стратегию, он в среднем может проиграть, но ему нужно только получить преимущество один раз, а затем он может вернуться к игре пар, для которых
pick + guess = n
. Таким образом, равновесия Нэша для одной игры не обобщаются тривиально на равновесия Нэша для повторной игры, что позволяет применять более сложные стратегии.источник
Куинн и Доблесть (Обновлено)
Куинн и Валор - элитная команда рейнджеров. С помощью арбалета и когтя они разрывают каждого противника, осмелившегося бросить им вызов
Они почти всегда побеждают все решения Java на моей машине.
Редактировать:
Я признаю, что Куинн и Доблесть не смогли дуэли с Историком, но я все еще верю в них, чтобы выиграть турнир.
Мой принцип, для любого решения
choice + guess == 5
, также играть сchoice + guess == 5
грантополучателями, сохраняя ваше преимущество.Обновить:
Ну ... все только усложнилось.
источник
филолог
Ученый пытается учиться на ходах своего противника, выбирая тот, который его противник менее угадал, и угадывая тот, который его противник использовал чаще всего. Но теория это еще не все, поэтому ученый не очень хорошо ...
источник
DeltaMAX
(Обновлен, чтобы не использовать файлы и добавил новый раздел. Также изменен, чтобы больше не зависать связывание в первом разделе.)
Состоит из пары стратегий, которые начинаются с простого, а затем становятся более сложными - если вы его очистите, он переместит вас в следующий раздел.
{0, 5}
последовательно(choice, guess)
пару, которая будет иметь наилучшие ожидания, взвешенные так, чтобы последние раунды были более важнымиЧтобы выяснить, какой слой использовался в конце, раскомментируйте
линия.
Извиняюсь за ужасную Java, я провел свой день, собирая кусочки вместе и переучивая язык :)
источник
private int strat;
достаточно хорошИсторик
(Обновлено: та же логика, более короткий код и 100 раз быстрее, но вы можете использовать только одного бота Historian на турнире.)
Использует взвешенную случайную выборку для выбора пары бросок-угадывание, основываясь на эффективности использования только этой пары против предыдущей истории противников. Весами являются квадраты от достижимых баллов.
Бьет
Quinn and Valor
(больше не) и проигрываетMorra Cowbell
. В турнире с большинством ботовHistorian
второе местоQuinn and Valor
.источник
Morra Cowbell
. Отредактировал пост. Вы можете удалить комментарии, если они устарели.Экстраполятор (v1.1)
Экстремальная экстраполяция из одного из равновесий Нэша в более простой игре.
Я поддерживаю краткий формат ответа! (В стиле питона.)
Кажется, связывает с Волшебной Коровой (Морра Ковбелл) и бьет другие записи, которые я проверял.
источник
модный
Модный смотрит на прошлые шаги противника, взвешивая их по времени. Угадай самый весомый и выберет один, слегка сдвинутый вверх от этого. Вот оно во всей красе:
Единственное, с чем я могу сравнить это сейчас, это Ковбелл. Он проигрывает с небольшим отрывом в большинстве случаев, но выходит на первое место достаточно часто, на мой вкус. Посмотрим, как это будет с другими конкурентами.
источник
Случайный догадчик
Это действительно просто. Он эффективно бросает d6 и добавляет еще один бросок к предыдущему броску для его предположения. Это не победит, но обеспечит хороший тест.
источник
Путать, Python 3
Излишне сложная запись. Даже я не знаю, что это делает.
Хотя этот продвинутый алгоритм, кажется, работает хуже, чем случайный в этом турнире, и использует значительную память и время выполнения, он имеет потрясающие результаты для определенных значений 5 ;-)
источник
Rainbolt
Принимает разницу между двумя последними числами, которые угадал наш оппонент, добавляет, что к последнему предположению оппонента, находит модуль и избегает выбора этого числа любой ценой. Например, если вы угадаете {5,4,3} (уменьшится на единицу), тогда мы будем избегать выбора 2 любой ценой.
Принимает разницу между двумя последними числами, которые выбрал наш оппонент, добавляет это к последнему выбору оппонента и угадывает это число. Например, если вы угадаете {1,4,5,2} (увеличивается на три), то мы догадаемся до 5.
Избегает бессмысленных или очень близких к бессмысленным броскам.
источник
getMove()
метод статичным. Вы не можете реализовать нестатический метод, подобный этому (по крайней мере, в Java 8).Развитый бот
Я превратил этого бота в лучшего случайного бота.
источник
Популярность, Python 3
Вычислить догадки на основе популярных чисел, использованных в прошлом противником. Числа, использованные в последнее время, имеют больший вес. Выбор номера часто совпадает с выбором.
источник
интерполятор
(Переключился на Java, так как Python вызывал проблемы)
Использует полиномиальную интерполяцию для последних 10 вариантов оппонента, чтобы определить следующий номер оппонента, затем делает то же самое с его собственным выбором и избегает выбора этого числа Кроме того, Интерполятор имеет небольшое смещение против выбора 0 или 5, и его выбор иногда зависит от его предположения:
источник
CounterBot
Не противостоит никому, а считает через 0-5 по кругу (
0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4 ...
)источник
Василиск, Питон
Согласно легенде, Василиск - король змей. ( источник ) Я подумал, что это подходящее имя для бота, который играет "Благородную игру королей" и написан на python. = D Этот бот вселяет страх в сердце других ботов и вызывает смерть одним взглядом.
Это работает по довольно простой стратегии. Я не ожидаю, что это победит, но было весело писать. Это также мой первый вызов KoTH, поэтому я рад видеть, насколько хорошо он работает.
Как он выбирает свой следующий ход.
Василиск всегда делает ход, который его противник угадал наименьшее количество раз. В случае галстука он выберет меньшее число. (чтобы минимизировать количество очков противников.)
Как он выбирает свою следующую догадку.
Василиск выберет наиболее вероятный ответ на его предыдущее предположение. Например, если в прошлый раз он угадал 3, он вернется через все предыдущие моменты, когда он угадал 3, а затем вернет наиболее распространенный ход противника, который приходит после угадывания 3. В случае ничьей , он выберет большее число (чтобы максимизировать количество точек, которые он может сделать.)
С технической точки зрения, это будет работать правильно? Достаточно ли print () или я должен использовать что-то вроде sys.stdout.write (), как это сделали другие Pythonistas?
источник
то же самое
Это превращается в противника, но позади на одну догадку / выбор.
источник
NullifierBot, Java
Всегда выбрасывает 0, чтобы минимизировать выигрыши противника. Если оппонент когда-нибудь угадает мой номер, он зарабатывает только то, что бросил.
Всегда угадывает 5, чтобы максимизировать мой выигрыш. Поскольку я не могу получить ни одного очка от своего броска, я хочу получить как можно больше очков от оппонента. Я мог бы случайно догадаться, но где в этом веселье?
источник
Ошибка, Java
Не очень, но изначально он был спроектирован так, чтобы быть в основном случайным, пока ценность компромисса не показалась мне. Умудряется последовательно проигрывать против Counter Bot> _ <
источник
Эхо, Рубин
Играет последнюю игру противника, основываясь на теории, что любой может создать бота, которого он не может предсказать. Предположения основаны на ожидаемом значении с использованием выборки из ста шагов.
источник
echo.rb:3:in
<main> ': неопределенный методsize' for nil:NilClass (NoMethodError)
. Кажется, это происходит только в первом раунде, когда нет истории ходов.if (mychoices.size > 990 && myscore == '0') nextchoice = rand(1..5)
части?КОРОЛЬ ФИШЕР
Этот парень состоит из алгоритмов плохого угадывания, которые в основном используют взвешенные массивы.
источник
Э-э-э Я знаю, о чем ты думаешь. "Он выберет пять или что-то еще?" Хорошо, чтобы сказать вам правду во всем этом волнении, я в чем-то не уверен, но так как это метод .44, самый мощный метод в мире, который сразу же перегружает ваш стек, вы должны задать себе один вопрос : "Чувствую ли я удачу?"
Что ж, панк?
источник