Главная страница
    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.084 c
1-1173954705
Alvin
2007-03-15 13:31
2007.05.13
Передача параметров приложению


2-1176948495
ярослав
2007-04-19 06:08
2007.05.13
проблема с перетаскиванием окна


15-1176389969
Kerk
2007-04-12 18:59
2007.05.13
Защищенные процессы Висты оказались не слишком защищенными


2-1177006647
Sapan
2007-04-19 22:17
2007.05.13
Удалить символ из поля


1-1173883185
Леонид
2007-03-14 17:39
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский