Практически, у меня есть набор объектов с вероятностями, и я хочу посмотреть на каждую возможную группу из них, в порядке вероятности того, что они все истинны, предполагая, что они 'независимы - т.е. в порядке убывания произведения элементов подмножеств - или в порядке длины, если вероятности одинаковы (так что (1, 0,5) следует после (0,5)).
Пример: если у меня есть [ 1, 0.5, 0.1 ]
, я хочу [ (), (1), (0.5), (1, 0.5), (0.1), (1, 0.1), (0.5, 0.1), (1, 0.5, 0.1) ]
По сути, это означает, что я хочу перебирать набор элементов по порядку, и я мог бы довольно легкосгенерируйте это, сортируйте это и делайте.Однако наборы мощности становятся довольно большими и довольно быстрыми, я ожидаю, что обычно мне понадобится один из первых подмножеств, и я бы предпочел не генерировать список из тысяч подмножеств, сортировать их, а затем никогда не заглядывать за третье.Вот где, надеюсь, генераторы python спасут день!
Более формальная спецификация проблемы, мне нужно найти способ сделать sorted(powerset(input), key = lambda l : reduce (lambda (p, n), e: (p * e, n-1), l, (1, 0)), reverse=True)
в качестве генератора или каким-либо другим способом, который позволит мне избежать сборкии сортировка всего списка.
Я вполне уверен, что это связано с проблемой ранца, наряду с проблемой подмножества продуктов, но я действительно изо всех сил пытаюсь получить хороший алгоритм для него, который работает, и помогитебыл бы очень признателен :-).Это не проблема для того, чтобы он был медленнее, чем сборка + сортировка всего в худшем случае (итерация до конца), ему просто нужно намного лучшее выполнение (в пределах, скажем, первых 10%).