Algotimizace prostrihu

Ales Prochaska prochaska@alsoft.cz
Neděle Březen 25 11:02:39 CEST 2007


Jasne, tohle bylo reseni metodou nejmensiho odporu neboli receno
ajtackou mluvou "prototyp aplikace". V dalsim kroku se daji u ctyr z
tech cyklu dopocitat horni meze a dva cykly se daji zrusit protoze
hodnotu ridici promenne lze vypocist z ostatnich.

Kdyz tak nahodte taky nejaky evolucni algoritmus, treba taky
primitivni ale funkcni. Osobne by me docela zajimalo porovnani
ucinnosti obou algoritmu.

Ales Prochaska

> Nejste moc daleko od nejake prakticke realizace.

> Obecne zde mate nekolik cyklu for, ktere daji casove zabrat. Evolucni 
> algoritmy se zaobariaji jen tim, ze vam rychleji pomohou najit ty promenne
> orient_LH, ... . Je to pomerne jednoduche.

> Jirka
> ----- Original Message ----- 
> From: "Ales Prochaska" <prochaska@alsoft.cz>
> To: <hw-list@list.hw.cz>
> Sent: Saturday, March 24, 2007 7:36 PM
> Subject: Re: Algotimizace prostrihu


> Docela me zaujalo jak tu navrhujete geneticke algoritmy a podobne
> teoreticky dobre zvladnute uvahy, ale nejak mi pripada, ze by bylo
> tezke z toho neco vydolovat pro praxi. Takze jsem pustil delfi a na
> treti preklad mi vypadlo tohle. Najde to nejlepsi pokryti zalozene na
> sireni pokryti ze vsech rohu papiru soucasne. Urcite to pujde urychlit
> doplnenim dynamickych mezi cyklu a nahradou tech poli [0..1]
> promennymi a dosazovanim do nich a podobne.

> Ales Prochaska


> program rezani;

> {$APPTYPE CONSOLE}

> uses
>   SysUtils;

> const
>   papir_x     = 210;
>   papir_y     = 297;
>   papirek_x   = 50;
>   papirek_y   = 100;

> var
>   orient_LH   : integer; // 0 = na sirku, 1 = na delku
>   orient_PH   : integer;
>   orient_LD   : integer;
>   orient_PD   : integer;

>   pocet_LH_x   : integer;
>   pocet_LH_y   : integer;
>   pocet_PH_x   : integer;
>   pocet_PH_y   : integer;
>   pocet_LD_x   : integer;
>   pocet_LD_y   : integer;
>   pocet_PD_x   : integer;
>   pocet_PD_y   : integer;

>   rozmer_x     : array [0..1] of integer; // transformace rozmeru (rotace
> papiru)
>   rozmer_y     : array [0..1] of integer;


>   plocha       : integer; // pokryta plocha v jedne iteraci
>   max_plocha   : integer; // maximalni dosud nalezene pokryti plochy

> begin
>   rozmer_x[0]:=papirek_x;
>   rozmer_x[1]:=papirek_y;
>   rozmer_y[0]:=papirek_y;
>   rozmer_y[1]:=papirek_x;

>   max_plocha := 0;

>   // vyzkouset vsechny orientace v rozich
>   for orient_LH:=0 to 1 do begin
>   for orient_PH:=0 to 1 do begin
>   for orient_LD:=0 to 1 do begin
>   for orient_PD:=0 to 1 do begin

>     // plnit papir zkusmo ze vsech rohu
>     for pocet_LH_x:=0 to papir_x div rozmer_x[orient_LH] do begin
>     for pocet_LH_y:=0 to papir_y div rozmer_y[orient_LH] do begin
>     for pocet_PH_x:=0 to papir_x div rozmer_x[orient_PH] do begin
>     for pocet_PH_y:=0 to papir_y div rozmer_y[orient_PH] do begin
>     for pocet_LD_x:=0 to papir_x div rozmer_x[orient_LD] do begin
>     for pocet_LD_y:=0 to papir_y div rozmer_y[orient_LD] do begin
>     for pocet_PD_x:=0 to papir_x div rozmer_x[orient_PD] do begin
>     for pocet_PD_y:=0 to papir_y div rozmer_y[orient_PD] do begin

>       // neprekryvaji se potvory?
>       if  (pocet_LH_x * rozmer_x[orient_LH] + pocet_PH_x * 
> rozmer_x[orient_PH] <= papir_x)
>       and (pocet_LD_x * rozmer_x[orient_LD] + pocet_PD_x * 
> rozmer_x[orient_PD] <= papir_x)
>       and (pocet_LH_y * rozmer_y[orient_LH] + pocet_LD_y * 
> rozmer_y[orient_LD] <= papir_y)
>       and (pocet_PH_y * rozmer_y[orient_PH] + pocet_PD_y * 
> rozmer_y[orient_PD] <= papir_y)
>       and ((pocet_LH_x * rozmer_x[orient_LH] + pocet_PD_x * 
> rozmer_x[orient_PD] <= papir_x)
>            or (pocet_LH_y * rozmer_y[orient_LH] + pocet_PD_y * 
> rozmer_y[orient_PD] <= papir_y))
>       and ((pocet_LD_x * rozmer_x[orient_LD] + pocet_PH_x * 
> rozmer_x[orient_PH] <= papir_x)
>            or (pocet_LD_y * rozmer_y[orient_LD] + pocet_PH_y * 
> rozmer_y[orient_PH] <= papir_y))
>       then begin
>         plocha := pocet_LH_x * rozmer_x[orient_LH] * pocet_LH_y * 
> rozmer_y[orient_LH]
>                 + pocet_PH_x * rozmer_x[orient_PH] * pocet_PH_y * 
> rozmer_y[orient_PH]
>                 + pocet_LD_x * rozmer_x[orient_LD] * pocet_LD_y * 
> rozmer_y[orient_LD]
>                 + pocet_PD_x * rozmer_x[orient_PD] * pocet_PD_y * 
> rozmer_y[orient_PD];

>         if plocha > max_plocha then begin
>           max_plocha:=plocha;
>           // kontrolni vypis
>           writeln('Pokryta plocha:
> ',plocha/(papir_x*papir_y)*100:3:2,' %');
>           // zde doprogramovat ulozeni rozlozeni papirku
>           end; //if

>         end; //if

>       end; //for
>       end; //for
>       end; //for
>       end; //for
>       end; //for
>       end; //for
>       end; //for
>       end; //for

>     end; //for
>     end; //for
>     end; //for
>     end; //for

>     readln;
> end.




> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list@list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list

> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list@list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list





Další informace o konferenci Hw-list