Имя: Пароль:
1C
 
Нужен алгоритм подбора суммы.
0 Vovik
 
14.05.07
13:44
Есть ТЗ:

Док1 1000
Док2 15,5
...

Нужен алгоритм набирающий под определенную сумму документы (чем ближе будет сумма тем лучше).
Никто ничего подобного не встречал?
1 Обдолбанный Вася
 
14.05.07
13:45
неа, я сегодня голову освежиться отправил....
2 Конь в пальто
 
14.05.07
13:46
ну блин, считай модуль от разности...
а нах тебе?:
3 Обдолбанный Вася
 
14.05.07
13:47
4 Конь в пальто
 
14.05.07
13:48
ниче так сцылка...
5 xPalych
 
14.05.07
13:52
(0) "Задача упаковки рюкзака". Оно?
6 xPalych
 
14.05.07
13:54
7 Обдолбанный Вася
 
14.05.07
13:57
(4) %) "Проверено - вирусов нет"
+(3) = методы оптимизации
8 Vovik
 
14.05.07
14:06
(2)Модуль от разности?! - че ето значит? Просто нужно перекинуть доки на опр. сумму с одного контрагента на другого
9 Обдолбанный Вася
 
14.05.07
14:12
ТЗ
Сортировать
Перебор
10 Ёпрст2
 
14.05.07
14:15
11 Vovik
 
14.05.07
15:45
Я сегодня не в форме. чисел не много:
6363,01
214105,12
38155,00
2610,00
763146,69
25290,00
36440,00
90510,01
10400,00
83649,08
140845,04
17918,46
388555,66
233882,85
85708,17
12 Vovik
 
14.05.07
15:46
нужно составить как можно ближе 990145,60. Методом тыка я составил число 990261,81. разница - 116,21.
13 Vovik
 
14.05.07
15:49
Если кому интересно, то поможите пожалуйста
14 France
 
14.05.07
15:59
тебе ж уже сказали, куда двигатся, товарищ!!!.. это задача оптимизации..
15 Vovik
 
14.05.07
15:59
(14)Ладно буду вкуриваться:(
16 Программист 484
 
14.05.07
16:01
(15) Блин ну и сделай их в виде цикла
1+2+3+4+5 пока <>10000
1+2+3+4+6 и тд
17 sapphire
 
14.05.07
16:01
мда... ЧМы рулят... Комбинаторика + функции распределения + ЧМы.
18 Vovik
 
14.05.07
16:04
(17)кто такие ЧМы?
19 Vovik
 
14.05.07
16:06
(16)Я даже не могу просчитать сколько потенциально может быть комбинаций. Порядок не принципиален, число слогаемых тоже.
20 корум
 
14.05.07
16:06
(18) Чемпионаты мира (Численные Методы).
(0) ищи в яндексе "NS рюкзак"
21 Программист 484
 
14.05.07
16:07
(19) Рекурсию смотри - когда мало сумм порядка 10 то можно методом перебора взять
22 Vovik
 
14.05.07
17:05
1    2    3    
           
1    12    123    
2    13        
3    23        
           

1    2    3    4
           
1    12    123    1234
2    13    124    
3    14    134    
4    23    234    
   24        
   34            

1    2    3    4    5

1    12    123    1234    12345
2    13    124    1235    
3    14    125    1245    
4    15    134    1345    
5    23    135        
   24    145        
   25            
   34            
   35
23 Vovik
 
14.05.07
17:05
Составил себе табличку с вариациями. Буду теперь думать
24 Ёпрст2
 
14.05.07
17:06
(23) А чего думать то? Алгоритм есть с кодом в (10) посте ....
25 Vovik
 
14.05.07
17:09
Я запарился читать. А тут я вижу уже закономерности для циклов
26 Злопчинский
 
14.05.07
17:27
Спасибо за ссылки.
Вскорости буду писать заполнение палеты не больше заданного объема...
27 Vovik
 
21.05.07
10:16
Я сделал это сам:)))))) Проверяйте. Что скажете про алгоритм?

http://moy1c.narod.ru/Downloads/FindSumm.ert
28 AeDen
 
21.05.07
10:19
Блин... Ты-б еще похвастался своим первым сексуальным опытом...
29 Vovik
 
21.05.07
10:22
(28)Первый сексуальный опыт по сравнению с этим ничего особого
30 Vovik
 
21.05.07
10:23
Алгоритм полностью свой. Ссылки что сдесь смотрел нифига не вкурил
31 Skom
 
21.05.07
10:27
все не читал но вроде что то связаное с транспортнойц задачей...де то встречал на проклабе что ли что то подобное
32 Vovik
 
21.05.07
10:29
ХЗ - транспортную задачу списал в свое время. Выложил в екселе свою закономерность
33 Иде я
 
21.05.07
10:30
Начинай с большей, добивай меньшими
34 Vovik
 
21.05.07
10:31
Вряд ли это мое ноухау. Но вот табличка объясняет алгоритм

1                        
   2                    
       3                
           4            
               5        
                       
   12    13    14    15        
       23    24    25        
           34    35        
               45        
                       
       123    124    125    134    135
           234    235    245    
               345        
                       
           1234    1235    1245    1345
               2345        
                       
               12345
35 Vovik
 
21.05.07
10:33
Сколько чисел столько и обходов. В каждом обходе добавляем оконцовку из предыдущего обхода
36 AeDen
 
21.05.07
10:33
(29) Мне тебя жаль... Искренне жаль...
37 Vovik
 
21.05.07
10:37
(36)Всему свое время. Нельзя все время о сексе да о сексе
38 Vovik
 
21.05.07
14:26
UP.Что никто не хочет обсудить?
39 zxcvb
 
21.05.07
14:30
(38) Нет, что тут обсуждать?
Мне стыдно.:( Но у меня  под сумму, последовательно документы подбираются.
Как набрали - так стоп. Последний документ - юзер сам сам подбирает/удаляет. Может вообще все руками набрать, если ему угодно.
Знаю, что тупо - зато давно работает.:)
40 jcage
 
21.05.07
15:09
(38)
Симплексом пробовал решать?
41 Vovik
 
21.05.07
15:16
(40)Нет. Можно ссылку - как это?
42 Михаил Козлов
 
21.05.07
15:56
1. Симплекс не поможет - всегда разницу будет давать 0 (если сумм документов хватает, чтобы покрыть нужную сумму).
2. Рюкзак ближе, но тоже бесполезен по 2-м причинам: 1) нет ограничения, что сумма не превышает заданной (это можно было бы обойти) 2) схемы неявного перебора (ветвей и границ), которые хорошо работают в рюкзаке не дадут здесь сокращения перебора, т.к. релаксированная задача (можно брать не полностью сумму документа, а часть) всегда будет давать разницу = 0 и отсечения ветвей не получится.
3. Схемы неявного перебора - см п.2.
4. Я бы посоветовал попробовать, как Вы поступали в приведенном примере ("жадный" алгоритм):
- упорядочить суммы по убыванию;
- набрать документы в порядке убывания не превышая сумму. Зафиксировать отклонение как рекорд. Пройтись по документам ниже, вычисляя, что получится, если документ будет включен. При этом, если результат (отклонение от заданной суммы) лучше рекорда, то это текущий рекорд.
43 jcage
 
21.05.07
16:18
(41) Ищи книгу Хемди А. Таха "Теория оптимизации" - на мой взгляд лучше ничего нет.
(42) Предположим имеем
Документ | Переменная | Сумма
-----------------------------
№ 1      | x1         | 1000
№ 2      | x2         | 500
№ 3      | x3         | 600
№ 4      | x4         | 800
№ 5      | x5         | 900

Нужно набрать сумму 2000 или сумму наиболее близкую к этой.
Тогда имеем две подзадачи:
1.
максимизировать 1000*х1 + 500*х2 + 600*х3 + 800*х4 + 900*х5
1000*х1 + 500*х2 + 600*х3 + 800*х4 + 900*х5 <= 2000
При х1..х5 <=1 и х1..х5 - целые
2.
минимизировать 1000*х1 + 500*х2 + 600*х3 + 800*х4 + 900*х5
1000*х1 + 500*х2 + 600*х3 + 800*х4 + 900*х5 >= 2000
При х1..х5 <=1 и х1..х5 - целые

