Geneettinen algoritmi on heuristinen hakualgoritmi , jota käytetään optimointi- ja mallinnusongelmien ratkaisemiseen satunnaisella valinnalla, yhdistämällä ja muuntelemalla haluttuja parametreja luonnonvalinnan kaltaisia mekanismeja käyttäen . Se on eräänlainen evoluutiolaskenta , joka ratkaisee optimointiongelmia käyttämällä luonnollisia evoluution menetelmiä, kuten periytymistä , mutaatiota , valintaa ja ylittämistä . Geneettisen algoritmin erottuva piirre on "risteytys"-operaattorin käytön korostaminen, joka suorittaa ehdokasratkaisujen rekombinaatiooperaation, jonka rooli on samanlainen kuin risteyksen rooli villieläimissä.
Ensimmäisen työn evoluution simuloimiseksi suoritti Nils Baricelli vuonna 1954 Princetonin yliopiston Institute for Advanced Study -instituuttiin asennetulla tietokoneella. [1] [2] Hänen samana vuonna julkaistu teoksensa herätti laajaa julkista huomiota. Vuodesta 1957 [3] australialainen geneetikko Alex Fraser on julkaissut julkaisuja, jotka simuloivat keinotekoista valintaa organismien joukosta, joilla on useita kontrolleja mitattavissa olevien ominaisuuksien saamiseksi. Tämä uraauurtava kehitys mahdollisti evoluutioprosessien tietokonesimuloinnin ja Fraserin ja Barnellin (1970) [4] ja Crosbyn (1973) [5] kirjoissa kuvattujen menetelmien yleistymisen biologien keskuudessa 1960-luvulta lähtien. Fraserin simulaatiot sisälsivät kaikki nykyaikaisten geneettisten algoritmien olennaiset elementit. Tämän lisäksi Hans-Joachim Bremermann julkaisi 1960-luvulla sarjan artikkeleita, joissa myös lähestyttiin rekombinaatioon, mutaatioon ja valintaan kohdistuvaa päätöspopulaatiota optimointiongelmissa. Bremermannin tutkimus sisälsi myös elementtejä nykyaikaisista geneettisistä algoritmeista. [6] Muita pioneereja ovat Richard Friedberg, George Friedman ja Michael Conrad. David B. Vogel (1998) on julkaissut uudelleen monia varhaisia teoksia . [7]
Vaikka Baricelli vuoden 1963 artikkelissaan simuloi koneen kykyä pelata yksinkertaista peliä, [8] keinotekoisesta evoluutiosta tuli hyväksytty optimointitekniikka Ingo Rechenbergin ja Hans-Paul Schwefelin työn jälkeen 1960- luvulla ja 1970-luvun alussa 1900 -luvulla. vuosisadalla - Rechenbergin ryhmä pystyi ratkaisemaan monimutkaisia teknisiä ongelmia evoluutiostrategioiden mukaisesti . [9] [10] [11] [12] Toinen lähestymistapa oli Lawrence J. Vogelin evoluutioohjelmointitekniikka , jota ehdotettiin tekoälyn luomiseksi. Evoluutioohjelmointi käytti alun perin tilakoneita ennustamaan olosuhteita ja monimuotoisuutta ja valintaa optimoimaan ennustuslogiikka. Geneettisistä algoritmeista tuli erityisen suosittuja John Hollandin 70-luvun alussa tekemän työn ja hänen kirjansa Adaptation in Natural and Artificial Systems (1975) [13] ansiosta . Vogelin tutkimus perustui Hollandin kokeisiin soluautomaateilla ja hänen (Hollannin) Michiganin yliopistossa kirjoitettuihin kirjoituksiinsa . Holland esitteli formalisoidun lähestymistavan seuraavan sukupolven laadun ennustamiseen, joka tunnetaan nimellä Scheme Theorem . Geneettisten algoritmien tutkimus pysyi suurelta osin teoreettisena 1980-luvun puoliväliin saakka, jolloin ensimmäinen kansainvälinen geneettisten algoritmien konferenssi pidettiin lopulta Pittsburghissa, Pennsylvaniassa (USA) .
Tutkimuskiinnostuksen kasvaessa myös pöytätietokoneiden laskentateho on kasvanut merkittävästi, mikä on mahdollistanut uuden tietotekniikan käytön käytännössä. 80-luvun lopulla General Electric aloitti maailman ensimmäisen geneettisen algoritmituotteen myynnin. Niistä tuli joukko teollisia laskentatyökaluja. Vuonna 1989 toinen yritys, Axcelis, Inc. julkaisi Evolverin , maailman ensimmäisen kaupallisen geneettisen algoritmituotteen pöytätietokoneille. New York Timesin teknologiatoimittaja John Markoff kirjoitti [ 14 ] Evolverista vuonna 1990.
Ongelma on formalisoitu siten, että sen ratkaisu voidaan koodata geenien vektoriksi (" genotyyppi "), jossa jokainen geeni voi olla bitti , numero tai jokin muu objekti. Geneettisen algoritmin (GA) klassisissa toteutuksissa oletetaan, että genotyypillä on kiinteä pituus. GA:sta on kuitenkin muunnelmia, jotka eivät koske tätä rajoitusta.
Jollain, yleensä satunnaisella tavalla, luodaan monia alkuperäisen populaation genotyyppejä. Ne arvioidaan " kuntofunktiolla ", jolloin jokaiseen genotyyppiin liitetään tietty arvo ("fitness"), joka määrittää, kuinka hyvin sen kuvaama fenotyyppi ratkaisee ongelman.
Kun valitset ” kuntotoimintoa” (tai englanninkielisessä kirjallisuudessa fitness- toimintoa ), on tärkeää varmistaa, että sen ”kehotus” on ”tasainen”.
Tuloksena olevasta ratkaisujoukosta ("sukupolvet") valitaan "kuntoisuuden" arvon huomioon ottaen ratkaisut (yleensä parhaiden yksilöiden valituksi tulemisen todennäköisyys on suurempi), joihin sovelletaan "geneettisiä operaattoreita" (useimmissa tapauksissa). tapauksia, " crossover " - crossover ja " mutaatio " - mutaatio ), mikä johtaa uusiin ratkaisuihin. Heille lasketaan myös kunto-arvo, jonka jälkeen suoritetaan seuraavan sukupolven parhaiden ratkaisujen valinta ("valinta").
Tämä toimintosarja toistetaan iteratiivisesti, jolloin mallinnetaan "evoluutioprosessia", joka kestää useita elinkaareja ( sukupolvia ), kunnes algoritmin pysäytyskriteeri täyttyy. Tämä kriteeri voisi olla:
Geneettiset algoritmit palvelevat pääasiassa ratkaisujen etsimistä moniulotteisista hakuavaruksista.
Siten geneettisen algoritmin seuraavat vaiheet voidaan erottaa:
Ennen ensimmäistä vaihetta sinun on luotava satunnaisesti alkupopulaatio; vaikka se osoittautuisi täysin kilpailukyvyttömäksi, on todennäköistä, että geneettinen algoritmi siirtää sen silti nopeasti elinkelpoiseen populaatioon. Ensimmäisessä vaiheessa ei siis voi erityisesti yrittää saada yksilöitä liian kuntoon, riittää, että ne vastaavat populaation yksilöiden muotoa ja niistä voidaan laskea kuntofunktio. Ensimmäisen vaiheen tulos on populaatio H, joka koostuu N yksilöstä.
Valintavaiheessa on tarpeen valita tietty osa koko väestöstä, joka pysyy "elossa" tässä kehitysvaiheessa. On olemassa erilaisia tapoja valita. Yksilön h selviytymistodennäköisyyden tulee riippua kuntofunktion arvosta Fitness(h). Itse eloonjäämisprosentti s on yleensä geneettisen algoritmin parametri, ja se on yksinkertaisesti annettu etukäteen. Valinnan tuloksena populaation H N yksilöstä on jäätävä sN yksilöitä, jotka sisällytetään lopulliseen populaatioon H'. Loput yksilöt kuolevat.
Lisääntyminen geneettisillä algoritmeilla vaatii useita vanhempia, yleensä kaksi, tuottaakseen jälkeläisiä.
Vanhemman valintaoperaattoreita on useita:
Sisäsiitosta ja ulkosiitosta on kaksi muotoa: fenotyyppinen ja genotyyppinen. Fenotyyppisen muodon tapauksessa samankaltaisuus mitataan kuntofunktion arvosta riippuen (mitä lähempänä kohdefunktion arvot ovat, sitä samankaltaisempia yksilöt) ja genotyyppimuodossa samankaltaisuus mitataan. riippuen genotyypin edustuksesta (mitä vähemmän yksilöiden genotyyppien välillä on eroja, sitä samankaltaisempia yksilöt ovat).
Toistaminen eri algoritmeissa määritellään eri tavalla - se tietysti riippuu datan esityksestä. Lisääntymisen päävaatimus on, että jälkeläisellä tai jälkeläisellä on mahdollisuus periä molempien vanhempien piirteet "sekoittaen" niitä jollain tavalla.
Miksi lisääntymiseen tarkoitettuja yksilöitä valitaan yleensä koko populaatiosta H, eikä ensimmäisessä vaiheessa säilyneistä H'-elementeistä (vaikka jälkimmäiselläkin vaihtoehdolla on oikeus olla olemassa)? Tosiasia on, että monien geneettisten algoritmien suurin haittapuoli on yksilöiden monimuotoisuuden puute. Melko nopeasti erottuu yksi genotyyppi, joka on paikallinen maksimi, ja sitten kaikki populaation elementit menettävät valinnan sille, ja koko populaatio "tukkoon" tämän yksilön kopioilla. On olemassa erilaisia tapoja käsitellä tällaista ei-toivottua vaikutusta; yksi niistä on valinta lisääntymiseen ei mukautuneimpien, vaan yleensä kaikkien yksilöiden. Tämä lähestymistapa pakottaa meidät kuitenkin tallentamaan kaikki olemassa olevat yksilöt, mikä lisää ongelman laskennallista monimutkaisuutta. Siksi menetelmiä yksilöiden valitsemiseksi ylittämistä varten käytetään usein siten, että ei vain sopeutuneimmat, vaan myös muut huonokuntoiset yksilöt "lisääntyvät". Tällä lähestymistavalla mutaatioiden rooli kasvaa genotyypin monimuotoisuuden kannalta.
Sama koskee mutaatioita kuin lisääntymistä: mutantteja m on tietty määrä, joka on geneettisen algoritmin parametri, ja mutaatiovaiheessa sinun on valittava mN yksilöä ja vaihdettava ne ennalta määritettyjen mutaatiooperaatioiden mukaisesti. .
On useita syitä kritisoida geneettisen algoritmin käyttöä muihin optimointimenetelmiin verrattuna:
Geneettisten algoritmien käyttökelpoisuudesta on monia skeptikkoja. Esimerkiksi Steven S. Skiena, Stony Brookin yliopiston tietokonetekniikan professori, tunnettu algoritmien tutkija, IEEE Institute Awardin voittaja, kirjoittaa [17] :
Itse en ole koskaan törmännyt yhteenkään ongelmaan, johon geneettiset algoritmit olisivat sopivin työkalu. Lisäksi en ole koskaan törmännyt geneettisten algoritmien avulla saatuihin laskelmiin, jotka tekisivät minuun positiivisen vaikutuksen.
Geneettisiä algoritmeja käytetään ratkaisemaan seuraavat ongelmat:
Hae yksiulotteisesta avaruudesta ilman risteyksiä.
#include <cstdlib> #include <ctime> #include <algoritmi> #include <iostream> #sisällytä <numero> int main () { srand (( unsigned int ) aika ( NULL )); const koko_t N = 1000 ; int a [ N ] = { 0 }; varten ( ;; ) _ { //mutaatio kunkin elementin satunnaiselle puolelle: for ( koko_t i = 0 ; i < N ; ++ i ) a [ i ] += (( rand () % 2 == 1 ) ? 1 : -1 ); //valitse nyt paras nousevassa järjestyksessä std :: lajittele ( a , a + N ); //ja sitten parhaat ovat taulukon toisella puoliskolla. //kopioi parhaat ensimmäiselle puoliskolle, johon he jättivät jälkeläisiä ja ensimmäiset kuolivat: std :: kopioi ( a + N / 2 , a + N , a ); //katso nyt väestön keskimääräinen tila. Kuten näet, se paranee ja paranee. std :: cout << std :: kerätä ( a , a + N , 0 ) / N << std :: endl ; } }Etsi yksiulotteisesta avaruudesta selviytymistodennäköisyydellä ilman ylitystä. (testattu Delphi XE:llä)
ohjelma Ohjelma1 ; {$APPTYPE CONSOLE} {$R *.res} käyttää System . geneeriset lääkkeet . Oletukset , System . geneeriset lääkkeet . Kokoelmat , järjestelmä . Sysutils ; vakio N = 1000 ; Nh = N div2 ; _ MaxPopulation = Suuri ( kokonaisluku ) ; var A : kokonaisluvun taulukko [ 1..N ] ; _ _ _ I , R , C , Pisteet , Syntyvyys : Kokonaisluku ; Iptr : ^ Kokonaisluku ; aloita satunnainen ; // Osittainen populaatio I : = 1 - N do A [ I ] := Satunnainen ( 2 ) ; toista // Mutaatio I : = 1 - N do A [ I ] := A [ I ] + ( - Satunnainen ( 2 ) tai 1 ) ; // Valinta, parhaat TArrayn lopussa . Lajittele < Kokonaisluku > ( A , TComparer < Kokonaisluku >. Oletus ) ; // Esiasetettu Iptr := Addr ( A [ Nh + 1 ]) ; Pisteet := 0 ; Syntyvyys := 0 ; // Jatkotulokset kohteelle I := 1 to Nh do begin Inc ( Pisteet , Iptr ^ ) ; // Satunnainen crossover menestys R := Satunnainen ( 2 ) ; Inc ( Syntyvyyssuhde , Ranska ) ; A [ I ] := Iptr ^ * R ; Iptr ^ := 0 ; Inc ( Iptr , 1 ) ; loppu ; // Välisumma Inc ( C ) ; asti ( Pisteitä / N >= 1 ) tai ( C >= Suurin populaatio ) ; Writeln ( Muoto ( 'Väestö %d (nopeus:%f) pisteet:%f' , [ C , Syntyvyys / Nh , Pisteet / N ])) ; loppua .Sanakirjat ja tietosanakirjat | ||||
---|---|---|---|---|
|
Optimointimenetelmät _ | |
---|---|
Yksiulotteinen |
|
Nolla järjestys | |
Ensimmäinen tilaus | |
toinen tilaus | |
Stokastinen | |
Lineaariset ohjelmointimenetelmät _ | |
Epälineaariset ohjelmointimenetelmät |
Koneoppiminen ja tiedon louhinta | |
---|---|
Tehtävät | |
Opettajan kanssa oppimista | |
ryhmäanalyysi | |
Mittasuhteiden vähentäminen | |
Rakenteellinen ennustaminen | |
Anomalian havaitseminen | |
Piirrä todennäköisyysmallit | |
Neuroverkot | |
Vahvistusoppiminen |
|
Teoria | |
Lehdet ja konferenssit |
|