Парадокс двух конвертов и стратегия Ковера (реализация на .NET)

в 23:02, , рубрики: .net, Алгоритмы, теория вероятности, метки:

Парадокс двух конвертов и стратегия Ковера (реализация на .NET)

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

Изначально парадокс двух конвертов предстал в таком виде в 1980 году, хотя на самом деле никакого парадокса нет, все (как это часто бывает в подобных случаях) заключалось в формулировке задачи. Но меня привлекла статья на lenta.ru, а именно эти слова из нее:

В рамках исследования австралийские ученые создали стратегию, получившую название стратегии Кловера (в честь своего коллеги, который «подкинул им данную идею во время завтрака»). Ученые предлагают играющему сначала субъективно оценить количество денег, а затем на основе данной оценки вычислить вероятность обмена. При этом, чем денег кажется больше, тем меньше вероятность того, что надо выполнить обмен.

в других статьях по этой теме написано похожим образом:

Заключается она (стратегия) в следующем. Нужно менять или не менять конверты в каждом заходе случайным образом, но с вероятностью, которая зависит от суммы, увиденной в первом конверте. То есть чем меньше сумма в конверте А, тем с большей вероятностью следует сменить конверт и наоборот, несколько большая сумма в А говорит о том, что скорее следует оставить первый конверт себе.

Тогда, в 2003-м, Дерек посчитал идею своего коллеги бредом и отказался продумывать такую стратегию. И учёного можно понять: рассудите сами, увиденная сумма не говорит человеку ровным счётом ничего о намерении, условно, ведущего (который раскладывает деньги), ведь игрок не знает — в каком вообще диапазоне играет его оппонент. Может быть, от 10 центов до 100 долларов, а может, от 5 долларов до ста миллионов.

Другими словами, оказывается существует стратегия, при которой в серии из множества конвертов можно повысить свои шансы на выигрыш!

Я решил проверить эту теорию и написал программу на .NET'е. Смысла приводить код программы целиком нет, вот ссылка на github. Но хочется остановиться на некоторых моментах. В программе есть интерфейс Picker'а, т.е. механизма, который выбирает из двух конвертов один. Этот интерфейс выглядит вот так:

    public interface IPicker
    {
        int Pick(IRandomProvider randomProvider, EnvelopePair envelopePair);
    }
 

Также я реализовал два простых класса на базе этого интерфейса:

AlwaysFirstPicker — выбирает все время первый конверт
AlwaysSecondPicker — выбирает все время второй конверт

Сам конверт выглядит просто:

    public sealed class Envelope
    {
        public int Amount { get; set; }
    }
 

Пара конвертов, с которой мы собственно и имеем дело выглядит так:

    public sealed class EnvelopePair
    {
        public Envelope FirstEnvelope { get; set; }
        public Envelope SecondEnvelope { get; set; }
        //...
    }
 

В каждый конверт я положил 5 или 10 долларов. И, наконец, стратегия Ковера:

        public int Pick(IRandomProvider randomProvider, EnvelopePair envelopePair)
        {
            int randomValue = randomProvider.Next(110);
 
            /*
             * То есть чем меньше сумма в конверте А, тем с большей вероятностью следует сменить конверт и наоборот,
             * несколько большая сумма в А говорит о том, что скорее следует оставить первый конверт себе.
             */

 
            if (envelopePair.FirstEnvelope.Amount <= randomValue)
            {
                return envelopePair.SecondEnvelope.Amount;
            }
            else
            {
                return envelopePair.FirstEnvelope.Amount;
            }
        }
 

После экспериментов оказалось, что этот способ действительно работает. Вывод программы при использовании стратегии AlwaysFirst:

Your balance is: 7503495

Вывод программы при использовании стратегии AlwaysSecond:

Your balance is: 7504335

Т.е. в среднем при использовании этих стратегий мы получили вполне ожидаемый средний выигрыш в 7,5 долларов. Вывод программы при использовании стратегии Ковера:

Your balance is: 8886740 (!!!)

Как говорится, почувствуйте разницу! 8,8 доллара из 10! Забавно, что изменяя строку в стратегии Ковера результат меняется не сильно:

            int randomValue = randomProvider.Next(120);

т.е. таким образом мы выполняем вот это требование:

ведь игрок не знает — в каком вообще диапазоне играет его оппонент

Читатели могут самостоятельно стать «учеными, которые провели около 20 тысяч компьютерных симуляций», скачать программу и попробовать её в действии. Может быть найдется человек, который сможет усовершенствовать результат и показать в комментариях свой Picker.

P.S. lenta.ru почему-то назвали ученого Кловером, хотя на самом деле он Ковер.

Автор: Gangsta

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js