Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / применение задачи о рюкзаке ( ранце) / 14 сообщений из 14, страница 1 из 1
05.05.2004, 11:31
    #32507077
Valer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
применение задачи о рюкзаке ( ранце)
подскажите, кто знает практические задачи ,
которые сводятся к задаче о рюкзаке
...
Рейтинг: 0 / 0
05.05.2004, 11:49
    #32507122
Александр Спелицин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
применение задачи о рюкзаке ( ранце)
А что такое "Задача о рюкзаке"?
...
Рейтинг: 0 / 0
05.05.2004, 12:16
    #32507186
Valer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
применение задачи о рюкзаке ( ранце)
есть n целых чисел m1, m2, m3 ... mn
и число r - емкость рюкзака
надо найти комбинацию bi i =1..n
( bi =0 не кладем в
рюкзак ; bi= 1 кладем в рюкзак )
так чтобы r = сумма( mi * bi )

всего вариантов перебора 2 ^ n
...
Рейтинг: 0 / 0
05.05.2004, 19:07
    #32508053
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
применение задачи о рюкзаке ( ранце)
правильно ли я понял что не для любого набора М есть решение для любого Р?
...
Рейтинг: 0 / 0
06.05.2004, 02:24
    #32508292
mikhail_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
применение задачи о рюкзаке ( ранце)
Конешно правильно:

m1 = 1
m2 = 2
m3 = 7

P = 4
...
Рейтинг: 0 / 0
06.05.2004, 06:34
    #32508327
Павел Воронцов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
применение задачи о рюкзаке ( ранце)
Вот например
...
Рейтинг: 0 / 0
06.05.2004, 22:53
    #32509910
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
применение задачи о рюкзаке ( ранце)
Например, в криптографии.
...
Рейтинг: 0 / 0
11.05.2004, 02:58
    #32512447
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
применение задачи о рюкзаке ( ранце)
при решении минимаксных задач она может применяться.
я когдато высчитывал за какими самолетами должна следить рлс, что бы был минимальный ущерб от остальных пропущенных целей.

к каждой цели приписывалось число - потенциальный ущерб, который она может нанести. а рюкзак в которую кладут числа, это рлс, которая за ними следит.

хотя у меня емкость рюкзака (сколько отметок может сопровождать рлс)мерялась количеством сопровождаемых целей, както удалось использовать.
решается все равно методом ветвей и границ - читай перебор.
...
Рейтинг: 0 / 0
11.05.2004, 04:06
    #32512461
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
применение задачи о рюкзаке ( ранце)
я когдато высчитывал за какими самолетами должна следить рлс
а подписку не давал? смотри, измена родине - это не шутки :-)
...
Рейтинг: 0 / 0
11.05.2004, 17:37
    #32513631
Дмитрий Валуев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
применение задачи о рюкзаке ( ранце)
В широком смысле задача о рюкзаке представляет собой одну из разновидностей задачи максимизации эффекта при ограничении на затраты. Наверняка можно найти примеры из области экономики.
Для решения задачи о рюкзаке применяется не только метод ветвей и границ. Известны и более эффективные методы именно для этого класса задач.
Вот пример решения одной из разновидностей задачи о рюкзаке на T-SQL применительно к проблеме поиска расхождений в бухгалтерском балансе.
...
Рейтинг: 0 / 0
12.05.2004, 01:21
    #32514062
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
применение задачи о рюкзаке ( ранце)
2 alex_k когда мне ее ставили, она не так формулировалась, но завеса секретности
была не очень сильная.

2 Дмитрий Валуев.
да. есть другие методы.
программисты до меня ее решали методом градиентного спуска,
причем не в целых числах, а в вещественных.
типа получали решение в 3.62 самолета одного типа, 4.12 самолетов второго типа и так далее.
потом округляли силовым решением.
я на это посмотрел, и решил ветвями и границами.
...
Рейтинг: 0 / 0
19.05.2004, 12:33
    #32523694
Купер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
применение задачи о рюкзаке ( ранце)
>применение задачи о рюкзаке ( ранце)
Вот вам и применение. Вчера ко мне прямо с утра прибежали, срочно
и важно: набрать сумму по какой-то хрени... типа по поставщикам...
Пришлось вспомнить эту задачку и "с блеском" выручить людей.
Вечером я для интереса сделал эту хрень на VBA (рекурсией). Кстати,
входные данные реальные и просто супер для тестирования - такие сам
не придумаешь. Чудовищно загадочно, что нужная сумма набралась.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
Private a, N
Const Summa =  6243120  '--надо набрать эту сумму

Sub Main()
a = Array( _
6110475, 3765608, 2782904, 2709852, 1916507, 1777094, 1687988, _
1389334, 1097480, 958193, 709066, 626633, 609345, 463030, 429227, _
418305, 387644, 331857, 321041, 212298, 184552, 121218, 23398 _
) '''массив должен заполняться по убыванию!
N = UBound(a)
deef a,  0 ,  0 
End Sub

Sub deef(ByVal ar, ByVal sm, ByVal r)
Dim i, j, res, br
For i = r To N
If ar(i) <>  0  Then
If ar(i) + sm = Summa Then
For j =  0  To N
If ar(j) =  0  Or j = i Then res = res & a(j) & vbCrLf
Next
Debug.Print res
MsgBox res
'End 'анкоммент! если достаточно найти только одну комбинацию!
ElseIf ar(i) + sm < Summa Then
br = ar
br(i) =  0 
deef br, sm + ar(i), i +  1 
End If
End If
Next
End Sub
А теперь сравните с быстродействием t-скуль кода от Paul Chabinsky
(как известно, мой аналогичный t-скуль скрипт работает немного
медленнее, чем его; плюс, я так и не сделал (поленился) корректный
выход из бесконечного цикла). КОРОЧЕ, ДАВАЙТЕ МЕРЯТЬСЯ ПИСЬКАМИ!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
begin tran
	set nocount on
	declare @summ decimal( 9 , 2 )
        set @summ =  6243120   ---<<<<<<<<<<< СУММА
 
	create table #t (
		id int identity( 1 , 1 ) primary key,
		amount money
	)
insert #t (amount)
select     23398   union all
select    121218   union all
select    184552   union all
select    212298   union all
select    321041   union all
select    331857   union all
select    387644   union all
select    418305   union all
select    429227   union all
select    463030   union all
select    609345   union all
select    626633   union all
select    709066   union all
select    958193   union all
select   1097480   union all
select   1389334   union all
select   1687988   union all
select   1777094   union all
select   1916507   union all
select   2709852   union all
select   2782904   union all
select   3765608   union all
select   6110475 
	create table #hash(
		a int,  --Точка начальная
 
		b int,  --Точка конечная
 
		deep int,  --Количество промежуточных пунктов
 
		summ decimal( 9 , 2 ),  --Суммарная длинна пути
 
		offset decimal( 9 , 2 ),  --Длинна последнего отрезка пути
 
		path varchar( 500 ) primary key  --Строковое выражение пути, ввиде длинны ребер графа через знак плюса, в расчетах не участвуюет
 
	)
	insert into #hash
	select t1.id,t2.id, 2 ,t1.amount+t2.amount,t2.amount, convert(varchar,t1.id)+'.'+convert(varchar,t2.id)
	from #t t1, #t t2
	where t1.id<t2.id and t1.amount+t2.amount<=@summ
	declare @deep int, @max_deep int
	select @deep =  1 , @max_deep = (select count(*) from #t)
	while @deep<=@max_deep
		begin
			 --Увеличиваем количество пунктов в пути
 
			select @deep = @deep+ 1 
			 --Вставляем пару значений в конец пути
 
			insert into #hash
			select h1.a a,h2.b b,h1.deep+ 1  deep,h1.summ+h2.offset summ,h2.offset offset, h1.path+'.'+convert(varchar,h2.b) path
			from #hash h1 inner join #hash h2 on h1.a<h2.b and h1.b = h2.a and h1.deep = @deep and h2.deep =  2  and h1.summ+h2.offset<=@summ
			 --Если вставки не было выйти из цикла
 
			if @@rowcount<= 0 
				break
			 --Удаляем бесперспективные куски пути, здесь можно еще поиграца в поисках производительности
 
			delete from #hash where b<=@deep and summ<>@summ
		end
	select path from #hash where summ = @summ order by a,b,path
rollback tran
...
Рейтинг: 0 / 0
19.05.2004, 14:52
    #32524082
Купер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
применение задачи о рюкзаке ( ранце)
Еще более жуткий для t-sql вариант. Входные данные те же, только
целевая сумма другая - 145165.20 (она чуть меньше всей суммы и такой
подсуммы нет... и пришлось все данные разделить на 100).
Может на супер машине это будет быстро, но я не дождался - пожрала
всю память и принялась винт молотить - Celeron 400MHz, 128MB, семёрка.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
 ---begin tran --- (c) Paul Chabinsky
 
	set nocount on
	declare @summ decimal( 9 , 2 )
        set @summ =  145165 . 20   ---62431.20 ---СУММА
 
	create table #t (
		id int identity( 1 , 1 ) primary key,
		amount money
	)
insert #t (amount)
select     233 . 98   union all
select    1212 . 18   union all
select    1845 . 52   union all
select    2122 . 98   union all
select    3210 . 41   union all
select    3318 . 57   union all
select    3876 . 44   union all
select    4183 . 05   union all
select    4292 . 27   union all
select    4630 . 30   union all
select    6093 . 45   union all
select    6266 . 33   union all
select    7090 . 66   union all
select    9581 . 93   union all
select   10974 . 80   union all
select   13893 . 34   union all
select   16879 . 88   union all
select   17770 . 94   union all
select   19165 . 07   union all
select   27098 . 52   union all
select   27829 . 04   union all
select   37656 . 08   union all
select   61104 . 75 
	create table #hash(
		a int,  --Точка начальная
 
		b int,  --Точка конечная
 
		deep int,  --Количество промежуточных пунктов
 
		summ decimal( 9 , 2 ),  --Суммарная длинна пути
 
		offset decimal( 9 , 2 ),  --Длинна последнего отрезка пути
 
		path varchar( 500 ) primary key  --Строковое выражение пути, ввиде длинны ребер графа через знак плюса, в расчетах не участвуюет
 
	)
	insert into #hash
	select t1.id,t2.id, 2 ,t1.amount+t2.amount,t2.amount, convert(varchar,t1.id)+'.'+convert(varchar,t2.id)
	from #t t1, #t t2
	where t1.id<t2.id and t1.amount+t2.amount<=@summ
	declare @deep int, @max_deep int
	select @deep =  1 , @max_deep = (select count(*) from #t)
	while @deep<=@max_deep
		begin
			 --Увеличиваем количество пунктов в пути
 
			select @deep = @deep+ 1 
			 --Вставляем пару значений в конец пути
 
			insert into #hash
			select h1.a a,h2.b b,h1.deep+ 1  deep,h1.summ+h2.offset summ,h2.offset offset, h1.path+'.'+convert(varchar,h2.b) path
			from #hash h1 inner join #hash h2 on h1.a<h2.b and h1.b = h2.a and h1.deep = @deep and h2.deep =  2  and h1.summ+h2.offset<=@summ
			 --Если вставки не было выйти из цикла
 
			if @@rowcount<= 0 
				break
			 --Удаляем бесперспективные куски пути, здесь можно еще поиграца в поисках производительности
 
			delete from #hash where b<=@deep and summ<>@summ
		end
	select path from #hash where summ = @summ order by a,b,path
drop table #t drop table #hash
 ---rollback tran
 
...
Рейтинг: 0 / 0
19.05.2004, 14:55
    #32524095
Купер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
применение задачи о рюкзаке ( ранце)
>целевая сумма другая - 145165.20 (она чуть меньше всей суммы и такой

Читать как: она чуть меньше ПОЛОВИНЫ всей суммы и такой
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / применение задачи о рюкзаке ( ранце) / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]