вторник, 3 ноября 2009 г.

Олимпиада по многократному решению делемы заключенного

Было принято решение провести олимпиаду по решению многократной дилемы заключенного.
К участию приглашаются все желающие. Дата проведения олимпиады будет объявлена дополнительно. Ориентировочно олимпиада будет проходить 17 декабря 2009 года в 16:00.

Для участия необходимо предоставить dll разработанную на платформе .Net и содержащую класс потомок интерфейса:
namespace Competition
{
  public interface ICompetition
  {
    /// <summary>
    /// Передает в библиотеку количество участников
    /// </summary>
    /// <param name="p_count">количество участников</param>
    void SetCount(int p_count);
    /// <summary>
    /// Делает один ход
    /// </summary>
    /// <param name="p_prevResult">Массив предыдущих ответов соответствующих участников</param>
    /// <returns>Массив ответов на текущем шаге</returns>
    bool[] MakeStep(bool[] p_prevResult);
  }
}


* This source code was highlighted with Source Code Highlighter.

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

В процессе проведения соревнования запрещается:
1. Попытка загрузки, рефакторинга, изменения или удаления сборок оппонентов.
2. Запрещается влиять на работу сервера иными средствами кроме возвращения массива из метода MakeStep.
3. Осуществлять сговор участников соревнования.
4. Модифицировать ICompetition.dll или реализовывать интерфейс ICompetition в своих сборках.


Порядок проведения соревнования:
1. Все участники соревнования предоставляют dll удовлетворяющие описанным выше требованиям и запретам.
2. Сервер олимпиады подгружает все зарегистрированные сборки с загрузкой из каждой ОДНОГО класса потомка интерфейса ICompetition.
3. От каждого класса создается объект посредством вызова конструктора по умолчанию.
4. Для каждого созданного объекта вызывается метод SetCount в который передается количество участников соревнований.
5а. В первом туре в метод MakeStep передается null. Метод должен вернуть в виде массива bool-евых значений свое отношение к сборкам противников: true - сотрудничать, false - предавать. Количество значений в массиве должно соответствовать количеству участников полученных классом через метод SetCount.
5б. Во втором и последующих турах (проходит от 30 до 50 туров), в метод MakeStep передается отношение к данному участнику всех оппонентов. Количество значений в массиве соответствует количеству участников полученных классом через метод SetCount. На основе полученных данных необходимо вернуть массив отношения к сборкам противников.
6. Через 5 секунд после вызова соответствующих методов, все методы не закончившие обработку и не вернувшие значение снимаются с соревнований.
7. Если количество туров превысило 30 и сгенерированное случайное число меньше 1/20 то соревнование заканчивается, в противном случае переход в пункт 5б.

Если два участника поставили взаимное true, то каждый из них получает по 7 очков рейтинга. Если два участника поставили взаимное false, то каждый из них получает по 3 очка рейтинга. Если один из участников поставил true в ответ на false другого участника, то первый не получает очки рейтинга, а второй получает 10 очков рейтинга.

Пять программ набравших наибольшее количество баллов рейтинга получают по 5,4,3,2 и 1 очку в зависимости от занятого места.
Соревнования повторяются 3-5 раз. Программа набравшая суммарно максимальное количество очков признается победителем олимпиады.

В качестве приза будет нечто полезное программистам ;)

Удачной олимпиады.

P.s. В случае обнаружения неточностей, ошибок или при наличии предложений писать в комментариях.

5 комментариев:

  1. Доброго времени суток. Хотел написать про несправедливый разброс очков рейтинга, но потом протер глаза и понял, что все нормально. :) Смутил меня абзац "обобщенная форма" статьи википедии. При дынных очках рейтинга , условие "общий выйгрыш от сотрудничества должен быть больше суммарного выигрыша в ситуации, когда один предает, а другой - нет, то есть 2C > D+c", выглядит как 2*7 > 10+3 (14 > 13). Т.е. "сотрудничающие" стратегии имеют почти незаметное преимущество перед стратегиями "око за око", а значит лишний раз рисковать сотрудничеством почти не имеет смысла. Не очень тонкий баланс ведь получается?

    ОтветитьУдалить
  2. Извините, невнимательный совсем. :(
    2C > D+c выглядит как 2*7 > 10+0 (14 > 10). :)

    ОтветитьУдалить
  3. На самом деле разброс можно и поменять, но исходя из классической дилемы вроде получается пропорциональное поощрение.

    ОтветитьУдалить
  4. С новым годом :) Как прошла олимпиада?

    ОтветитьУдалить
  5. Прошла забавно, чуть менее интересно чем хотелось бы... А так, мне погравилось. Победил студент 5 курса специальности САПР Степичев Станислав. В качестве приза ему досталась книжка про паттерны проектировния.

    ОтветитьУдалить