Нахождение оптимальных элементов из массива в Python - PullRequest
2 голосов
/ 25 февраля 2011

Мне нужно разработать алгоритм, который находит меня наиболее оптимальными элементами из списка в Python. У меня есть компакт-диск, который держит 700 МБ. И массив из 300 случайно сгенерированных файлов размером от 30 до 90 МБ. Он должен заполнить компакт-диск наиболее оптимальным способом, чтобы минимальное пространство было потрачено впустую (просматривая все возможные пути). Я думаю, что это похоже на проблему ранца, только в том, что он имеет только 1 массив и предел. Поскольку я совершенно новичок в области алгоритмов и структуры данных, я понятия не имею, как реализовать это с помощью python

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 25 февраля 2011

Как отмечает @payne в своем комментарии, это действительно то же самое, что и проблема с рюкзаком.Таким образом, решение заключается в простом алгоритме динамического программирования.

Скажем, файлы располагаются один за другим в некотором порядке в списке.Сначала у вас есть выбор: включить первый файл или пропустить его.Если вы решите включить его, доступное пространство уменьшится на размер этого файла.Если вы решите пропустить его, доступное пространство останется неизменным.Теперь вы можете получить второй файл в двух состояниях.В первом вы выбрали первый файл и, таким образом, у вас меньше места, а в другом вы пропустили первый файл и у вас больше места.Для каждого из этих сценариев вы снова можете включить или пропустить второй файл.

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

Это приводит к простому повторению:

min_waste(index,space)={
   o if space=0     # no more space available, so 0 wastage

   space if index>=size(files) # no more files left, whatever is left is wasted

   min_waste(index+1,space)  if size(files[index])>space  # current file is too large skip ahead

   min( min_waste(index+1,space), min_waste(index+1,space-size(files[index])) ) otherwise
   # minimum of choosing this one and skipping ahead 
}

Вы можетерешите реализовать это, заполнив таблицу (т.е. двумерный массив) снизу вверх, или просто запишите это как рекурсивную функцию и запомните.

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

2 голосов
/ 25 февраля 2011

Вероятно, неэффективно найти самый оптимальный способ. Но вы можете использовать некоторые эмпирические правила, например сначала взять самые большие файлы, а затем заполнить оставшееся пространство первым подходящим файлом, пока пространство не станет слишком маленьким для того, чтобы его можно было уместить. См. Проблема с упаковкой в ​​бункер . Оптимальный простой алгоритм - First Fit Decreasing. Сортировать все файлы по размеру от самого большого до самого маленького. Затем поместите каждый файл на первый компакт-диск, где достаточно места для его размещения, пока все файлы не будут израсходованы.

Редактировать

Вполне вероятно, что все файлы, собранные вместе, точно не равны некоторому количеству компакт-дисков. Например, если общее количество файлов составляет 1,6 ГБ, это два компакт-диска с небольшим остатком, даже если они упакованы идеально. Итак, если вы уже знаете, что 3 компакт-диска являются минимально необходимыми, и вы пробуете несколько комбинаций, пока не подберете его для 3 компакт-дисков, почему его нужно оптимизировать больше, чем это? Вы не можете сохранить больше дисков, чем теоретический минимум.

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