Беспристрастный (случайный?) Алгоритм выбора - PullRequest
3 голосов
/ 15 сентября 2011

Проблема: Есть X количество свойств, все плавающие между 0 и 1.
Выбор свойства имеет постоянную стоимость C. (вместо того, чтобы оставить его в 0)
Стоимость имущества пропорциональна его стоимости (экспоненциальной или линейной) Как мне сделать беспристрастный (рандомизированный?) Выбор подмножества свойств с учетом бюджета B?

Допустим, функция "cost" выглядит примерно так: (экспоненциальная версия)

cost = C*sgn(x) + ke^(ax)
0 <= x <= 1
Constants: C, k, a

Моей первой мыслью была какая-то проблема оптимизации, но на самом деле нечего увеличивать / уменьшать. Я думаю, вы могли бы рассматривать его как поиск решения, максимально приближенного к B. Это, на самом деле, не имеет смысла, поскольку я не ищу «лучшего» решения, подойдет любое решение, достаточно близкое к B.

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

Я не ищу что-то очень точное или гарантирующее независимые результаты. Возможно, я слишком усложняю это? На данном этапе я просто ищу что-то быстрое и грязное, которое можно реализовать на Java или аналогичном языке.

Редактировать: Я последовал совету ниже и разместил вопрос на здесь на math.stackexchange.com. Я думаю, я сделал намного более ясным, чего я пытаюсь достичь

Ответы [ 3 ]

0 голосов
/ 16 сентября 2011

Комментарий MarianP, кажется, имеет правильное направление. Например, если у вас есть 3 свойства с весами 1, 3 и 6, вы можете мысленно разделить линию длиной 1 + 3 + 6 = 10 на три сегмента:

+-+---+------+
|0|123|456789| 
+-+---+------+

Затем бросьте кубик с диапазоном (0,9) и выберите сегмент (свойство), в который попадает игральная кость. Удалите это свойство из набора и выполните рекуссирование сверху с новым набором свойств (которые также отфильтрованы по бюджету).

Таким образом, более высокая последовательность (более тяжелое свойство) выбирается с большей вероятностью.

0 голосов
/ 16 сентября 2011

Здесь я попытаюсь начать с неэффективной процедуры, которая удовлетворяет одному виду случайности, и заменить ее более эффективной.

1) Неэффективно - я предполагаю, что у вас есть список свойств и связанных с нимирасходы.Рассмотрим все возможные наборы свойств - если существует N свойств, таких наборов будет 2 ^ N.Из этого рассмотрим набор наборов свойств, которые вписываются в ваш бюджет.Из этого меньшего (но, вероятно, все еще огромного) набора выберите случайный набор свойств.

2) Возможная реализация.Я предполагаю, что все затраты представляют собой целые числа умеренного размера, или что вы можете принять неточность, связанную с округлением их до этого.Теперь вы можете создать массив A, где A [i] - это количество способов создания совокупной стоимости i.При рассмотрении 0 свойств A [0] = 1. Теперь рассмотрим свойство стоимости 3. Единственный ненулевой элемент A на данный момент - это A [0].Это дает вам другой способ генерировать A [0 + 3 = 3], поэтому вы можете установить A [3] = 1 + A [0].Рассматривая каждое свойство по очереди, вы можете установить A [i] = количество способов, которыми вы можете создать набор стоимости i, используя эти свойства.

После того, как вы построите массив, рассмотрите каждое свойство вОбратимся, начиная со стоимости B. Выберите точную стоимость C путем выборки из затрат> = B с вероятностью, пропорциональной числу способов создания набора этих затрат.Теперь рассмотрим каждое свойство по очереди.Если дано свойство стоимости c, если оно больше текущей стоимости C, откажитесь от него.Если нет, рассмотрите A [C] и A [C - c] и выберите между ними с вероятностью, пропорциональной их размеру.Если вы выбираете A [C], вы отказываетесь от собственности.Если вы выберете A [C - c], вы включите свойство в свой случайный набор.

Возможно, есть способ сделать что-то эквивалентное без округления до целых чисел, используя http://en.wikipedia.org/wiki/Metropolis%E2%80%93Hastings_algorithm - возможно, я сижуи об этом позже.

Да - это довольно легко выпадает из Метрополис-Гастингс.По сути, вы начинаете с любого допустимого набора, например с нулевого набора, запускаете большое количество шагов Метрополиса-Гастингса и надеетесь, что результат будет достаточно хорошо перемешан, и результирующий набор будет в значительной степени случайным в соответствии с вашим распределением.Если вам нужна еще одна случайная выборка, снова выполните ее через множество шагов MH.

На языке записи в Википедии P (x ') = P (x_t) = 1. Для вычисления Q (x_t; x') вам нужно решить, как перейти от набора к набору.Если вы упорядочите свойства в отсортированном порядке стоимости, вы можете рассчитать, учитывая общую стоимость набора, сколько из оставшихся свойств вы можете себе позволить добавить к нему - например, выполнить двоичный анализ, чтобы определить количество свойств, которыедостаточно дешевы и используют какое-то сбалансированное дерево для подсчета количества уже выбранных таких свойств.Таким образом, вы можете определить количество различных свойств, которые вы можете добавить к текущему набору, и, конечно, вы также можете вычесть любое из существующих свойств.Если шаг состоит в том, чтобы либо добавить, либо вычесть одно свойство, вы знаете, как много разных способов уйти от x_t, и вы можете сделать аналогичный расчет для x '.Таким образом, Q (x '; x_t) равно 1 / (количество выходов из x_t), а Q (x_t; x') равно 1 / (количество выходов из x '), и как только вы решили, двигаться или нет,если вы решили переехать, вы выбираете один из этих способов из x_t наугад.

0 голосов
/ 15 сентября 2011

Здесь вы можете использовать принцип максимальной энтропии.http://en.wikipedia.org/wiki/Principle_of_maximum_entropy.По сути, существует огромный набор назначений для X, некоторое (очень небольшое) подмножество этих назначений точно удовлетворит ваш бюджет.Вы хотите выбрать равномерно наугад из этого набора удовлетворяющих заданий.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...