![]() |
|
|
![]()
|
|
| Kurt |
|
|||
|
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: нет Всего: 36 |
Допустим, есть n-ое (n - может быть большим, скажем, около 1000) количество одинаковых по длинне досок.
Далее есть последовательность длин мелких досок, к-е нужно получить из больших. Нужно найти такое правило распила для каждой из больших досок, чтобы остаток, мусор, обрубки от распила были минимизированны. Ну, для примера, задачу можно сформулировать так: есть две большие доски по 8 метров каждая. есть такая последовательность кусочков, к-е нужно получить: 4, 2, 3, 2, 3 (заметим, что длины могут повторяться!). Решением этой задачи будет такой распил: первую доску распилить на 4, 2, 2. А вторую на 3 и 3. (плюс остаток) Может, есть готовые решения? З.Ы. Задачка не является заданием в школу, университет и т.п... -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
| podval |
|
|||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 18 Всего: 62 |
Формулируй задачу линейного целочисленного программирования
( SUMi (Li) - SUMi SUMj ( Kij*lj ) ) -> min, или учитывая, что все Li = L ( n*L - SUMi SUMj ( Kij*lj ) ) -> min, где n - количество досок, L - их длина, Kij - количество заготовок j-го типа в i-й доске - понятно, что это матрица? lj - длина заготовки j-го типа, SUMi - сумма по i, SUMj - сумма по j, с ограничениями: SUMi (Kij) <= Mj - для всех j - ограничение на количество заготовок каждого типа, SUMj (Kij*lj) <= Li - для всех i - это ограничение вводится, чтобы не вылетать за границу отдельной доски. Осталось правильно раскидать значения длин заготовок по таблице (матрице) Kij |
|||
|
||||
| yaja |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 30.3.2005 Где: Санкт-Петербург Репутация: нет Всего: 1 |
podval
что-то я не понял, что ты имел в виду. можешь расписать поподробнее pls имхо, задачу можно решать жадным алгоритмом. т.е. отсортируем доски по длинне и начнем их пилить на куски с минимальным остатком, начиная с самой большой доски. Кажись всегда остаток будет минимизирован Это сообщение отредактировал(а) yaja - 21.6.2005, 22:58 |
|||
|
||||
| Kurt |
|
|||
|
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: нет Всего: 36 |
yaja
Собственно, это первый вариант, что пришел мне в голову.. -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
yaja
Не так все очевидно. Если на доску максим. размера влазит не больше одной макс. заготовки, то так и будет. А если на доску влазит 2-3 макс. заготовки? Как лучше: выпилить из доски например, 2 макс. заготовки, а из остатка - более мелкие, или: из каждой доски выпиливать только по одной максимальной, а из остатков - мелкие. Тут все-таки нужно ЛП или ДП. Интересная задача. Я когда ремонт делал, тоже пытался по-научному подойти. Да на глаз оказалось быстрее |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Типичная задача заполнения рюкзака.
Не стыдно? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| yaja |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 30.3.2005 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Ну да, типичная Меня смущает то, что рюкзаков(досок) сдесь много |
|||
|
||||
| poor_yorik |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 12.1.2005 Где: Общаги г. Киева Репутация: 3 Всего: 8 |
Akina тут как раз задача рюкзака не подходит, это ближе к задаче о камнях и двух кучах, но тоже не то.
Получается, чтобы хранить остатки на каждой доске как в задаче с рюкзаком, мы еще и должны хранить, какую доску из какой большой мы спилили, а это занимает очень много памяти. Похоже на NP-полную задачу, поэтому сработает по-моему только перебор. --------------------
Семь раз отмерь, один раз - откомпиль.... Семь раз отпей, один раз - отлей... Семь раз отъешь, один раз - не жадничай и другим дай... |
|||
|
||||
| podval |
|
||||||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 18 Всего: 62 |
Так и есть.
Именно!
Я нарисовал постановку задачи в рамках ЦЛП. Только немного коряво, торопился. Я поправил свой первый пост. |
||||||
|
|||||||
| yaja |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 30.3.2005 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Вопрос немного не в тему. Я правильно понимаю ЛП - линейное программирование. ДН - динамическое программирование.
Добавлено @ 20:46 Вопрос немного не в тему. Я правильно понимаю ЛП - линейное программирование. ДН - динамическое программирование. Имхо совсем не очевидно, что эта задача np-полная, а если это так, то как это объяснить?
Понял |
|||
|
||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
poor_yorik
Замени доску определенной длины на рюкзак определенного объема, длины кусков на объем упаковываемых предметов - и перед тобой задача о рюкзаке. не забывай, класическая задача о рюкзаке включает произвольный набор рюкзаков различного (но известного) объема и произвольный набор предметов также произвольного известного объема. один рюкзак - всего лишь частный случай.
классическое решение НЕ ТРЕБУЕТ хранения остатков. Хотя бы потому что первый шаг решения - сортировка рюкзаков и предметов по размеру (по отдельности есссно)...
Мало того что она НЕ NP-полная, так она еще и решается ЗА ОДИН ПРОХОД. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| Alex101 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: 1 Всего: 10 |
Немного непонятны требования. Почему будет считаться хуже такое решение: Первую на 4 и 3 Вторую на 2+2+3 ? Остаток и в твоем решении и в этом одинаковый (2). Это сообщение отредактировал(а) Alex101 - 23.6.2005, 19:46 -------------------- С уважением, А. Фролов. |
|||
|
||||
| podval |
|
|||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 18 Всего: 62 |
Нормальная ситуация. Оптимизационная задача может иметь несколько решений. А может вообще не иметь. |
|||
|
||||
| Alex101 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: 1 Всего: 10 |
Да не, это я затормозил (вчера на работе запарился) суммарный остаток всегда будет одинаковым. Надо, видимо, чтобы меньше кусков было. Перебор, естественно, с отсечением ветвей. Задача ведь не какой длины доски выбрать, а уколбасить в имеющиеся, чтобы кол-во оставшихся кусочков минимальным было. Добавлено @ 13:30
Любопытно было бы взглянуть на решение. Честно говоря, сильно сомневаюсь, что возможно, но вдруг удивлюсь? -------------------- С уважением, А. Фролов. |
||||
|
|||||
| poor_yorik |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 12.1.2005 Где: Общаги г. Киева Репутация: 3 Всего: 8 |
ДАААААА я решил єту задачу Динпрогом.
Просто я не совсем так понял условие, и задача вышла намного сложнее. Вот код моего решения
Я просто не посмотрел внимательно на пример... --------------------
Семь раз отмерь, один раз - откомпиль.... Семь раз отпей, один раз - отлей... Семь раз отъешь, один раз - не жадничай и другим дай... |
|||
|
||||
| yaja |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 30.3.2005 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Если я правильно понял код (согласно которому решается некоторая другая, похожая на эту, задача и интересно, как ты определил, что она(твоя прога) работает правильно??? Это сообщение отредактировал(а) yaja - 28.6.2005, 14:30 |
|||
|
||||
| poor_yorik |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 12.1.2005 Где: Общаги г. Киева Репутация: 3 Всего: 8 |
Смотри yaja!
Во первых, я оттестировал свою прогу на все 100. И Для всех мерзких случаев, которые сам придумал. Ты не будешь спорить, что если бы у нас была одна доска, то задача была бы почти-что такая же как задача про рюкзак. В принципе она больше похожа на задачу про камни, если ты знаешь, но с одним большим отличием: у нас количество маленьких досок одного типа, на которые мы можем рубить большие НЕОГРАНИЧЕНО. Я это сам вначале не заметил. То есть если, у нас две большие доски длинной 5 и 7. И набор длин 2, 3, 4. То оптимальное решение [2, 3] и [3, 4]. Ответ остаток 0. Так вот у меня задача динпрогом находит ответ (остаток) для всех досок длинами от 0 до Lmax, где Lmax - длина наибольшей из даных досок. А потом она уже сумирует остатки нужных мне досок так и получает сумарный результат. Советую тебе посмотреть что-нибудь по ДинПрогу, а особенно о задаче про рюкзак. --------------------
Семь раз отмерь, один раз - откомпиль.... Семь раз отпей, один раз - отлей... Семь раз отъешь, один раз - не жадничай и другим дай... |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |