Я пытаюсь разработать алгоритм для выбора поднабора действий из большого списка.Если выбрано, каждое действие использует некоторое количество фиксированного ресурса (т.е. сумма по выбранным действиям должна оставаться в общем бюджете).Может быть несколько возможных подмножеств, и способы их выбора будут основаны на расчете альтернативной стоимости невыбранных операций.
РЕДАКТИРОВАТЬ: Существует две причины этогоэто не проблема 0-1 для ранца :
- Для ранца требуются целочисленные значения весов (т. е. потребляемых ресурсов), тогда как потребление ресурсов (т. е. масса на языке рюкзака)непрерывная переменная.(Очевидно, что можно выбрать некоторый уровень точности и квантовать требуемые ресурсы, но размер моей корзины должен быть очень маленьким, а рюкзак -
O(2^n)
в Вт. - Я не могу рассчитать альтернативную стоимость априори;то есть я не могу оценить пригодность каждого из них независимо, хотя я могу оценить полезность данного набора выбранных действий или предельную полезность от добавления дополнительной задачи в существующий список.
Проведенное мною исследование предлагает наивный подход:
Определение блока питания
Для каждого элемента блока питания рассчитайте его полезность на основе элементовотсутствует в наборе
Выберите элемент с наибольшей полезностью
Однако я знаю, что есть способы ускорить время выполнения и требуемую память. Например:
- полное перечисление powerset -
O(2^n)
, но мне не нужно полностью перечислять список, потому что, как только я нашел набор задач, который превышает бюджет, я зналБлагодаря тому, что любой набор, который добавляет больше задач, неосуществим и может быть отклонен.То есть, если {1,2,3,4}
неосуществимо, то же самое можно сказать и о {1,2,3,4} U {n}
, где n - это любая из задач, остающихся в большом списке. - Поскольку я просто суммирую, порядок задач не имеет значения(т. е. если возможно
{1,2,3}
, то {2,1,3}
, {3,2,1}
и т. д.). - Все, что мне нужно в конце концов, - это выбранный набор, поэтому мне, вероятно, нужно только лучшее значение утилиты, найденное на данный момент для целей сравнения.
- Мне не нужно хранить перечисления списка,пока я могу быть уверен, что я посмотрел на все возможные.(Хотя я думаю, что сохранение суммы долга для ранее вычисленных возможных подмножеств может ускорить выполнение.)
Я убедил себя, что хороший алгоритм рекурсии будет работать, но я не могу понять,как определить его, даже в псевдокоде (что, вероятно, наиболее целесообразно, потому что он будет реализован на нескольких языках - возможно, Matlab для прототипирования, а затем скомпилированный язык позже).