Black box általános optimalizálás demo #3

https://i.imgur.com/PNgXTOU.png

További tesztekkel kutatom az eljárásom viselkedését.

Véletlen módon generált tetszőleges háromszögeket illesztek egy lapra. Cél, hogy minél jobban közelítse a háromszögek területe a papír területét. Feltétel, hogy a papírról lelógó háromszögeket nem veszem figyelembe és csak akkor értékelem ki a konfigurációt, ha nincs egyetlen olyan háromszög sem, amely rálóg egy másikra.

Ruby-ban prototipizálom. Nem cél hogy gyors legyen a kód, ezért nem optimalizálom. Pont azt akarom vizsgálni, hogy pongyolán beszórt lassú kiértékelővel milyen gyorsan konvergál. Fontos még, hogy semmilyen heurisztikus segítséget nem adok az eljárásnak, például hogy mindent balra és alulra illesszek, össze tolva őket stb.

Egyetlen paramétert választok, ezt is véletlenszerűen. Ez a háromszögek maximum nagysága. Annyi háromszöget generálok, amelyek területe nagyobb mint a lap duplája. És ezekből válogatok az illesztéshez.

Sok esetben több mint 30 vagy akár 100 háromszög is kell. Ekkor az ismeretlen paraméterek száma ennek 3-szorosa, mivel minden háromszögre kérek egy X és Y irányú eltolást és elforgatási szöget.

A fenti képen egy 1 órás futás utáni állapot látható, melynél 89 háromszögből választott az eljárás 8-at és 41%-os lefedettséget ért el. Az alábbi kép egy illusztráció a beillesztett és lemaradt objektumokra pár másodperces futás után. Szürke színnel a lelógók láthatók. Pár nap múlva még posztolok erősebb optimumokat.

https://i.imgur.com/8vRCp7x.png

5/24 kiválasztott háromszög 58% terület lefedéssel 52 perc futással.

https://i.imgur.com/fFia60T.png

További képek 10+ óra futással. Itt is egy meglévő halmazból kellett kiválogatnia az objektumokat. Tetszőlegeset nem használhat.

https://i.imgur.com/pLRqb52.png

 

https://i.imgur.com/2QF8xHx.png

 

https://i.imgur.com/6IB6c5d.png

 

https://i.imgur.com/JMAGR8Q.png

 

https://i.imgur.com/e7P4tBT.png

 

https://i.imgur.com/bjJOzEm.png

 

https://i.imgur.com/sTx3n46.png

 

https://i.imgur.com/M9c6eUn.png

Hozzászólások

Egyszer régen, a lézervágók hajnalán, autolispben csináltam egy programot, ami meghatározott alkatrészeket szórt fel úgy egy lapra (lemez), hogy a lehető legtöbb férjen el rajta (hulladék minimalizálás). Persze a modern gépek ezt már tudják, de akkoriban ez még elég nagy szám volt.

I hate those Smurfs!

Nem értettem nagyon az ilyen-olyan algoritmusokhoz, úgyhogy próbáltam leírni, azt ahogy kézzel csinálnám. Szerencsére az AutoCAD-nek vannak olyan függvényei (pl az IntersectWith) amivel az átlapolást lehet vizsgálni, így viszonylag könnyű dolgom volt. Legalábbis az első iteráció, amikor a nagy alkatrészek mentek fel a lapra, a többi iterációban, a kisebbek kerültek a hézagokba. A legtöbbször max 10 féle, általában 10-30 cm-es alkatrészt kellett felszórni egy A0-ás lapra, ha jól emlékszem, ez gyakorlatilag egy-két perc alatt megvolt egy Pentium I-es gépen.

Aztán persze jöttek, az okos cnc "programozók", hogy ők kézzel sokkal optimálisabban meg tudnák csinálni. Nem jött össze. Nekik így csak annyi dolguk volt, hogy a gépbe be kellett tölteni a dxf-et és megnyomni a start gombot.

I hate those Smurfs!