|   |   | 
| 
 | Подскажите алгоритм. | ☑ | ||
|---|---|---|---|---|
| 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.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |