Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 28. 03. 2012 19:27

night_gnome
Příspěvky: 68
Reputace:   
 

matlab _ vysvětlení kódu

Dobrý den, mohli by jste mi vysvětlit co matlab dělá těmito kroky ? weights je vektor stejně tak values... W je číslo např.:20 ... první vytvořil matici, pak za j dosadil číslo od 1 až po délku vektoru, za Y od 1 až do W (tedy 20) ale dál už tomu nerozumím.

    A = zeros(length(weights)+1,W+1);
 
    for j = 1:length(weights)
        for Y = 1:W
            if weights(j) > Y
                A(j+1,Y+1) = A(j,Y+1);
            else
                A(j+1,Y+1) = ...
                    max( A(j,Y+1), values(j) + A(j,Y-weights(j)+1));
            end
        end
    end

   best = A(end,end);

Offline

 

#2 30. 03. 2012 00:48

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: matlab _ vysvětlení kódu

Zda se mi to docela slozite, take tomu nerozumim :-) nevim, jestli ma cenu podrobne rozepisovat kazdy prikaz, pro zacatek zkusim popsat co me k tomu napada, ale nevim, jestli to dokazu popsat srozumitelne:

Jsou tam ty vektory weights (w1, w2, w3, ...) a values (v1, v2, v3, ...) ktere maji stejny pocet slozek, pak je tam jeste ta matice A - ta je ze zacatku nulova (to je to A = zeros(length(weights)+1,W+1);), ma o jeden radek vic nez maji ty vektory slozek. j je tam pouzite pro radek v te matici A, Y je jako sloupec (vetsinou), napriklad: A(j+1,Y+1). Ty cykly by se daly zobrazit nejak tak:

     Y:1 2 3 ... 20  weights  values
   j A
   1   0 0 0      0    w1       v1
   2   0 0 0      0    w2       v2
   3   0 0 0      0    w3       v3
  ...
   ?   0 0 0      0    w?       w?

Prvni je cyklus pro j, cili nejdriv se provadi pro ten prvni radek (j=1), pak pro druhy (j=2) atd. pak je cyklus pro Y, cili pro kazdy radek (stejne j) se ty prikazy uvnitr cyklu provedou nejdriv pro prvni sloupec (Y=1), pak pro druhy (Y=2) atd.

Ted uz k tomu, co se provadi tam vevnitr cyklu, cili v tom
            if weights(j) > Y
                A(j+1,Y+1) = A(j,Y+1);
            else
                A(j+1,Y+1) = ...
                    max( A(j,Y+1), values(j) + A(j,Y-weights(j)+1));
            end

Nejdriv je tam podminka - kdyz je weights(j) vetsi nez Y, tak se provede ten prvni prikaz, cili kdyz napriklad weights(2) bude 4, tak pro druhy radek to znamena, ze podminka bude splnena pro Y rovne 1, 2 nebo 3. Ten prvni prikaz je A(j+1,Y+1) = A(j,Y+1); - cili hodnota z j-teho radku ve sloupci Y+1 se nakopiruje do dalsiho, cili j+1-ho radku. Takze by se pod tim dalo predstavit to, ze hodnoty ve sloupci s mensim indexem nez weights(j) se kopiruji do dalsiho radku. Pro ten priklad jak jsem psal by to znamenalo, ze hodnoty ve 2., 3. a 4. sloupci ve druhe radce se nakopiruji do treti radky. Pro ty dalsi sloupce kopiruje vetsi ze dvou hodnot - bud ta hodnota z matice (stejne jako pri splnene podmince), anebo - soucet slozky toho vektoru values a hodnoty ze sloupce, ktera je posunuta o sloupcu weights(j) doleva. Nakonec to vezme nejaky vysledek z posledniho radku a sloupce te matice.
Co presne to ma pocitat, to nevim :-) mozna nad tim jeste budu premyslet anebo se podivam, jestli k tomu neco nenajdu. Odkud to vlastne mas? Vis, co to ma delat?

Offline

 

#3 30. 03. 2012 15:55

night_gnome
Příspěvky: 68
Reputace:   
 

Re: matlab _ vysvětlení kódu

↑ Lumikodlak:

http://www.mathworks.com/matlabcentral/ … 1-knapsack je to tady z tohoto. Díky za vysvětlení ;)

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson