Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];

Вниз

Процедура полного перебора   Найти похожие ветки 

 
inos   (2007-04-22 15:32) [0]

Доброго времени суток!!! Уважаемые мастера, помогите разобраться с процедурой полного перебора. Имеется набор из n элементов a1...an. Каждый элемент ai характеризуется определенными свойствами - вес wi и цена ci. Требуется найти оптимальную выборку  ai...aik из этого набора, т.е. такую, для которой при заданном ограничении на суммарный вес Wmax достигается максимальная стоимость.


type index=1..10;
var s: Set of index;
Procedure Vbr(i:Index);
begin
  < включение i-го элемента в выборку Include (s,i) >;
  if i<n then Vbr(i+1)
  else < проверка приемлемости и оптимальности >;
  < исключение i-го элемента из выборки Exclude (s,i) >;

  if i<n then Vbr(i+1)
  else < проверка приемлемости и оптимальности >;
  end; // Vbr


пишу


Procedure FullPerebor(i:byte;tw,ac:cardinal);  //метод полного перебора
 Var ac1:cardinal;
begin

   include(S,i);
   if i<n then begin
     FullPerebor(i+1, tw+a[i].w,ac);
     end
   else begin
     if tw+a[i].w<=Wmax then begin
       if ac>maxC then begin
         maxC:=ac;
         optS:=S;
       end;
     end;
   Exclude(S,i);
end;

  if i<n then begin
     FullPerebor(i+1,tw+a[i].w,ac); //продвижение вправо
     end
     else if tw<=Wmax then begin
     if ac>maxC then begin
         maxC:=ac;
         optS:=S;
       end;
     end;
end; // FullPerebor


не работает


 
default ©   (2007-04-22 15:47) [1]

http://algolist.manual.ru/maths/combinat/subentities.php


 
inos   (2007-04-23 00:35) [2]


> http://algolist.manual.ru/maths/combinat/subentities.php

посмотрел - мысль интересная. А с рекурсией? :(


 
Германн ©   (2007-04-23 00:56) [3]


> Требуется найти оптимальную выборку  ai...aik из этого набора,
>  т.е. такую, для которой при заданном ограничении на суммарный
> вес Wmax достигается максимальная стоимость.

Чёртовы буржуи! Всё бы им "содрать" побольше! :-)


 
default ©   (2007-04-23 01:01) [4]

inos   (23.04.07 00:35) [2]

procedure Comb(var arr: Array Of Boolean; k: LongInt);
var
  i: LongInt;
begin
 for i := k to High(arr) do begin
   arr[i] := True;
    // щас arr тут представляет очередное двоичное число
   // выполняем тут расчёты со стоимостью и весом
   if i+1 = Length(arr) then Exit;
   Comb(arr, i+1);
   arr[i] := False;  // откат комбинации
 end;
end;  

arr должен быть весь в False и иметь длину N
и делаем вызов Comb(arr, 0)

если не ошибся, то так


 
default ©   (2007-04-23 01:21) [5]

procedure Comb(var arr: Array Of Boolean; k: LongInt);
var
 i: LongInt;
begin
if k = Length(arr) then Exit;
for i := k to High(arr) do begin
  arr[i] := True;
   // щас arr тут представляет очередное двоичное число
  // выполняем тут расчёты со стоимостью и весом
   Comb(arr, i+1);
  arr[i] := False;  // откат комбинации
end;
end;  

вот тяка будет пахать


 
default ©   (2007-04-23 01:27) [6]

рекурсию используют обычно там где она даёт короткие и понятные решения
в остальных ищи счастье в итеративном подходе
в данном случае смотри по размеру своего N
если небольшое оно может быть тогда можно и рекурсивно перебирать
но мне кажется и тебе и читающим твой код будет более понятен итеративный варианта
и помни принцип
keep it simple, stupid что в переводе
"держи это простым, тупица"


 
inoc ©   (2007-04-23 12:05) [7]

решил вот так:

Procedure FullPerebor(i:byte;tw,ac:cardinal);  //метод полного перебора
 Var ac1:cardinal;
begin

   include(S,i);
   if i<n then begin
     FullPerebor(i+1, tw+a[i].w,ac);
     end
   else
   if tw+a[i].w<=Wmax then begin
   if ac>maxC then begin
   maxC:=ac;
     optS:=S;
   end;
   end;
 Exclude(S,i);

 ac1:=ac-a[i].c;
 if ac1>maxC then
   if i<n then begin
     FullPerebor(i+1,tw,ac1);
     end
     else if tw<=Wmax then begin maxC:=ac1; optS:=S end;
end; // FullPerebor


 
inoc ©   (2007-04-23 12:05) [8]

Всем спасибо!!



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.044 c
1-1174234562
Midnighter
2007-03-18 19:16
2007.05.13
Динамическая линковка интерфейсов


15-1176570773
Desdechado
2007-04-14 21:12
2007.05.13
Системная библиотека перемещена в памяти


2-1177145993
..::KraN::..
2007-04-21 12:59
2007.05.13
Вопрос про число


9-1149625295
DevilDevil
2006-06-07 00:21
2007.05.13
Алгоритм быстрой 3D графики


15-1175808226
ampo
2007-04-06 01:23
2007.05.13
Небольшая коллекция мануалов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский