Algotimizace prostrihu

Ales Prochaska prochaska@alsoft.cz
Sobota Březen 24 19:36:01 CET 2007


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.







Další informace o konferenci Hw-list