Programtenyésztés igény szerint avagy hogyan segít programot írni a természetes kiválasztódás Szita István, Eötvös Collegium
Bevezető a számítógép remek segítőtárs, mindent megcsinál, amit az ember mond neki nagy hibája: nagyon pontosan meg kell mondani, mit akarunk jó volna: elmondjuk a feladatot – a gép meg kitalálja a megoldást önmaguktól tanuló programok
A megoldás: genetikus programozás Természet: egészen jó megoldások lopjuk el az ötletet: mesterséges evolúciót!
Mesterséges evolúció egyed program kromoszómák (több, ált. párosával) kromoszómák populáció (több) populáció természetes szelekció + mesterséges szelekció (nemesítés) mesterséges szelekció mutáció kereszteződés … és még sok minden
Genetikus programozás (GP) - vázlatosan kiindulási populáció létrehozása (véletlenszerűen), T=0 a T. generáció: populáció kiértékelése a leggyengébbek kihalnak a többiek utódokat hoznak létre (mutáció, kereszteződés) T=T+1
Mit kódolnak a gének? a legelső, legfontosabb kérdés feladatfüggő (pl. kapcsolási rajz, robot viselkedésmintái, útvonalterv) jó volna: általános programnyelv Basic, Pascal, C: rosszul tűri a GP-t mutáció: 99,9%, hogy működésképtelen jó kódolás: programfa
Program = fa ? / x15 if <= xy0+ y eredmény = x / 15 eredmény = 0, ha x <= y y+3 egyébként gének: 3 if <=xy0+y3 LISP – általános programnyelv
Mutáció if <= xy0+ y3
Mutáció xy0+ y3
Mutáció -y0+ y3
Mutáció -y0+ y310z
Kereszteződés if <= xy0+ y3 - y* - yx 2 x
Kereszteződés xy0+ y3 - y* - yx 2 x xy0 * - yx 2
A programok kiértékelése fitnessz-függvény: mennyire „rátermett” a program túlélhet-e? létrehozhat-e utódot? leggyakrabban: tanítópéldák: (bemenet -> kívánt kimenet) párok mekkora hibát produkál más: hányszor nyer?
Egyéb trükkök segédfüggvények kifejlesztése („szervek” evolúciója) részpopulációk („szigetek”) vérfertőzés kizárása koevolúció (versenytársak, paraziták) nemek (2 – vagy akár több)
Genetikus programozás - pro és kontra automatikus kényelmesen megadható ellenálló, hibatűrő programok nagyon lassú a kapott kód áttekinthetetlen pl. felesleges kódrészletek („vakbél”) nem érdemes programozókat helyettesíteni vele érdemes nehezen programozható feladatokra ráengedni
Mit tud a GP? játékstratégiák (közepesen erős GO játékos) áramkörtervezés (szűrők, erősítők) adatsorelemzés (fehérjeosztályozás) mesterséges élet (TIERRA) természetes szöveg elemzése (folyamatban van)
Köszönöm a figyelmet!
Egyszerű példa megoldás: fun f (V2_4) = (!!!!!!!!!) case V2_4 of case V2_4 of nil => nil nil => nil | cons( V2_32, V2_33 ) => | cons( V2_32, V2_33 ) => case V2_33 of case V2_33 of nil => V2_4 nil => V2_4 | cons( V2_59a7, V2_59a8 ) => cons( V2_59a7, cons( V2_32, V2_59a8 ) ) | cons( V2_59a7, V2_59a8 ) => cons( V2_59a7, cons( V2_32, V2_59a8 ) )
Egyszerű példa egy számlistát meg kell fordítani tanítópéldák: [] -> [] [37] -> [37] [49,37] -> [37,49] [95,49,37] -> [37,49,95]
Egyszerű példa kiindulási populáció: fun f (V2_4) = V2_4 fun f (V2_4) = case V2_4 of nil => nil | cons( V2_32, V2_33 ) => V2_4 | cons( V2_32, V2_33 ) => V2_4 fun f (V2_4) = case V2_4 of case V2_4 of nil => nil nil => nil | cons( V2_32, V2_33 ) => | cons( V2_32, V2_33 ) => case V2_33 of case V2_33 of nil => V2_4 nil => V2_4 | cons( V2_59a7, V2_59a8 ) => cons( V2_59a7, cons( V2_32, V2_59a8 ) ) | cons( V2_59a7, V2_59a8 ) => cons( V2_59a7, cons( V2_32, V2_59a8 ) ) … és még sokan mások