Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
У меня есть потребность усложненного решения задачи о рюкзаке. Помимо стандартного условия сложной задачи: Если кто-то не сталкивался, условие следующее: есть набор предметов разной стоимости и веса Найти набор сумма которого по весу будет не более вместимости рюкзака, а ценность содержимого максимальная описание есть на wiki -Knapsack_problem -мое ограничение алгоритма, не все элементы рюкзака имеют ценность самостоятельно. Если на примере. Есть 2 элемента - пистолет, доп.магазин для него и глушитель. Сам по себе глушитель ценности не имеет, также как и магазин. Если в рюкзаке нет пистолета, то его(этот предмет) не стоит брать в принципе. В моем случае максимум 800 элементов. Попытался прямым перебором. С подстановками комбинаций. Т.е. решал типичную сложную задачу про рюкзак для случаев: Пистолет Пистолет+глушитель Пистолет+доп.магазин Пистолет+глушитель+доп.магазин реализация расчета выполняется нереально долго. (мои ограничения по времени превышает в 5 раз и более) Попробовал жадный алгоритм, работает очень быстро, но есть пара багов на которые нет решения Метод работает так: - Создаем эффективность единицы массы (т.е. цена за кг) т.к. в имеющемся у меня условии у самого нужного из направления предмета самая высокая (т.е. если пистолет нужнее всего то он будет самым эффективным на грамм, если следующий по эффективности глушитель та же история ) - сортируем по убыванию, так получаются, что главные предметы в начале списка (пистолеты) - отбираем до набора веса - если последний элемент нельзя взять, берет следующий после него по эффективности. - если эффективнее выложить несколько предметов чтобы взять этот, то так и делает в данном алгоритме дыра, собственно, которую не могу решить допустим есть предметы массы, отсортированные по убыванию эффективности 1 кг массы 6 - 100 руб на кг 5 - 91 руб на кг 6 - 90 руб на кг надо взять 12 кг. Алгоритм берет 6 и 5 кг. Хотя эффективнее с точки зрения общей стоимости взять две вещи весом 6 кг. Как "надоумить" его чтобы он взял 6 и 6. При этом чтобы алгоритм был "жадным" для нужного быстродействия. p.s. сортировать по суммарной эффективности не получится. Пистолеты сразу выкинут все глушители и магазины, а это не лучшее решение. На самом деле задача из ритейла и немного сложнее, я для удобства привел пример в пистолетах. Если кого заинтересует, расскажу что на самом деле делается. Реализовано в VBA, извините, что многа букаф, уже просто не первый день пытаюсь решить и гуглить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2009, 23:16 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
Вопрощатель, "подойди" сначало к решению задачи с точки зрения математики, потом реализуй алгоритм. Воспользуйся методом Логранжа: позволяет отыскивать максимум или минимум функции при ограничениях - равенствах. Судя по исходным данным задача имеет линейный характер. ps: я не математик, просто кое что знаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 08:05 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
.Михаил.,Спасибо за участие. Мой первый метод и есть аналог метода Лагранжа определенным образом спроецированный на мою задачу. Суть в том, что ограничения, которые имеются у меня и делают задачу нелинейной и методом прямого перебора пытаюсь решить множество линейных задач. Но только как я и писал не помогает - долго для 800 элементов расчет производится. Видимо придется ставить "залепу" в виде проверки у же собранного списка, на предмет лучших элементов по суммарной эффективности. Незнаю к чему это приведет. Возможно опять к тому, что "пистолеты" будут наверху, а более эффективные на единицу массы глушители уползут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 09:21 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
Вопрощатель, хочу продолжить дискуссию вот, вопрос: одиночные предметы и их сочетание дают разную ценность например, ценности (из Вашего примера): пистолет = 10 доп.магазин = 1 глушитель = 1 пистолет + доп.магазин + глушитель = 20 пистолет + доп.магазин = 15 пистолет + глушитель = 12 доп.магазин + глушитель = 1 как посчитать ценность, если будет 2 пистолета , 1 глушитель и 1 доп.магазин , всего 4 вещи ? и т.д. до 800 могут быть результаты: 30, 27, 12 или 11 ... поправьте, где не прав, мож поставленную задачу "плохо" понял... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 10:43 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
.Михаил.,Сочетание предметов дает суммарную ценность за единицу веса пистолет= 10 доп.магазин= 1 глушитель= 1 пистолет+доп.магазин+глушитель= 12 пистолет+доп.магазин= 11 пистолет+глушитель= 11 доп.магазин+глушитель= 2 т.е. все гораздо проще просто если алгоритм мне предложит вот такое решение Пистолет-1 Глушитель для пистолета 1 Доп. магазин для пистолета 1 Глушитель для пистолета 2 Доп. магазин для пистолета 2 это бесполезный набор. А по условию моей задачи он вообще не должен быть возможен. Если иной комбинации нет, он должен подобрать: Пистолет-1 Глушитель для пистолета 1 Доп. магазин для пистолета 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 11:07 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
Вопрощатель...т.е. все гораздо проще просто если алгоритм мне предложит вот такое решение Пистолет-1 Глушитель для пистолета 1 Доп. магазин для пистолета 1 Глушитель для пистолета 2 Доп. магазин для пистолета 2 это бесполезный набор. А по условию моей задачи он вообще не должен быть возможен. Если иной комбинации нет, он должен подобрать: Пистолет-1 Глушитель для пистолета 1 Доп. магазин для пистолета 1 не понял, почему этот набор бесполезный? этот набор имеет некий вес (может даже и в рюкзак влезет) и некую ценность, вот только как ее посчитать? По-моему, для получения "оптимального" решения каждый предмет в отдельности рассматиривать не надо, а рассматривать - "состав предметов" как некий "предмет", который имеет свою ценность суммарную ценность и вес. Можно избавиться от условий, когда "...не все элементы рюкзака имеют ценность самостоятельно...", но добавиться колчество предметов... И вообще, по-моему, решение может быть такое: одинкавое конечное количество пистолетов, глушителей и магазинов + еще что-то (пистолет или пистолет+магазини т.п.) при условии что все влазиет в рюкзак. Не так ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 11:22 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
Каа-то попадалась аксиома что не существует решения задачи о раскрое. Более того, если найдется решение для любой из подобных задач, то найдется и решение для всего класса задач. Но это было лет двадцать назад когда мы пытались сделать задачку по загрузке плавбазы морепродуктами, баластом, водой и прочим стафом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 11:59 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
.Михаил., я же и пояснил, что я попытался решить ситуацию для каждого случая, когда предмет представляет собой комбинацию Т.е. есть у меня Пистолет - 1.. Пистолет - 100 Компонент к пистолету N - 1 ... Компонент к пистолету N - 7 где N = 1..100 итого максимум 800 элементов Я пытаюсь решить задачу для следующих случаев 1. В наборе только - Пистолет - 1.. Пистолет - 100 2. В наборе Комбо1( Пистолет - 1 & Компонент к пистолету 1 - 1)+ Пистолет 2.. Пистолет 100 3. В наборе Комбо1( Пистолет - 1 & Компонент к пистолету 1 - 1 & Компонент к пистолету 1 - 2)+ Пистолет 2.. Пистолет 100 ... i) Комбо 1 - (Пистолет1 & все компоненты к пистолету 1) +...+ Комбо 100 (Пистолет100 & все компоненты к пистолету 100) проблема в том, что i это очень большое число. На один расчет я трачу 0,495 секунды на рабочем двухядернике. Даже для 800 случаев( а случаев гораздо больше, непомню формулу комбинаторики которая производит этот расчет количества комбинаций) расчет продолжается 6 минут. Мой предел 1 минута. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 12:03 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
Dmitry 123Каа-то попадалась аксиома что не существует решения задачи о раскрое. Более того, если найдется решение для любой из подобных задач, то найдется и решение для всего класса задач. Но это было лет двадцать назад когда мы пытались сделать задачку по загрузке плавбазы морепродуктами, баластом, водой и прочим стафом. Сейчас есть сайт где такой расчет можно онлайн бесплатно сделать или купить примочку к 1С или самостоятельную :) Создает даже погрузочный лист (порядок загрузки). Кстати делает весьма недурно, судя по "понтам" на сайте. И по 3D примерам расчетов. На фуру 20 тонную от 30 до 300 секунд тратит. Я натыкался пока искал решение. Если еще интересует могу вечером ссылку дать, на рабочем компе нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 12:09 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
Вопрощатель, на сколько я понял Вы для каждый состав предметов (начиная с самого простого (пистолет) и заканчивая сложным предметом(пистолет+магазин+...), всего 800 вариантов составов) просчитываете суммы массы и ценности для количества составов от 1 до 100 ? и находите "нужный" состав предметов, у которого ценность была бы максимальна, а масса предметов близка к максимальной массе, которую можно было бы поместить в "сумку" ? я Вас правильно понял ? Если, да, то есть несколько соображений как увеличить скорость ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 12:52 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
.Михаил., все верно, только вариантов состава не 800, а гораздо больше. сча порыскаю на википедии повспоминаю комбинаторику ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 13:05 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
Вопрощатель, вглянуть бы на ваш код программы, может можно его оптимизировать? в своей практике часто встречался с "медленноработающим" кодом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 13:17 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
.Михаил., я могу показать код просто у меня там куча всяких вещей которые я здесь не описывал в силу ненадобности и мои 1000 строк кода Вас запутают. Напишите какой именно момент интересует, я распишу как я его реализовывал. Может быть даже выкрою рассчитывающую часть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 13:44 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
Вопрощатель, вот это место мне надо 1. В наборе только - Пистолет - 1.. Пистолет - 100 2. В наборе Комбо1(Пистолет - 1 & Компонент к пистолету 1 - 1)+Пистолет 2.. Пистолет 100 3. В наборе Комбо1(Пистолет - 1 & Компонент к пистолету 1 - 1 & Компонент к пистолету 1 - 2)+Пистолет 2.. Пистолет 100 ... i) Комбо 1 - (Пистолет1 & все компоненты к пистолету 1) +...+ Комбо 100 (Пистолет100 & все компоненты к пистолету 100) + описание всех переменных, которые участвуют пока ограничимся этим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 14:02 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
.Михаил., займет время сча попробую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 14:07 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
Вопрощатель.Михаил., я могу показать код просто у меня там куча всяких вещей которые я здесь не описывал в силу ненадобности и мои 1000 строк кода Вас запутают. Напишите какой именно момент интересует, я распишу как я его реализовывал... Поймите, мне нужен имеено сам код, а не то как Вы его реализовывали. Проблема медленной работе может быть в самом коде, в том как Вы его реализуете, какие используете логические конструкции, какие используете функции и методы... каждое действие затричивает процессорное время. Приведу пример. Необходимо х умножить на 5. Сделать можно двумя способами: х*5 или х+х+х+х+х . Второй способ намного быстрее, потому что на сложение процессор меньше тратит времени, чем на умножение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 14:15 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
.Михаил. Поймите, мне нужен имеено сам код, а не то как Вы его реализовывали. Проблема медленной работе может быть в самом коде, в том как Вы его реализуете, какие используете логические конструкции, какие используете функции и методы... каждое действие затричивает процессорное время. Приведу пример. Необходимо х умножить на 5. Сделать можно двумя способами: х*5 или х+х+х+х+х . Второй способ намного быстрее, потому что на сложение процессор меньше тратит времени, чем на умножение. Понятно. Просто самой этой конструкции у меня уже нет. Я отказался от нее т.к. быстродействие было не утешительным. Реализовал все жадным алгоритмом. А так вся концепция на циклах ForTo и работа с массивами. В общем поищу. В какой то итерации кода у меня еще оставалась эта схема. Концептуальных идей кроме оптимизации кода нет? Просто я на 99% думаю, что само количество вычислений настолько огромно, хотябы 100! если у меня 100 вариантов это уже очень много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 14:34 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
Вопрощатель, пожалуйста, сначало код, а потом продолжим... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 14:51 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
.Михаил., ок. Чуть попозже поищу и выложу. У кого нибудь ещё, будут идеи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 15:01 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
.Михаил.Приведу пример. Необходимо х умножить на 5. Сделать можно двумя способами: х*5 или х+х+х+х+х . Второй способ намного быстрее, потому что на сложение процессор меньше тратит времени, чем на умножение. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ТС: по сабжу идей нет - сорри за оффтоп. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 15:15 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
попробуйте такой вариант 1 этап находите все варианты загрузки от максимальной ( 100 % ) до например 90% без учета стоимости компонент учитывая только вес 2 этап по всем вариантам 1 этапа считаете стоимость с учетом взаимовлияния компонент на стоимость ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 16:37 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
Valerпопробуйте такой вариант 1 этап находите все варианты загрузки от максимальной ( 100 % ) до например 90% без учета стоимости компонент учитывая только вес 2 этап по всем вариантам 1 этапа считаете стоимость с учетом взаимовлияния компонент на стоимость это мысль, надо так попробовать будет только ещё раскурить, но концепция ясна. спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 17:13 |
|
||
|
Задача о рюкзаке с 2мя ограничениями
|
|||
|---|---|---|---|
|
#18+
qwrqwr.Михаил.Приведу пример. Необходимо х умножить на 5. Сделать можно двумя способами: х*5 или х+х+х+х+х . Второй способ намного быстрее, потому что на сложение процессор меньше тратит времени, чем на умножение. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ТС: по сабжу идей нет - сорри за оффтоп. по-моему, чисто субъективный способ замера выполнения кода, а вдруг при выполнении процессор есче что-то делал. Вы пробовали запускать код несколько раз? результат одинаков? может я не прав: может пять раз сложить затратнее для процессора, чем умножить на пять. Попробуйте другое: два раза сложить или умножить на два. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 22:12 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=36365018&tid=2159681]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 141ms |

| 0 / 0 |
