Я пишу алгоритм, принимая форму задачи рюкзака. Я пытаюсь максимизировать значение (V) моего рюкзака с учетом максимального веса (W). Уловы в том, что каждый элемент (I) может быть выбран только один раз, рюкзак независимо от веса может содержать только 10 элементов, и есть очень большое количество элементов (500+).
Мои мысли до сих пор состояли в том, чтобы создать рюкзак, который имеет избыточный вес и рекурсивно работает в обратном направлении, заменяя предметы по одному, пока он не будет Это не проблема для создания наиболее оптимального рюкзака, однако, я хотел бы создать следующие 100 или около того рюкзаков. Я думал, что могу сделать это, продолжая свой рекурсивный процесс, однако, я не чувствую, что это полностью точно, поскольку может не хватать немного более оптимальных рюкзаков.
Эта задача может быть сформулирована как целочисленная программа.
Есть много библиотек решателей, которые решат эту программу для вас; в качестве альтернативы, вы можете сделать ветку и связать себя. Вот двойная линейная программа, которая может быть решена для получения верхней границы на целочисленной целевой программе, которая необходима для ветви и границы.
При заданном значении для
z
, установка других переменных является вопросом присвоения положительногоy_i
для девяти верхних элементовv_i - w_i * z
, в то время как присвоениеu
десятого наибольшего значения. Должен быть возможен троичный поискz
во времениO(n log n)
.