Получается две подзадачи, каждая из которых представляет из себя задачу рюкзака, на которой хорошо работает схема "Ветвей и границ".

Решаем задачи и выбираем наименьшее отклонение.
44 jcage
 
21.05.07
17:33
(43) + И если после первой подзадачи отклонение равно нулю - тогда вторую подзадачу не решаем.
45 Vovik
 
21.05.07
17:38
(44)Обработку можешь сделать?
46 jcage
 
21.05.07
17:42
(45) Мне сейчас некогда. Напомни о себе недели через две-три - я сделаю.
47 jcage
 
21.05.07
17:43
(46) + только ты книгу, которую я в (43) указал почитай, иначе все равно ничего не поймешь.
48 Vovik
 
21.05.07
17:44
(46)Вспомнишь сделай, не вспомнишь пох. Просто я не понял (43)
49 Vovik
 
21.05.07
17:44
(47)Попробую завтра
50 Михаил Козлов
 
21.05.07
17:53
(43) Схема ветвей и границ в этих задачах будет неэффективна, т.к. не будет происходить отсечения "неперспективных" ветвей из-за совпадения коэффициентов ограничения и функционала.
51 Vovik
 
21.05.07
17:54
(50)Ничего не понял, но звучит убедительно
52 jcage
 
21.05.07
18:05
(50) А можно поподробнее с этого момента. Почему при совпадении коэффициентов не будет происходить отсечение неперспективных ветвей?
53 Михаил Козлов
 
21.05.07
18:17
Как правило, для оценки "перспективности" ветвления используют задачу линейного программирования, т.е. снимают условия целочисленности (релаксация для краткости). В вашем случае решение релаксированной задачи всегда (почти) будет давать отклонение = 0 из-за того, что всегда есть возможность добавить часть суммы документа до заданной суммы. Т.е. нельзя будет отсечь никакую ветвь путем сравнения уже имеющегося рекорда с оценкой, полученной в релаксированной задаче.
54 jcage
 
21.05.07
18:21
(53) Это справедливо для задач, где есть дополнительные условия? Например для такой:

максимизировать 1000*х1 + 500*х2 + 600*х3 + 800*х4 + 900*х5
1000*х1 + 500*х2 + 600*х3 + 800*х4 + 900*х5 <= 2000
х1 + х5 = 1
х2 + х4 = 1

При х1..х5 <=1 и х1..х5 - целые
55 Михаил Козлов
 
21.05.07
18:27
Вот пример задачи о ранце, где схема ветвей и границ не дает сокращения перебора.
X1+X2+...+Xn <= n/2+0.1
X1+X2+...+Xn -> MAX
Релаксированные задачи будут давать оценку (сверху) =  n/2+0.1, а рекорд - n/2.
Поэтому схема ветвей и границ переберет не менее С(n, n/2) (число сочетаний из n по n/2) решений. А это много (2^n/SQRT(2*Pi*n)).
56 Михаил Козлов
 
21.05.07
18:30
(54) И для такой задачи - тоже: x5 и x4 можно просто исключить.
Грубо говоря, схема ветвей и границ в задаче о ранце эффективна, когда векторы ограничений и функционала неколлинеарны.
57 Михаил Козлов
 
22.05.07
10:31
Напоследок: может пригодится такой подход.
Пусть есть линейная форма (A,X) = A1*X1+...An*Xn, Xi={0,1}
Расмотрим функцию: F(X) = (1+X1^A1)*(1+X2^A2)+...+(1+Xn^An).
Функция F(X) - производящая для числа решений уравнения (A,X)=b, т.е. если F(X) привести к нормальному виду - раскрыть скобки и привести подобные члены, т.е. к виду F(X) = СУММА(Cb*X^b), то Cb - число решений уравнения (A,X)=b. Например, для линейной формы X1+...Xn производящая функция = (1+X)^n и это полином с биномиальными коэффициентами. Для обсуждаемой задачи использование производящей функции может быть эффективнее перебора, если разных значений сумм документов значительно меньше 2^n. Получив производящуб функцию в нормальном виде и упорядочив ее коэффициенты легко найдем нужное решение - это
коэффициенты, соседние с требуемой суммой.
Собственно решение можно получить обратным ходом.