Имя: Пароль:
1C
1С v8
Подскажите алгоритм.
,
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.