|
|
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
День добрый всем! Есть регистр накопления остатков . Денные: Номенклатура, партия, сумма, количество. Необходимо для некой СУММЫ +/- Дельта подобрать всевозможные варианты комбинаций любых номенклатур, чтобы итог по сумме вписывался в эту СУММА +/- Дельта. Причем сумму можно делить в соответствии с имеющимся количеством: (например, сумма=100 по 5 шт. - можно взять 2 = 40). Варианты сортировать по возр. кол-ва составляющих записей. Как я понимаю, лучше это сделать запросом. Заранее благодарен! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2009, 17:05 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
ditochодобрать всевозможные варианты комбинаций любых номенклатур делайте. только не советую запросом. сервер умрет. для спящего время бодрствования равносильно сну ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2009, 19:24 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
Здравсвуйте, Интересно как эту задачу запросом решить? В голову приходит лиш: тупо в цикле перебирать итоги по остаткам ном-ры пока не набреш искомую сумму. Если я конечно правильно задачу понял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2009, 20:42 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
почему то вспоминается задача о комовояжере .... на такой задаче если ее решать в лоб не только запрос зависнет ... тут надо отбрасывать заведомо не верные решения, сокращая число вариантов перебора ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2009, 08:54 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
Алексей2003, Странно, но мне руководитель почему-то натоятельно советует делать запросом... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2009, 09:39 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
ditochАлексей2003, Странно, но мне руководитель почему-то натоятельно советует делать запросом... и кто же у вас руководитель? математик? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2009, 10:28 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
Кстати, именно такого рода задачи подсовывают юным математикам-будущим программистам, когда они изучают тему "рекурсивные алгоритмы". И алгоритм в этом случае весьма просто выглядит - над таблицей остатков-цен, которую выдаст запрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2009, 10:36 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
pail, А можно, пожалуйста, поподробнее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2009, 10:59 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
Алексей2003, Сейчас - Руководитель группы по внедрению систем (1С) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2009, 11:32 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
вот есть 32 строки номенклатуры, по которым можно рассчитать сумму. каждая номенклатура стоит от 10 до 20 попугаев. нужно набрать на 250 попугаев. сколько вариантов любых комбинаций номенклатур может быть? вот так вот без запроса может накидать ваш руководитель? для спящего время бодрствования равносильно сну ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2009, 12:38 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
Алексей2003, Я не являюсь сторонником "запроса". Хотелось узнать мнение других - проянить для себя. Мне просто нужно решить эту задачу. Вот и обратился за помощью. Пока в голову пришла лишь одна идея, но она мне не совсем нравиться: в запросе выбрать все номенклатуры (табл1) и для каждой левым соединением прикрепить все записи (табл2), у которых табл1.Сумма + табл2.цена <= ЗаданныйПредел. Дальше тупо перебирать таблицу в цикле, как здесь: http://www.intuit.ru/department/pl/plpascal/9/4.html (пунк "Иллюстрация"). Какие-то идеи?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2009, 09:38 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
pail, Если алгоритм такой "простой", хотя бы намекните, где посмотреть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2009, 10:45 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
ditoch, идея никак не сочетается с разным количеством разного товара, да и вряд ли нужен весь набор вариантов (он может быть бесконечным), а скорее всего 1 оптимальный вариант по какому-то критерию; если так, то ищи в гуглеяндексе задачу о рюкзаке; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2009, 15:25 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
таки задачу математик ставил... набери чего нибудь на такую-то сумму для чего вообще оно понадобилось ? забить "отфанаря" товарами торг. точку на определённый лимит ? кто так бизнес ведет или задачу ставит ? единственное практическое применение я вижу только в следующем и вам потребуется для начала сходить сюда а затем уже думайте как орагнизовать обновление категоризаций... добавить ТОП-ы, эксклюзив, брендовую представленность если необходимо... затем логистику если получится и т.д. а тупо перебрать конечное количество во превых зачем а во вторых факториал для 5ти значных цифер (средняя представленность номенклатуры в большинстве торг. точек-маленьких сетей) это очень много и толку от того что запросом на неделю положите сервак (тот что в мск-хату стоит ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2009, 15:52 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
вот жеж человек то. вы бы хоть на бамажке попробовали набросать алгоритм, а потом думали как его реализовать. а вы наоборот начинаете. 2 случая: вот надо набрать на 250 попугаев +/- 25 попугаев (от 225 до 275) Код: plaintext 1. 2. 3. 4. или следующий Код: plaintext 1. 2. для спящего время бодрствования равносильно сну ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2009, 17:26 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
leafпочему то вспоминается задача о комовояжере .... на такой задаче если ее решать в лоб не только запрос зависнет ... тут надо отбрасывать заведомо не верные решения, сокращая число вариантов перебора+1 Как задача комивояжера, так и эта решается методом ветвей и границ . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 12:05 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
ditochСтранно, но мне руководитель почему-то натоятельно советует делать запросом...Это комбинаторный алгоритм, а не метод реляционной алгебры. Причем, алгоритм РЕКУРРЕНТНЫЙ (использующий рекурсию). Обычным SQL-запросом его врядли удастся реализовать. Можно, конечно, написать хранимую процедуру... Но на рекуррентный вызов хранимых процедур на SQL-сервере наложены довольно жесткие ограничения, чтобы такое решение можно было бы рассматривать как работоспособное. Можно, конечно, попробовать преобразовать рекурсивный алгоритм в линейный циклический с реализаций "самопального" стека на неких вспомогательных таблицах. Но самый простой и очевидный метод - использовать рекурсивную процедуру 1С, вызывающую саму себя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 12:13 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
Вот только когда товаров много (а их всегда много) и памяти не хватит и рекурсия загнется... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 12:31 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
ditochКакие-то идеи?...Используется алгоритм рекурсивного "раскрашивания дерева" с отбрасыванием по дороге заведомо негодных ветвей (метод ветвей и границ). При прохождении узла дерева с родительского уровня принимается множество коменклатур с количеством, формирующее промежуточное значение суммы ниже нижней границы заданного диапазона сумм. В каждом узле в двух циклах, вложенных друг в друга, производится попытка добавить еще один элемент в ранее сформированное множество. Один из циклов перебирает количество от 1 до имеющегося в наличии (поскольку речь идет о штуках), второй цикл делает попытку добавить еще одну номенклатуру. Какой из этих циклов в какой вкладывать - это уже дело хозяйское. Идея в том, что на каждом шаге рекурсии производится попытка добавить ровно 1 штуку - либо того, что уже имеется в множестве номенклатуры, либо того, что в нем пока еще не имеется (этим и занимаются два вложенных цикла). Если добавление еще одной штуки приводит к выходу за пределы верхней границы заданного диапазона суммы, то дальнейшее "раскрашивание дерева" прерывается с возвратом результата "уперлись в границу" (не прокатывает). Так отрабатывает метод ветвей и границ, предотвращая перебор большого количества заведомо бессмысленных комбинаций. Если добавление еще одной штуки приводит к получению итоговой суммы ниже нижнего диапазона, то процедура вызывает саму себя в попытке добавить еще одну штуку к уже увеличенному множеству. Если добавление еще одной штуки приводит к попаданию в диапазон, возвращается результат "решение найдено!", и дальнейший перебор вариантов прерывается. Не смотря на то, что решений может быть множество, алгоритм прерывает работу при нахождении первого же из них. Если раскрашено всё дерево возможных вариантов, а решение не найдено, возвращается результат "решения нет!". Обращаю внимание, что множество номенклатуры должно быть позиционно-независимым. То есть, множество номенклатур {2,3,5} = {3,2,5} = {5,2,3} = {5,3,2}. Они должны рассматриваться как одно и то же множество, и рассматриваться только один раз. Для того, чтобы реализовать позиционно-независимое множество, на каждом шаге рекурсии необходимо оперировать со упорядоченным множеством. Например, если мы отсортируем идентификаторы номенклатуры в порядке возрастания, и договоримся о том, что в множестве идентификаторы обязательно должны быть упорядочены по возрастанию, то любое из 4-х вариантов этих множеств будет приведено к одному-единственному {2,3,5}. И попадать в дальнейшую обработку (раскраску дерева) множества должны только после упорядочивания, исходя из концепции позиционной независимости. Примерно так. Более детально - это уже нужно садиться и писать. Данный алгоритм, конечно, требует некоторого опыта написания рекуррентных процедур. Потренируйтесь, для начала, на рекуррентной формуле N факториала: Для N<0 результат="ошибка"; Для N<2 результат=1 Для остальных случаев N!=(N-1)!*N. Самое главное в рекуррентых алгоритмах - добиться пошагового понимания, как они работают. Не забыть вставить где требуется условие выхода из рекурсии (иначе получится бесконечная рекурсия), не забыть сделать рекурсивный вызов для всех случаев, где он необходим (чтобы не "улететь мимо" части раскрашиваемого дерева комбинаций), не забыть обработать все варианты ответа от вызываемой процедуры в вызывающей, которые могут влиять на ход рекурсии. Успехов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 13:09 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
Программист 1сВот только когда товаров много (а их всегда много) и памяти не хватит и рекурсия загнется...Сомневаюсь, что для таких задач существует алгоритм, более оптимальный, нежели рекурсивный. Другое дело, что рекурсивный алгоритм может быть преобразован в циклический, если в нем самому реализовать некоторый эмулятор стека. В роли такого эмулятора может выступать массив, таблица, или что-то еще, в которой сохраняются параметры рекурсивного вызова и сообщается следующему шагу цикла, на каком уровне рекурсии мы находимся (типа "указатель стека"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 13:13 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
2Garya найти первый вариант - не самая сложная. обычно необходимо найти наиболее "оптимальный", заданный по каким либо нескольким критериям (продать как можно больше, и при этом сумма +/- дельта). и тогда эта задача уже переходит в задачу прохождения всей рекурсии. и все загнется. естественно если задачу решить нужно, то ее нужно решать, но оценить сколько она займет по времени выполнения.. не всегда реально. и оператор будет тупо сидеть и ждать, когда же это произойдет. для спящего время бодрствования равносильно сну ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 14:01 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
GaryaПрограммист 1сВот только когда товаров много (а их всегда много) и памяти не хватит и рекурсия загнется...Сомневаюсь, что для таких задач существует алгоритм, более оптимальный, нежели рекурсивный. Другое дело, что рекурсивный алгоритм может быть преобразован в циклический, если в нем самому реализовать некоторый эмулятор стека. В роли такого эмулятора может выступать массив, таблица, или что-то еще, в которой сохраняются параметры рекурсивного вызова и сообщается следующему шагу цикла, на каком уровне рекурсии мы находимся (типа "указатель стека").Да я и не говорю рекурсия плохо. Просто в реальной ситуации обычно например пользователь СНАЧАЛА указывает несколько товаров и просит найти максимум свзяку из 3 недостающих товаров по сумме. А вот тут уже можно и перебором. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 15:15 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
ушли в рекурсии и т.д... как страшен мир когда кодеры только из математиков вырастают вот объясните мне практическое применение "тупого" перебора (любым из алгоритмов хоть рекурсиями хоть циклами хоть по рандомайзу) а ? (даже подарочные наборы в детский сад сформировать не получится) разве что курсовой по матмоделированию написать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 16:53 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
познать рекурсию можно только познав рекурсию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 17:25 |
|
||
|
Алгоритм "набора" суммы
|
|||
|---|---|---|---|
|
#18+
Last1Cmenушли в рекурсии и т.д... как страшен мир когда кодеры только из математиков вырастают вот объясните мне практическое применение "тупого" перебора (любым из алгоритмов хоть рекурсиями хоть циклами хоть по рандомайзу) а ? (даже подарочные наборы в детский сад сформировать не получится) разве что курсовой по матмоделированию написать :)А как вы все ветви дерева без рекурсии обойдете? Вобщето это спрашивают на проф экзамене... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2009, 01:03 |
|
||
|
|

start [/forum/topic.php?fid=28&msg=36378923&tid=1522893]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
173ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 473ms |

| 0 / 0 |
