Парадокс двух конвертов. Part 2 — C#.
Доброго времени суток!
Сегодня, во времена популяризации покера, актуальными становятся алгоритмы увеличения прибыли при недостаточном количестве информации. Многие занимаются вопросами нахождения наиболее эффективных алгоритмов.
Существует великое множество вероятностных задач и парадоксов, но особое место среди них занимает парадокс (задача) о двух конвертах.
Теоретические аспекты очень подробно описаны на википедии, возможные решение предложены на мембране.
Также эта тема уже обсуждалась на Хабре.
Я же предлагаю вашему вниманию реализацию данного парадокса на C#.
Первым делом я сделал GUI-версию.
Алгоритм, получился достаточно неплохим, но весьма примитивным. Все дело в том, что точка принятия решения — это среднее значение всех левых конвертов. Левый конверт — который всегда вскрывается.
И эта точка в конечном счете стремится к середине диапазона значений функции генерирующей количество денег в конверте.
Тогда я решил, что интересно будет анализировать последние N значений. Для примера взял N = 20. И реализовал еще несколько алгоритмов:
Где TM — это количество денег (total money), а T — количество угаданных удвоений (True). «Т» никак не влияет на принятие решения.
Все вычисления производятся в отдельном потоке (
Исходый код программы GUI
Исходый код программы Console
Готов реализовать самый эффективный алгоритм. Буду рад любым идеям.
Сегодня, во времена популяризации покера, актуальными становятся алгоритмы увеличения прибыли при недостаточном количестве информации. Многие занимаются вопросами нахождения наиболее эффективных алгоритмов.
Существует великое множество вероятностных задач и парадоксов, но особое место среди них занимает парадокс (задача) о двух конвертах.
Теоретические аспекты очень подробно описаны на википедии, возможные решение предложены на мембране.
Также эта тема уже обсуждалась на Хабре.
Я же предлагаю вашему вниманию реализацию данного парадокса на C#.
Первым делом я сделал GUI-версию.
Алгоритм, получился достаточно неплохим, но весьма примитивным. Все дело в том, что точка принятия решения — это среднее значение всех левых конвертов. Левый конверт — который всегда вскрывается.
<source lang="cs">
if (leftValue < LimPoint) {
totalMoney += rigthValue;
}
else {
totalMoney += leftValue;
}
</source>
И эта точка в конечном счете стремится к середине диапазона значений функции генерирующей количество денег в конверте.
Тогда я решил, что интересно будет анализировать последние N значений. Для примера взял N = 20. И реализовал еще несколько алгоритмов:
- всегда менять конверт
- никогда не менять конверт
- чередовать выбор
- менять случайным образом
- менять в зависимости от среднего значения всех левых конвертов
- в зависимости от последних N левых конвертов
- менять, опираясь на последнее значение
Где TM — это количество денег (total money), а T — количество угаданных удвоений (True). «Т» никак не влияет на принятие решения.
Все вычисления производятся в отдельном потоке (
System.ComponentModel.BackgroundWorker
), а среднее значение последних N элементов вычисляются с помощью очереди FIFO (System.Collections.Queue
).Исходый код программы GUI
Исходый код программы Console
Готов реализовать самый эффективный алгоритм. Буду рад любым идеям.
0 комментариев