Я думаю над этим сейчас. Судя по всему, в уме я могу представить решение этим методом упрощенной задачи (про фишки):
Предположим, исход, по фишке, стоящей на 1й клетке отсеиваться не будет вовсе, а по фишке, стоящей на 2й или 3й клетке он будет отсеиваться с большой вероятностью, например, 99%.
В таком случае исходы (2, 3) и (3, 2) будут отсеиваться в 100 раз чаще, чем исходы, в которых одна из фишек стоит на 1м месте.
То есть, это решение, судя по всему, дает в пределе нужное решение.
Правда, сразу видны недостатки:
1) во-первых, по мере уменьшения маргинальной вероятности 2й и 3й клеток, у нас будет браковаться все больше подходящих нам исходов. В приведенном мною примере 99 исходов (1, 2) из 100 будут отсеиваться.
2) во-вторых, я не знаю, подойдет ли это решение для исходной задачи с доской. Интуитивно пока похоже на то, что подойдет (но первый недостаток сохранится)
Так. Вот можно заметить, как можно усовершенствовть это решение.
Если у нас все исходы бракуются с минимум 99% веростностью, то можно умножать вероятность прохождения
всего исхода (то есть, домножать вероятность того, что он не будет забракован ни по одной из компонент) на 100.
Таким образом, решения, содержание фишку на 1й клетке вообще не будут браковаться, а решения вида (2, 3) и (3, 2) будут браковаться в 99% случаев (и вообще с любой заданной вероятностью). Это, конечно подходит.
Итак, похоже, что упрощенная задача решена. Выпишу ход решения для ясности:
Дано:
Ч и Б фишки.
3 клетки.
распределения Ч и Б фишек по клеткам: 50/25/25.
Мы сначала применяем алгоритм
_hum_, и пересчитываем маргинальные вероятности. Если они не совпали - увеличиваем вероятность "недостающих" исходов. После некоторого числа итераций, мы получаем такую ситуацию:
Маргинальные вероятности нахождения фишек на 1й клетке близки к 1, маргинальные вероятности нахождения на 2й или 3й близки к кулю.
После чего генерируем произвольные исходы, оставляя исходы, содержание фишку на 1й клетке с веротяность 1(вероятность того, что мы не отсеим этот исход по фишке, стоящей на 1й клетке)*0.01(вероятность того, что мы не отсеим этот исход по фишке, стоящей на второй клетке)/0.01(максимальная вероятность неотсеивания исхода) = 1, а исходы без фишки на 1й клетке отсеивая в 99% случаев (1 - 0.01*0.01/0.01).
Сразу, к сожалению, понятно, что это решение вычислительно не подходит для исходной задачи. По мере приближения каких-то маргинальных вероятнстей к 0 будет расти коэффициент С, экспоненциально уменьшая число проходящих вариантов. Да и итерационное схождение будет достаточно медленным. Например, при указанном мною отклонении от исходных маргинальных вероятностей в 7%, будет требоваться где-то 5-6 итераций для сокращения этой ошибки вдвое, и всего будет требоваться порядка 20 итераций для доведения ее до статистически незначительной. Впрочем, если уметь быстро пересчитывать маргинальные распределения, с этим смириться можно. Тем более, что ускорить сходимость задача леко решаемая. А вот слишком большое C делает алгоритм неработоспоосбным.
-- 19.01.2013, 16:11 --Спрашивайте. Имеем исходную тройку распределений как начальный член последовательности.
В частности, "получить очередное решение" - случайно выбрать ~три сотни позиций, назначить туда вероятности (тоже случайно). Сосчитать тройку распределений. Оценить, насколько она "коллениарна" и, в зависимости от этого, "поправить" предыдущий член последовательности, приближая к равномерному.
Ничего не понял. Давайте по шагам.
Вот у нас есть 3 исходных маргинальных распределения.
Далее, мы выбираем 3 сотни позиций. Позиций чего? 3 сотни совместных исходов? То есть, 3 сотни наборов вида (E4, A2, H3)? Ок, выбрали 300 наборов.
"Назначаем туда вероятности" - Это значит, что каждому исходу мы случайным образом присваиваем некоторую вероятность? Ок, присвоили произвольную вероятность.
Далее, нам "надо сосчитать тройку распределений". Мы просто суммируем вероятности всех исходов, в которых конкретная ладья стоит на конкретном месте, и присваиваем соответствующему исходу маргинального распределения для данной ладьи получившуюся вероятность, так?
До этого момента понятно.
Оценить, насколько она "коллениарна" и, в зависимости от этого, "поправить" предыдущий член последовательности, приближая к равномерному.
Вот тут уже не понятно. Как нам оценить получившуюся тройку распределений?