|
Подскажите алгоритм. | ☑ | ||
---|---|---|---|---|
0
Draziw
20.09.11
✎
15:06
|
Пример.
Есть упаковки по 5,7,9 кг. надо заказать 23 кг, набирать можно только заданными упаковками. как определить оптимальное сочетание коробок, чтобы набрать наименьшее значение больше или равное 23. соответственно значение коробок в зависимости от номенклатуры будет произвольно меняться. помню когда учился нам прям на теории оптимизации типовые алгоритмы поиска оптимальных значений, рассказывали, но я уже даже названий их не помню и хз как искать. |
|||
1
Сергей Д
20.09.11
✎
15:07
|
Наименьшее количество, думаю, всегда будет коробками с наибольшим весом.
|
|||
2
aleks-id
20.09.11
✎
15:08
|
||||
3
Ткачев
20.09.11
✎
15:09
|
Вы программно давайте, а не теоретически.
|
|||
4
Draziw
20.09.11
✎
15:09
|
нет, смотри пример, заказать надо 10 кг, коробки 5 и 7,
если отталкиваться от наибольшей, то если я сначала закажу 7, мне не хватит еще 3 кг, и надо будет заказывать 5. оптимально выбрать 2 коробки по 5 кг. |
|||
5
Alex S D
20.09.11
✎
15:10
|
ост(ост(23/9)/7)/5)
|
|||
6
vmv
20.09.11
✎
15:10
|
заюзай Анализ данных
в СП все есть, нужно чутка мозга еще и все |
|||
7
catena
20.09.11
✎
15:10
|
Задача о ранце.
|
|||
8
Draziw
20.09.11
✎
15:11
|
мне программно как раз не надо, мне теория нужна. спасибо.
|
|||
9
Mikeware
20.09.11
✎
15:12
|
(0) 1986?
|
|||
10
Ткачев
20.09.11
✎
15:12
|
(8)Ну как программно сделаешь, пиши, мне это очень интересно.
|
|||
11
Wobland
20.09.11
✎
15:13
|
кто тут всё про задачу о ранце? в ней вес и объём, а тут только вес
|
|||
12
aleks-id
20.09.11
✎
15:15
|
(11) садись, два.
Задача о ранце (рюкзаке) — одна из задач комбинаторной оптимизации. Название это получила от максимизационной задачи укладки как можно большего числа нужных вещей в рюкзак при условии, что общий объём (или вес) всех предметов, способных поместиться в рюкзак, ограничен. |
|||
13
Жан Пердежон
20.09.11
✎
15:17
|
(12) ну буква в букву же совпадает )))
|
|||
14
Ткачев
20.09.11
✎
15:17
|
+(12)Минимум 20 кг., максимум 23 кг., по примеру (0).
У меня это получилось, только медленно работает. |
|||
15
aleks-id
20.09.11
✎
15:18
|
(13) >> при условии, что общий объём (или вес)
|
|||
16
Draziw
20.09.11
✎
15:21
|
не совпадает, максмальное количество вещей не нужно. количество вещей не так уж значимо, значимо чтобы было набрано минимально возможное количество кг больше или равное заданному.
у меня не хватит мозгов чтобы адаптировать задачу о ранце к данному случаю. |
|||
17
Ц_У
20.09.11
✎
15:23
|
берем 23 ищем остаток от деления на 9 (самый максимальный объем) если остаток равен любому из предыдущих, то финиш иначе ищем остаток от деления на следующий объем и т.д. до решения
|
|||
18
Ц_У
20.09.11
✎
15:23
|
(17) любому из последующих точнее... 7, 5...
|
|||
19
Ткачев
20.09.11
✎
15:24
|
||||
20
Draziw
22.09.11
✎
10:07
|
У меня получилось :)
ТаблицаУпаковок.Колонки.Добавить("Единица"); ТаблицаУпаковок.Колонки.Добавить("Коэффициент"); ТаблицаУпаковок.Колонки.Добавить("Требуется"); ТаблицаУпаковок.Сортировать("Коэффициент Убыв"); МинимальнаяУпаковка=ТаблицаУпаковок[ТаблицаУпаковок.Количество()-1].Коэффициент; Для УменьшениеКоличества=0 по МинимальнаяУпаковка цикл Для Кнедобора=0 по 3 цикл АлгоритмПоискаРешения(Кнедобора,Количество-УменьшениеКоличества); Если ТаблицаУпаковок.Итог("Требуется")>0 тогда прервать;//решение найдено КонецЕсли; КонецЦикла; КонецЦикла; //Недобрать - величина на сколько можно уменьшать целочисленный остаток максимальной величины //например есть коробки 10 и 6, надо набрать 112, если изначально брать остаток по 10, то получим 10*11=110, и 2 остатка //величина Недобрать - берет 10*(11-Недобрать), при недобрать=1 получим, 10*10, в остатке 12, их мы пробуем подобрать по оставшимся упаковкам //Если нам надо подобрать 113, мы в верху в цикле подбираем сначала 113, ненаходим целых - уменьшаем на 1 искомую величину и опять пытаемся подобрать по целым //количество таких уменьшений, будет в пределах величины минимальной коробки //т.е. по сути мы всегда ищем варианты целых упаковок, просто варьируем подбираемую величину. Процедура АлгоритмПоискаРешения(Недобрать,ПодбираемаяВеличина) Если ТаблицаУпаковок.Итог("Требуется")>0 тогда возврат; КонецЕсли; //решение уже найдено, не требуется дополнительный поиск ТаблицаУпаковок.Сортировать("Коэффициент Убыв"); //первый проход, ищем варианты целого, приоритет у максимальных упаковок Для каждого СтрокаТУ из ТаблицаУпаковок цикл //в первом проходе ищем решение, только в том случае если макс упаковки не превышают текущую в 2 раза. Если ПодбираемаяВеличина>ТаблицаУпаковок[0].Коэффициент*2 тогда Если (ТаблицаУпаковок[0].Коэффициент/СтрокаТу.Коэффициент>2.1) тогда прервать; КонецЕсли; КонецЕсли; Если СтрокаТУ.Коэффициент*(Недобрать+1)>ПодбираемаяВеличина тогда продолжить;КонецЕсли;// учитываем возможность отступа,как минимум на 1 величину ЦелыхЧастей=цел(ПодбираемаяВеличина/СтрокаТу.Коэффициент)-Недобрать; Остаток=ПодбираемаяВеличина-ЦелыхЧастей*СтрокаТу.Коэффициент; Если Остаток=0 тогда Для каждого СтрокаРешения из ТаблицаУпаковок Цикл Если СтрокаРешения<>СтрокаТУ тогда СтрокаРешения.Требуется=0; Иначе СтрокаРешения.Требуется=ЦелыхЧастей; КонецЕсли; КонецЦикла; возврат; КонецЕсли; Для каждого СтрокаТУ2 из ТаблицаУпаковок цикл Если СтрокаТУ2.коэффициент>=СтрокаТУ.Коэффициент тогда продолжить; КонецЕсли; ЦелыхЧастейОстатка2=цел(Остаток/СтрокаТу2.Коэффициент); Остаток2=Остаток-ЦелыхЧастейОстатка2*СтрокаТу2.Коэффициент; Если Остаток2=0 тогда Для каждого СтрокаРешения из ТаблицаУпаковок Цикл Если СтрокаРешения<>СтрокаТУ и СтрокаРешения<>СтрокаТУ2 тогда СтрокаРешения.Требуется=0; ИначеЕсли СтрокаРешения=СтрокаТУ тогда СтрокаРешения.Требуется=ЦелыхЧастей; ИначеЕсли СтрокаРешения=СтрокаТУ2 тогда СтрокаРешения.Требуется=ЦелыхЧастейОстатка2; КонецЕсли; КонецЦикла; возврат; КонецЕсли; Для каждого СтрокаТУ3 из ТаблицаУпаковок Цикл Если СтрокаТУ3.коэффициент>=СтрокаТУ2.Коэффициент тогда продолжить; КонецЕсли; ЦелыхЧастейОстатка3=цел(Остаток2/СтрокаТу3.Коэффициент); Остаток3=Остаток2-ЦелыхЧастейОстатка3*СтрокаТу3.Коэффициент; Если Остаток3=0 тогда Для каждого СтрокаРешения из ТаблицаУпаковок Цикл Если СтрокаРешения<>СтрокаТУ и СтрокаРешения<>СтрокаТУ2 и СтрокаРешения<>СтрокаТУ3 тогда СтрокаРешения.Требуется=0; ИначеЕсли СтрокаРешения=СтрокаТУ тогда СтрокаРешения.Требуется=ЦелыхЧастей; ИначеЕсли СтрокаРешения=СтрокаТУ2 тогда СтрокаРешения.Требуется=ЦелыхЧастейОстатка2; ИначеЕсли СтрокаРешения=СтрокаТУ3 тогда СтрокаРешения.Требуется=ЦелыхЧастейОстатка3; КонецЕсли; КонецЦикла; возврат; КонецЕсли; КонецЦикла; КонецЦикла; КонецЦикла; КонецПроцедуры |
|||
21
Draziw
22.09.11
✎
10:09
|
ах да, вы не смотрите там что ТаблицаУпаковок задает колонки вначале, я это просто привел чтоб была понятна структура табилцыЗначений, она уже собранная должна приходить к нижележащему коду.
|
|||
22
Axel2009
22.09.11
✎
10:11
|
а если надо набрать 114?
|
|||
23
Draziw
22.09.11
✎
10:31
|
там все подбирается любая величина любыми упаковками, я просто пример на писал, чтобы логика работы была понятна.
|
|||
24
Draziw
22.09.11
✎
10:33
|
(22) 114, подобрал алгоритм, как 9 по 10 и 4 по 6.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |