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