/MerchantGuilds

Решение тестового задания RBK.Money

Primary LanguageJava

MerchantGuilds

Решение тестового задания RBK.Money

Условия задачи:

В древней Гильдии состоят 60 торговцев. Каждый год они заключают друг с другом сделки. Ежегодно каждый торговец заключает сделки со всеми остальными членами Гильдии, от 5 до 10 сделок между каждой парой торговцев.

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

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

Мерило успеха в Гильдии - прибыль, которую торговец заработал за последний год. В конце каждого года 20% самых неуспешных торговцев с позором исключают из Гильдии, а их место занимает ровно столько же новых, которые копируют поведение 20% самых успешных членов Гильдии.

Торговцы хранят коммерческую тайну, не распускают слухов и ничего не рассказывают другим о свершённых сделках.

У торговцев существуют следующие стандартные стратегии поведения:

Название Описание
альтруист Всегда сотрудничает.
кидала Всегда жульничает.
хитрец Начинает с сотрудничества, потом повторяет ход оппонента.
непредсказуемый Поступает случайным образом.
злопамятный Начинает с сотрудничества и продолжает сотрудничать, пока против него не сжульничают. После этого сам начинает постоянно жульничать.
ушлый Всегда начинает с последовательности ходов: сотрудничество, жульничество, сотрудничество, сотрудничество. Далее, если к пятому ходу его хоть раз обманули, то играет как кидала, если нет, то как хитрец.

В процессе сделки для каждого торговца существует 5% вероятность ошибиться и принять неправильное решение: сжульничать вместо того, чтобы сотрудничать, или наоборот.

Изначально в Гильдии состоит равное число торговцев, выступающих приверженцами каждой из перечисленных стратегий.

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

Примечания

  • При всех дробных расчётах используется округление вниз.

Результаты

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