Algotimizace prostrihu
nesvacil@posys.eu
nesvacil@posys.eu
Neděle Březen 25 00:34:01 CET 2007
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
Další informace o konferenci Hw-list