Bazele teoretice ale calculului evolutiv. Schema unui algoritm evoluţionist (EA)
I. CALCUL EVOLUTIV. SUPORTUL DE NATURĂ BIOLOGICĂ AL EC
Calculul evolutiv (EC) - domeniu al informaticii inspirat din procesul evoluţiei naturale: conexiunea evoluţie naturală – tehnica de rezolvare a problemelor de tip experiment-eroare (sau generare-testare).
Considerând un mediu care poate susţine un număr limitat de indivizi şi instinctul primar al fiecărui individ de a se reproduce, procesul de selecţie naturală favorizează indivizii cei mai competitivi în însuşirea resurselor supravieţuirea celor mai bine adaptaţi (survival of the fittest).
Pe parcursul reproducerii celor mai buni indivizi apar mutaţii ocazionale, care generează noi indivizi, ce vor fi ulterior evaluaţi.
Întregul proces poate fi asimilat din punct de vedere intuitiv cu modelul unui peisaj adaptiv (dinamic) în spaţiul 3D (0-x-y-z): un individ p(x,y,z) planul x-y corespunde caracteristicilor individului altitudinea lui p (valoarea lui pe axa 0z) corespunde nivelului de adaptabilitate (fitness). a individului reprezentat de p.
Evoluţia - procesul de “avans” al populaţiei spre zone aflate la o altitudine mai mare, acest avans fiind realizat pe baza mutaţiilor şi selecţiei naturale → legătura problemele multimodale (puncte de optim local).
II. TIPURI DE PROBLEME REZOLVATE DE EC
Probleme de optimizare: sunt cunoscute modelul şi datele de ieşire dorite, iar problema este de a determina datele de intrare care corespund rezultatelor dorite. Exemple: problema comis voiajorului; problema planificării activităţilor; probleme care pot fi formulate în termeni specifici claselor de probleme de optimizare: problema celor N regine
Probleme de modelare sau de identificare a sistemului: sunt cunoscute datele de intrare şi rezultatele corespunzătoare lor, iar modelul este necunoscut. Modelul trebuie determinat astfel încât, pentru fiecare intrare dată, să calculeze rezultatul corect. Exemplu : clasificarea supervizată în cazul modelului cu două clase.
III. SCHEMA GENERALĂ A UNUI EA
ALGORTIMUL GENERIC
IV. EXEMPLU: Rezolvarea unei probleme de optimizare a unei funcţii de o variabilă
Operaţia de încrucişare este aplicată pentru o împerechere aleatoare a câte 2 indivizi părinţi, cu probabilitatea pc. Progeniturile sunt supuse mutaţiei cu o probabilitate pm.
Mecanismul de selectare a noii generaţii este “superelitist” - presupune ordonarea descrescătoare a multisetului format din indivizii populaţiei curente şi progeniturile obţinute prin operatorii de variaţie şi selecţie a părinţilor şi alegerea primilor dim indivizi pentru a forma populaţia următoare.
Condiţia terminală este formulată astfel: a fost depăşit un prag al numărului de generaţii sau calitatea populaţiei, măsurată ca medie a funcţiei de evaluare în membrii populaţiei nu mai poate fi îmbunătăţită semnificativ.
Exemplu
1. Bazele teoretice ale calculului evolutiv. Evoluţia căutare directă-căutare stochastică. Componentele si clasificarea algoritmilor evoluţionişti Introducere Ideea de a aplica principiile darwiniste ale evoluţiei în rezolvarea automată a problemelor (Problem Solving - PS) datează din anii 1940, înaintea apariţiei calculatoarelor electronice. În 1948 Turing propunea o tehnică de rezolvare a problemelor numită căutare genetică sau evolutivă. În anii 1960 Fogel, Qwens şi Walsh introduceau conceptul de programare evolutivă (sau evoluţionistă), în timp ce Holland dezvolta algoritmii genetici. În aceeaşi perioadă, Rechenberg şi Schwefel introduceau strategiile evolutive (evoluţioniste) ca modalităţi alternative de rezolvare automată a problemelor. În anii 1990, Koza dezvoltă o nouă tehnică de căutare în spaţiul soluţiilor, programarea genetică. În terminologia actuală, întregul spectru de metode de rezolvare automată de inspiraţie darwinistă este desemnat prin termenul de calcul evolutiv (evoluţionist) şi include subdomeniile: programare evolutivă, strategii evolutive, algoritmi genetici şi programare genetică. Calculul evolutiv este un domeniu al informaticii inspirat din procesul evoluţiei naturale; ideea care stă la baza calculului evolutiv este conexiunea evoluţie naturală – tehnica de rezolvare a problemelor de tip experiment-eroare (sau generare-testare). Cu alte cuvinte, într-un mediu dat, indivizii constituiţi într-o populaţie intră în competiţie pentru a supravieţui şi a se reproduce. Abilitatea indivizilor de a-şi atinge aceste scopuri în mediul în care trăiesc este strict corelată cu şansele lor de supravieţuire şi multiplicare şi determină evoluţia în timp a populaţiei. În contextul modalităţii de rezolvare a problemelor de tip generare-testare stochastice, populaţia este modelată ca o colecţie de elemente candidat la soluţie. Calitatea candidaţilor la soluţie, definită în termenii gradului în care fiecare element rezolvă problema, determină şansa lor de a fi menţinuţi şi utilizaţi pentru construirea unor noi candidaţi. Suportul de natură biologică al calculului evolutiv Teoria evoluţionistă a lui Darwin oferă o explicaţie a diversităţii biologice şi a mecanismului care stă la baza acesteia. În centrul interpretării macroscopice a evoluţiei este plasată selecţia naturală. Considerând un mediu care poate susţine un număr limitat de indivizi şi instinctul primar al fiecărui individ de a se reproduce, procesul de selecţie este esenţial şi inevitabil în controlul dimensiunii populaţiei. Selecţia naturală favorizează indivizii cei mai competitivi în însuşirea resurselor, adică acei indivizi care sunt cel mai bine adaptaţi condiţiilor de mediu. Fenomenul este cunoscut drept supravieţuirea celor mai bine adaptaţi/ potriviţi (survival of the fittest). Teoria evoluţiei are ca principii fundamentale selecţia bazată pe competiţie şi variaţiile de fenotip în rândul membrilor populaţiei. Fenotipul este ansamblul de însuşiri şi caractere care se manifestă în mod vizibil la un individ şi care este determinat pe bază ereditară şi de condiţiile de mediu (DEX). Caracteristicile fenotipului unui individ determină gradul lui de adaptabilitate la condiţiile de mediu (fitness). Fiecare individ reprezintă o combinaţie unică de caracteristici ale fenotipului şi este evaluat de condiţiile de mediu. Dacă evaluarea este favorabilă, atunci fenotipul individului este propagat spre urmaşi (progenituri), altfel caracteristicile fenotipului dispar şi individul moare fără a se putea reproduce. Viziunea lui Darwin despre evoluţie este aceea că, în procesul trecerii de la o generaţie la alta prin reproducere, apar mutaţii (variaţii) mici, aleatoare, în caracteristicile fenotipului. Ca rezultat al acestor variaţii, apar şi sunt evaluate noi combinaţii de caracteristici ale fenotipului. Cele mai bune dintre ele supravieţuiesc şi se reproduc şi în acest mod evoluţia conduce la progres. Modelul primar poate fi deci rezumat după cum urmează. O populaţie este formată dintrun număr de indivizi, priviţi ca unităţi de selecţie; succesul fiecărui individ în încercarea de a se
reproduce depinde de cât de bine este adaptat condiţiilor de mediu comparativ cu restul indivizilor. Pe parcursul reproducerii celor mai buni (bine adaptaţi la mediu) indivizi, apar mutaţii ocazionale, care generează noi indivizi, ce vor fi ulterior evaluaţi. În consecinţă, pe măsură ce timpul trece, se produc schimbări în structura populaţiei, cu alte cuvinte populaţia reprezintă o unitate a evoluţiei. Întregul proces poate fi asimilat din punct de vedere intuitiv cu modelul unui peisaj adaptiv (dinamic) (respectiv o suprafaţă adaptive) în spaţiul 3D (0-x-y-z). Fiecare punct p(x,y,z) al suprafeţei este asimilat unui individ, unde în planul x-y este figurată combinaţia de caracteristici ale fenotipului individului, iar altitudinea lui p (valoarea lui pe axa 0z) corespunde nivelului de adaptabilitate (fitness) a individului reprezentat de p. În acest context, evoluţia este procesul de “avans” al populaţiei spre zone aflate la o altitudine mai mare, acest avans fiind realizat pe baza mutaţiilor şi selecţiei naturale. Este obţinută astfel legătura cu conceptul de probleme multimodale, adică probleme în care există o mulţime de puncte de optim local (superioare tuturor soluţiilor din vecinătatea lor), cel mai bun element al mulţimii fiind optimul global. O problemă în care există un singur optim local este numită unimodală. Legătura dintre procesul evoluţiei şi un proces de optimizare este pe cât de directă, pe atât de înşelătoare, pentru că evoluţia nu presupune întotdeauna creşterea globală a calităţii populaţiei (în termenii funcţiei de fitness). Deoarece, la fiecare epocă, populaţia este finită şi operatorii de selecţie şi mutaţie includ componente aleatoare, poate fi constatată o inactivitate genetică, manifestată fie prin dispariţia din populaţie a unor indivizi foarte adaptaţi condiţiilor de mediu, fie prin variaţia foarte mică sau chiar lipsa de variaţie a unor caracteristici ale fenotipului indivizilor din populaţie. Unul din efectele posibile este acela al concentrării indivizilor într-o zonă de adaptabilitate scăzută. Efectul rezultat prin combinarea procesului de selecţie cu inactivitatea genetică poate conduce în egală măsură la creşterea nivelului de adaptabilitate globală a populaţiei, respectiv la descreşterea acestuia. În plus, nu există nici o garanţie că, dacă evoluţia duce la creşterea calităţii populaţiei, nivelul de optim local nu a fost deja atins înaintea unui fenomen de inactivitate genetică. În scopul evitării “ciclării” evoluţiei populaţiei într-o regiune de optim local, au fost dezvoltate o serie de teorii, una dintre cele mai cunoscute fiind teoria lui Wright conform căreia poate fi determinat optimul global în cazul unei suprafeţe fixe (teorie referită drept shifting balance). Tipuri de probleme ce pot fi rezolvate pe baza calculului evolutiv În literatura de specialitate sunt evidenţiate două clase de metode PS de inspiraţie biologică: calculul neuronal (neurocomputing), prin intermediul căruia problemele sunt rezolvate imitând modul de funcţionare (raţionament) a (al) creierului uman şi procesele de tip evolutiv, problemele fiind rezolvate prin imitarea creării creierului uman. În general, un sistem funcţional de rezolvare automată a problemelor conţine trei componente: datele de intrare, datele de ieşire şi modulul intern care conectează primele două componente. Modalitatea de funcţionare a modelului permite explicarea modului de funcţionare a sistemului, în sensul că, răspunsul sistemului poate fi calculat pentru orice date de intrare specificate. În funcţie de componentele din sistem cunoscute, pot fi diferenţiate următoarele tipuri de probleme: Probleme de optimizare: sunt cunoscute modelul şi datele de ieşire dorite (respectiv o descriere a acestora), iar problema este de a determina datele de intrare care corespund rezultatelor dorite. Un exemplu de astfel de problemă este cea a comis voiajorului (în care trebuie determinat cea mai scurtă sau ieftină rută care să lege un număr dat de oraşe): modelul este cunoscut şi corespunde formulei de calcul a lungimii unei rute date, în care lungimea (sau costul) calculată (calculat) este data de ieşire. Proprietatea pe care rezultatul trebuie să o îndeplinească este un criteriu de optim (lungime minimă), iar problema este de a determina acea dată de intrare, corespunzătoare unei rute, care să conducă la rezultatul dorit. O problemă de optimizare rezolvată cu succes prin calcul evolutiv este generarea orarului în cadrul unei universităţi. În cursul unei zile sunt programate în general mii de activităţi, restricţiile pe care trebuie să la îndeplinească o
programare corectă a acestora fiind multiple iar soluţiile fezabile ale problemei în număr foarte mic relativ la mulţimea tuturor programărilor posibile. Probleme de modelare sau de identificare a sistemului: sunt cunoscute datele de intrare şi rezultatele corespunzătoare lor, iar modelul este necunoscut. Modelul trebuie determinat astfel încât, pentru fiecare intrare dată, să calculeze rezultatul corect. Un exemplu de astfel de problemă: clasificarea supervizată în cazul modelului cu două clase. Problema este de a determina un clasificator care să separe corect elementele celor două clase. Datele de intrare corespund elementelor celor două clase, pentru fiecare dată de intrare rezultatul fiind eticheta clasei de provenienţă. Identificarea modelului revine la determinarea unei funcţii de decizie, care, de exemplu, să calculeze valori pozitive pentru exemplele care provin din prima clasă, respectiv valori negative pentru celelalte. Cu alte cuvinte, în acest caz scopul este de a determina o formulă (în acest caz expresia analitică a unei funcţii de decizie) care să „lege” datele de intrare (cunoscute) de rezultate (cunoscute). Problemele de acest tip apar în medii în care sunt disponibile foarte multe date (observaţii, înregistrări etc.), de exemplu în situaţii în care există un set de dimensiuni considerabile de observaţii/înregistrări asupra/ relative la un fenomen/ eveniment. Identificarea modelului care să explice conexiunile dintre datele de intrare şi rezultate trebuie realizată şi astfel încât acesta să asigure o capacitate de generalizare rezonabilă (pentru noi date de intrare, sistemul trebuie să furnizeze în general răspunsuri corecte). Astfel de probleme sunt cele din domeniile instruirii automate (machine learning) şi data mining. Probleme de simulare: sunt cunoscuţi modelul şi o serie de date de intrare şi cerinţa este de a determina datele de ieşire corecte, corespunzătoare intrărilor date. Un exemplu de probleme de simulare care pot fi rezolvate utilizând calculul evolutiv sunt cele în care este căutat răspunsul la întrebări de tipul “ce se întâmplă dacă” (what-if questions), în condiţiile în care problema subiectului investigat evoluează (în termenii operaţiilor de variaţie şi selecţie). Economia evolutivă este un domeniu de cercetare relativ nou, care, în principiu, are la bază ideea că jocul şi jucătorii din arena socio-economică sunt asemenea evoluţiei vieţii (a “jocului” şi “jucătorilor” ei).
2. Algoritmi evolutivi În literatura de specialitate sunt prezentate diverse clase de algoritmi evolutivi (EA – Evolutionary Algorithms), toate având la bază acelaşi principiu: dată fiind o populaţie de indivizi, influenţa mediului determină un proces de selecţie naturală (indusă de adaptabilitatea fiecărui individ la mediu), care are ca efect creşterea globală a calităţii populaţiei, exprimată prin intermediul funcţiei de fitness. 2.1. Schema generală a algoritmilor evolutivi Dacă este cunoscută o funcţie de tip calitate care trebuie maximizată, setul iniţial de candidaţi la soluţie (elemente din mulţimea ) poate fi generat aleator, fiind obţinută astfel populaţia iniţială, ( ). Pentru fiecare , reprezintă calitatea candidatului x (ca măsură abstractă de evaluare – funcţie de tip fitness). Populaţia următoare este determinată pe baza funcţiei de evaluare prin aplicarea următorului mecanism. Este selectată , o submulţime a lui formată din cei mai “buni” membri ai populaţiei curente, adică din acele elemente cu cele mai bune scoruri obţinute în urma evaluării prin . Membrii mulţimii generează populaţia următoare prin aplicarea operatorilor de recombinare şi/sau mutaţie. Operaţia de recombinare (recombination) este definită pentru doi sau mai mulţi indivizi din mulţimea (numiţi părinţi) şi are ca rezultat unul sau mai mulţi noi candidaţi la soluţie (numiţi copii). Operatorul mutaţie este definit pe un element al mulţimii şi are drept rezultat un nou candidat la soluţie. Prin aplicarea operatorilor de recombinare şi mutaţie sunt generaţi noi indivizi (numiţi progenituri ai mulţimii ) care intră în competiţie, pe baza măsurii de fitness (posibil şi a vârstei), cu elementele populaţiei pentru obţinerea „unui loc” în populaţia următoare, . Procesul poate fi iterat fie până la obţinerea unui candidat suficient de bun (soluţia problemei, corespunzând unui punct de maxim al funcţiei ), fie până la atingerea unei limite de calcul date. În cadrul acestui proces intervin două elemente fundamentale care constituie baza sistemelor evoluţioniste: operatorii de variaţie (recombinare şi mutaţie), care asigură diversitatea necesară creării de indivizi cu caracteristici noi şi selecţia, care “forţează” creşterea calităţii indivizilor unei populaţii. Combinarea aplicării operatorilor de variaţie şi selecţie determină în general creşterea calităţii globale de la o populaţie la populaţia următoare. Un astfel de algoritm poate fi privit ca o evoluţie a procesului de optimizare prin “apropierea” succesivă de valoarea optimă. Alternativ, procesul evolutiv poate fi considerat un proces de adaptare. Din această perspectivă, măsura de adaptabilitate (de fitness) este o expresie a cerinţelor mediului în care evoluează populaţia şi nu o funcţie obiectiv care trebuie optimizată. Măsura în care sunt atinse cerinţele mediului este direct proporţională cu măsura de viabilitate şi este reflectată în numărul de progenituri. Procesul evolutiv determină obţinerea de populaţii succesive din ce în ce mai bine adaptate mediului în care trăiesc. O serie de componente ale unui proces evolutiv sunt stochastice. De exemplu, deşi indivizii mai bine adaptaţi mediului au o şansă mai mare să fie selectaţi pentru generarea de noi candidaţi soluţie, în cele mai multe tipuri de implementări evolutive şi indivizii mai “slabi” au o şansă de a deveni părinte sau de a supravieţui (în sensul selectării lor în populaţia sau generaţia următoare). De asemenea, în cadrul operaţiei de recombinare, alegerea perechilor sau n-tuplurilor (secvenţe de n elemente) de indivizi care interschimbă material genetic, dar şi părţile (fracţiunile) de material genetic interschimbat sunt aleatoare. În mod similar, la efectuarea unei mutaţii, atât
porţiunile din individ care vor suferi mutaţia cât şi noile părţii care le înlocuiesc sunt alese aleator. În continuare este prezentată schema generală a unui algoritm evolutiv. Pas1. Iniţilizarea populaţiei:
este obţinută prin generarea aleatoare a candidaţilor la
soluţie Pas2. Evaluarea candidaţilor: pentru fiecare , determină Pas3. Repetă 3.1. Selectează mulţimea de părinţi 3.2. Recombină perechi (sau n-tupluri) de părinţi 3.3. Efectuează mutaţii asupra progeniturilor rezultate 3.4. Evaluează noii candidaţi la soluţie 3.5. Selectează indivizii pentru constituirea generaţiei următoare, 3.6. până când (Condiţie_terminare este satisfăcută)
;
Observaţii 1. Schema prezentată mai sus corespunde familiei metodelor PS de tip generare-testare, pe baza următoarelor consideraţii. În cadrul algoritmilor evolutivi sunt procesaţi simultan membrii unei întregi populaţii, combinarea informaţiilor oferite de doi sau mai mulţi candidaţi fiind realizată în principal prin operaţia de recombinare. De asemenea, algoritmii evolutivi sunt de tip stochastic. 2. Funcţia de evaluare (de fitness) este o estimare de tip euristic a calităţii fiecărui membru al populaţiei curente, iar procesul de căutare este dirijat de operatorii de variaţie şi selecţie. Diferitele tipuri de algoritmi evolutivi menţionaţi în partea 1 respectă schema generală prezentată mai sus şi diferă între ele printr-o serie de detalii tehnice, cum este de exemplu modalitatea de reprezentare a unui candidat la soluţie (tipul sau structura de date utilizat/utilizată pentru reprezentarea membrilor populaţiei). În cazul clasei algoritmilor genetici (GA – Genetic Algorithms), un candidat la soluţie este reprezentat prin intermediul unui şir definit pe un alfabet finit. Strategiile evolutive (ES- Evolution Strategy) utilizează vectori cu numere reale pentru a reprezenta membrii populaţiei, în timp ce în programarea evolutivă (EP – Evolutionary Programming) sunt utilizate reprezentările prin maşini cu stări finite. Clasa algoritmilor GP (programare genetică) este dezvoltată pe baza reprezentărilor candidaţilor la soluţie prin intermediul structurii de arbore. Selectarea unei reprezentări a membrilor populaţiei în detrimentul altor variante posibile este realizată astfel încât să fie cel mai bine potrivită problemei particulare de rezolvat, în sensul că uşurează implementarea algoritmului evolutiv sau este cea mai naturală relativ la problema dată. Evident, selectarea operatorilor de recombinare şi mutaţie ţine cont de varianta aleasă pentru reprezentarea candidaţilor la soluţie.
2.2. Componentele algoritmilor evolutivi Componentele de bază ale algoritmilor evolutivi sunt: reprezentarea (definirea membrilor populaţiei), funcţia de evaluare (de tip fitness), populaţia, mecanismul de selectare a părinţilor (indivizii care interschimbă material genetic), operatorii de variaţie (recombinarea şi mutaţia), mecanismul de selectare a membrilor generaţiei următoare (actualizarea populaţiei), definirea modulului de iniţializare (modalitatea de determinare a populaţiei iniţiale) şi definirea condiţiei terminale.
Reprezentarea Prima etapă în dezvoltarea unui algoritm evolutiv este stabilirea unei conexiuni între contextul problemei particulare de rezolvat şi spaţiul în care evoluează tehnica PS considerată. Obiectele care formează soluţiile posibile în contextul problemei de rezolvat sunt numite fenotipuri, reprezentarea lor în contextul spaţiului EA fiind referită prin genotip. Scopul este de a stabili o corespondenţă între mulţimea fenotipurilor şi cea a genotipurilor, numită reprezentare. De exemplu, dacă problema particulară este de optimizare în mulţimea numerelor întregi, un set prestabilit de numere întregi poate constitui mulţimea fenotipurilor, în timp ce setul genotipurilor este constituit din reprezentarea binară a fiecărui fenotip. Observaţie. Spaţiul fenotipurilor poate fi foarte diferit de cel al genotipurilor, cel în care evoluează un EA. O soluţie este corespunzătoare unui fenotip “bun” şi este obţinută prin decodificarea celui mai bun (din punctul de vedere al funcţiei de evaluare) genotip rezultat în urma aplicării EA. Ca terminologie, obiectele aparţinând spaţiului problemei particulare de rezolvat sunt referite prin candidaţi la soluţie, fenotipuri sau indivizi. Spaţiul pe care este definită problema este numit spaţiul fenotipurilor. Obiectele ce aparţin spaţiului în care este dezvoltat un EA sunt referite prin termenii de genotipuri, cromozomi sau indivizi. Spaţiul în care evoluează EA este numit spaţiul genotipurilor. În general, un genotip este constituit din mai multe elemente, numite valori sau alele, fiecare fiind plasat într-o anumită poziţie, referită prin termenul de variabilă sau genă. Observaţie. Termenul reprezentare este utilizat în două moduri diferite. În unele situaţii desemnează transformarea aplicată spaţiului fenotipurilor astfel încât să fie obţinut spaţiul genotipurilor, caz în care termenul utilizat este şi cel de codificare (în exemplul considerat mai sus, fiecare genotip este codificarea binară a unui fenotip). Transformarea inversă, aplicată spaţiului genotipurilor pentru a obţine spaţiul fenotipurilor este numită decodificare. Evident, în acest caz reprezentarea trebuie să fie inversabilă: fiecărui genotip trebuie să îi corespundă cel puţin un fenotip. În alte situaţii, în definirea unei reprezentări accentul este pus cu precădere pe structura de date utilizată pentru definirea spaţiul genotipurilor şi nu pe transformarea propriuzisă. Această interpretare este legată spre exemplu de definirea operatorului mutaţie pe spaţiul genotipurilor constituite din reprezentările binare ale fenotipurilor. Funcţia de evaluare Rolul funcţiei de evaluare (de fitness) este de a măsura gradul de adaptabilitate a fiecărui individ la mediul în care trăieşte, mai exact este de definire a noţiunii de calitate. Funcţia de evaluare stă la baza procesului de selecţie şi, din perspectiva tehnicilor PS, reprezintă modulul de rezolvare a problemei date în contextul evolutiv. Din punct de vedere tehnic, este o funcţie care asociază fiecărui genotip o măsură a calităţii şi, în general, este derivată pe baza unei funcţii de tip calitate definită pe spaţiul fenotipurilor. De exemplu, dacă este funcţia de calitate definită pe spaţiul fenotipurilor, format din numere din mulţimea şi fiecare genotip este reprezentarea binară a unui fenotip, atunci funcţia de evaluare în spaţiul genotipurilor este definită prin, De exemplu, pentru , atunci . În cele mai multe situaţii, problema de rezolvat utilizând EA revine la o problemă de optimizare. Dacă funcţia obiectiv trebuie minimizată, atunci este realizată o transformare a ei astfel încât problema de optim să fie una de maxim (din punct de vedere matematic, de exemplu, a minimiza o funcţie f este echivalent cu a maximiza funcţia –f sau, în situaţia în care f nu se
anulează pe spaţiul fenotipurilor, cu a maximiza funcţia ). În acest caz, funcţia de evaluare este definită pe baza funcţiei obiectiv şi ţinând cont de reprezentarea fenotipurilor în spaţiul EA. Observaţie. În continuare, prin cel mai bun individ al unei populaţii vom înţelege acel individ care realizează maximul funcţiei de evaluare pe acea populaţie. Populaţia Rolul populaţiei în dezvoltarea EA este de a menţine o mulţime de genotipuri corespunzătoare unor soluţii posibile. O populaţie este un multiset (o mulţime de elemente nu neapărat distincte) de genotipuri. Indivizii unei populaţii sunt obiecte statice, în sensul că nu pot fi modificaţi şi nu se pot adapta mediului în care trăiesc. Aceste proprietăţi le are, în schimb populaţia. Dacă este stabilit modul de reprezentare (spaţiul genotipurilor), populaţia poate fi definită prin specificarea numărului de indivizi care o compun. În situaţia unor EA complecşi, populaţiei îi este asociată şi o structură spaţială adiţională, definită prin intermediul unei funcţii de tip distanţă sau prin relaţii de tip vecinătate. În astfel de cazuri, definirea populaţiei trebuie însoţită de specificarea structurii spaţiale asociate. Operatorii genetici de selecţie (selecţia indivizilor care interschimbă material genetic – părinţi- şi selecţia populaţiei la momentul de timp următor) sunt definiţi la nivelul unei populaţii şi, în general, construcţia lor presupune consultarea întregii populaţii curente. De exemplu, cel mai bun individ al unei populaţii date poate fi selectat pentru a genera populaţia următoare sau cel mai slab individ al unei populaţii date este înlocuit cu unul nou. În cele mai multe situaţii, EA folosesc populaţii de dimensiune constantă pe tot parcursul evoluţiei. Diversitatea unei populaţii este măsurată în termenii numărului de indivizi distincţi ai populaţiei. Există mai multe variante de definire a măsurii de diversitate: numărul valorilor distincte ale funcţiei de evaluare (deşi, dacă , nu rezultă ), numărul fenotipurilor diferite reprezentate în cadrul populaţiei (deşi prezenţa unui fenotip în spaţiul iniţial nu garantează prezenţa unui singur genotip în spaţiul EA: în cadrul populaţiei, repetarea unui genotip este echivalentă fie cu selectarea pentru includere a unui fenotip de mai multe ori, la generarea populaţiei iniţiale, respectiv cu selectarea repetată a unui genotip în construirea unei noi populaţii, de exemplu datorită valorii mari a funcţiei de evaluare corespunzătoare lui), numărul genotipurilor diferite din populaţie (un genotip corespunde unui singur fenotip şi valoarea funcţiei de evaluare corespunzătoare lui este unică), măsuri bazate pe entropia populaţiei ş.a.m.d. Mecanismul de selectare a părinţilor Rolul operatorului de selectare a părinţilor este de a distinge între indivizii populaţiei pe baza calităţii acestora, în particular de a permite celor mai buni indivizi să se reproducă, deci să participe la generarea populaţiei următoare. Alături de operatorul de selecţie a „supravieţuitorilor” (indivizii care vor compune generaţia următoare), mecanismul de selecţie a părinţilor forţează îmbunătăţirea calităţii globale a populaţiei de la o generaţie la alta. În calculul evolutiv, selectarea părinţilor este de tip probabilist: alegerea unui individ pentru a se reproduce depinde direct proporţional de calitatea lui, deci un individ are şanse mai mari de a se reproduce comparativ cu cei inferior lui din punct de vedere calitativ. Observaţie. Indivizii “slabi” (cu valori mici ale funcţiei de evaluare) nu sunt eliminaţi din procesul de selectare pentru reproducere, ci doar au asociate probabilităţi mici, dar nenule, de selecţie. În acest fel algoritmul de căutare nu este de tip greedy şi riscul de identifica o valoare de optim local fiind diminuat în acest fel. Operatorii de variaţie: mutaţia şi recombinarea Scopul aplicării operatorilor de variaţie este de a crea noi indivizi, derivaţi din cei ai populaţiei curente. Din punctul de vedere al rezolvării problemelor prin metode de căutare de tip generare-testare, prin aplicarea operatorilor de variaţie este realizată faza de generare. Definirea
operatorilor de variaţie depinde esenţial de modalitatea de reprezentare a spaţiului iniţial (definirea spaţiului genotipurilor). Operatorul mutaţie Mutaţia este operator unar (cu aritate 1), în urma aplicării acestuia asupra unui genotip rezultă o variantă “mutantă”, numită progenitură sau copil. Operatorul mutaţie este întotdeauna stochastic, rezultatul depinzând de o serie de alegeri aleatoare. În general aceste alegeri constau în utilizarea unui generator de numere aleatoare din diferite distribuţii de probabilitate şi sunt numite extrageri aleatoare. Rolul mutaţiei în calculul evolutiv depinde de tipul de algoritm implementat. De exemplu, în cazul algoritmilor genetici, mutaţia are rolul de a „împrospăta” structura genetică a unei populaţii, în cazul programării evolutive este unicul operator de variaţie care dirijează procedura de căutare, în timp ce în cazul programării genetice în general nu este folosit. Din studiul teoretic al convergenţei algoritmilor evolutivi rezultă că optimul global al funcţiei obiectiv poate fi obţinut în situaţia în care operatorii de variaţie utilizaţi asigură obţinerea oricărui genotip soluţie potenţială a problemei de optim (Eiben, Smith, 2003). Cea mai simplă cale de a asigura îndeplinirea acestei codiţii este de a utiliza un operator mutaţie care să permită modificarea oricărei alele dintr-un cromozom cu orice variantă posibilă, cu o probabilitate nenulă. În literatura de specialitate există însă şi opinii conform cărora rezultatele teoretice relative la comportamentul EA au o importanţă practică redusă şi multe implementări EA nu posedă proprietăţile cerute de acestea. Operatorul de recombinare Un operator de variaţie binar (cu aritate 2) este numit operator de recombinare sau încrucişare şi are ca efect obţinerea unuia sau a două genotipuri urmaş direct prin combinarea informaţiei purtate de două genotipuri părinte. Recombinarea este un operator stochastic: alegerea acelor părţi ale genotipurilor părinţi care vor fi combinate şi modalitatea de recombinare rezultă în urma unor extrageri aleatoare. Rolul recombinării diferă de la o clasă de algoritmi evolutivi la alta: în cadrul algoritmilor genetici este cel mai utilizat operator de variaţie (probabilitatea de efectuarea a unei încrucişări este în general mult mai mare decât probabilitatea apariţiei unei mutaţii), în programarea genetică este în general unicul operator de variaţie folosit, în timp ce în programarea evolutivă nu este implementat. În dezvoltări de tip EA pot fi folosiţi şi operatori de recombinare de aritate mai mare decât 2 (în generarea urmaşilor sunt folosiţi mai mult de două genotipuri părinte). Astfel de operatori sunt uşor de implementat dar nu au corespondent biologic. Deşi o serie de studii indică utilitatea acestora în tratarea unor probleme particulare, aceşti operatori sunt rar folosiţi. Prin împerecherea a două genotipuri părinte cu caracteristici diferite şi superioare calitativ pot fi obţinute progenituri care să îmbine caracteristicile celor doi părinţi. Acest principiu are un fundament biologic extrem de solid: a fost utilizat de cultivatorii de plante şi crescătorii de animale pentru a produce specii cu randament superior sau care să prezinte caracteristici îmbunătăţite. Aplicarea EA determină crearea de urmaşi direcţi prin încrucişări aleatoare, fiind acceptată ideea că unii dintre aceştia pot avea însuşiri nedorite, majoritatea pot fi calitativ similari sau chiar inferiori părinţilor şi doar o mică parte dintre ei pot avea caracteristici superioare părinţilor. Mecanismul de selectare a supravieţuitorilor (înlocuirea populaţiei curente) Rolul acestui operator, numit şi selecţia mediului sau strategia de înlocuire a populaţiei curente, este de a diferenţia indivizii în funcţie de calitatea lor. Din acest punct de vedere este similar procesului de selecţie a părinţilor dar este utilizat într-o etapă diferită a evoluţiei unui EA. Mecanismul de selecţie a membrilor următoarei generaţii este aplicat după generarea progeniturilor indivizilor populaţiei curente şi, deoarece dimensiunea populaţiei este în general constantă în timp, revine la aplicarea unei funcţii de decizie fiecărui individ aparţinând populaţiei
curente sau mulţimii progeniturilor. Funcţia de decizie aplicată unui individ exprimă proprietatea acestuia de a fi selectat pentru includerea în populaţia următoare (proprietatea de a fi supravieţuitor) şi este de obicei construită pe baza funcţiei de evaluare, luând în calcul calitatea fiecărui individ şi, în unele situaţii, factorul vârstă (de câte generaţii este menţinut u individ). În general selecţia mediului este un proces determinist. Obţinerea generaţiei următoare poate fi realizată, de exemplu, fie prin ordonarea indivizilor multisetului obţinut prin reuniunea populaţiei curente cu multisetul progeniturilor şi selectarea celor mai buni indivizi (funcţie de decizie bazată pe funcţia de evaluare), fie prin selectarea indivizilor exclusiv din multisetul urmaşilor direcţi (funcţie de decizie bazată pe factorul vârstă). Iniţializarea În majoritatea EA, crearea populaţiei iniţiale este realizată prin generare aleatoare de fenotipuri şi apoi obţinerea multisetului de genotipuri asociat. De asemenea, în funcţie de problema particulară de rezolvat, generarea populaţiei iniţiale poate fi realizată şi pe baza unor euristici care să asigure obţinerea unor indivizi cu adaptabilitate ridicată. Condiţia terminală Condiţia terminală în EA este stabilită în funcţie de tipul de problemă de rezolvat, în felul următor. Dacă problema are o valoare de optim cunoscută, atunci un posibil criteriu de oprire este atingerea acelei valori sau atingerea acelei valori cu o eroare dată . Dar, deoarece algoritmii evolutivi sunt stochastici şi nu garantează atingerea valorii optime, criteriul poate să nu fie satisfăcut la nici o iteraţie, deci el trebuie reformulat. Cele mai utilizate opţiuni sunt: atingerea unui număr maxim de iteraţii (generaţii); atingerea unui număr maxim de evaluări ale calităţii indivizilor; pentru o anumită perioadă de timp (un număr de iteraţii specificat sau un număr de evaluări specificat) calitatea populaţiei curente nu este semnificativ îmbunătăţită (este sub un prag dat); diversitatea populaţiei scade sub un prag dat. În situaţia în care problema de rezolvat nu are un optim cunoscut, poate fi utilizată oricare din variantele menţionate mai sus. 2.3. Evoluţia căutare directă-căutare stochastică. Metodele hill climbing şi simulated annealing Evoluţia căutare directă-căutare stochastică cuprinde două tehnici care reduc din dezavantajele căutărilor directe, şi anume metode de tip “hill climbing” şi “simulated annealing”. Metodele de tip “hill climbing” utilizează o tehnică de iterativitate îmbunătăţită. Aceasta se aplică unui singur punct din spaţiul de căutare. La o iteraţie este selectat un nou punct aflat într-o vecinătate a punctului curent procesat. Dacă acest punct determină o valoare mai bună (din punct de vedere al criteriului de optim considerat) pentru funcţia obiectiv, el devine punct curent. În caz contrar, este selectată o altă vecinătate a punctului curent, procesul desfăşurându-se ulterior similar. Algoritmul se încheie când nici un punct vecin celui curent nu aduce îmbunătăţiri valorilor funcţiei obiectiv. Metodele de acest tip conduc de obicei la valori de optim local, depinzând de punctul de start. În plus, nu se pot furniza informaţii referitoare la eroarea relativă a soluţiei calculate. Pentru a creşte performanţele unor astfel de modele, acestea se utilizează pentru un număr mare de punct de start. Metodele de tip“simulated annealing” elimină o mare parte din dezavantajele algoritmilor “hillclimbing”, în sensul că soluţiile nu depind de punctul de start şi sunt de obicei apropiate de punctul de optim global. Pentru aceasta, este considerată o probabilitate de acceptare a punctului selectat drept următor punct curent, egală cu 1 dacă noul punct furnizează o valoare mai bună
pentru funcţia obiectiv considerată. În unele situaţii, probabilitatea de a accepta un nou punct este o funcţie cu valori corespunzătoare funcţiei obiectiv pentru punctul curent şi noul punct selectat. De asemenea, faţă de tehnica “hill climbing”, este considerat un parametru de tip temperatura sistemului, care influenţează probabilitatea de acceptare a unui nou punct ca punct curent: cu cât acest parametru este mai scăzut, cu atât şansele de acceptare sunt mai mici. Pe parcursul execuţiei algoritmului, temperatura sistemului scade; algoritmul se încheie pentru o temperatură mică, pentru care nu se mai acceptă nici o modificare a soluţiei (probabilitatea de acceptare a unui nou punct este 0). Structurile algoritmilor de tip “hill climbing” şi “simulated annealing” Fie f funcţia obiectiv care se doreşte maximizată (dacă principiul de optimalitate este minimul, atunci problema minimizării funcţiei obiectiv f în anumite condiţii de constrângere revine la maximizarea funcţiei –f) . Considerând reprezentarea cromozomială a unei soluţii potenţiale de tip binar, ca un şir de nr biţi, punctele curent respectiv nou fiind desemnate prin vc respectiv vn, algoritmii „hill climbing” şi „simulated annealing” sunt descrişi după cum urmează. Fie MAX numărul punctelor de start. Procedura următoare calculează v, un cel mai bun punct din cele MAX puncte obţinute în urma aplicării tehnicii de tip “hillclimbing” (memorate în vectorul V). procedure hillclimbing begin t=0 repeat local=false selectează aleator un punct curent vc evaluează vc repeat selectează nr puncte din vecinătatea lui vc prin modificarea fiecărui bit al lui vc selectează un punct vn dintre cei nr generaţi anterior, cu funcţia obiectiv maximă if f(vc)
selectează vn în vecinătatea lui vc (prin modificarea unui bit din vc) if f(vc)
şi [t] este partea întreagă a umărului t. Dacă funcţia de optimizat depinde de mai multe variabile, fiecare dintre ele este reprezentată conform observaţiei de mai sus, un cromozom fiind constituit din concatenarea fiecărei reprezentări binare corespunzătoare unei variabile. Exemple. Fie . Lungimea intervalului este 15,1. Dacă precizia dorită este de 4 zecimale, atunci domeniul considerat trebuie divizat în 15,1 104=151000 intervale, deci m=18. a) Fie . Atunci
Rezultă şi Într-adevăr,
b) Fie
. Atunci
Obţinem şi Într-adevăr,
Exemple de aplicare a algoritmului hillclimbing. Rezolvarea unei probleme de optimizare a unei funcţii de o variabilă 1. Fie
, definită prin
Problema este de a calcula valoarea maximă a funcţiei Graficul funcţiei este prezentat în figura următoare.
pe intervalul
.
Implementarea algoritmului “hill climbing” poate fi realizată astfel. % functia obiectiv function [val]=f_obiectiv(x); val=x.^1/3-3*sin(7*x+0.2)+2*cos(x/5-0.4)+1; end % reprezentarea cromozomiala y, pe m biti, a unui numar x din [a,b] cu % nz zecimale exacte function [y,m]=repr_sir_bin(x,a,b,nz);
nr=(b-a)*(10^nz); m=fix(log2(nr))+1; z=fix((x-a)*(2^m-1)/(b-a)); y=bitget(z,m:-1:1); end % obtinerea fenotipului corespunzator function [t]=repr_reale(y,m,a,b); x=0; for i=1:m x=bitset(x,m-i+1,y(i)); end; t=a+x*(b-a)/(2^m-1); end % implementarea algoritmului function [val,v]=hillclimbing(a,b,nz,MAX); % aici a=-1 si b=1, pentru a rezolva problema data [y,m]=repr_sir_bin(0,a,b,nz); V=[]; %m este numarul de biti pe care este reprezetat un numar din [a,b] cu %precizia de nz zecimale for t=1:MAX local=0; vc=unifrnd(a,b); valm=f_obiectiv(vc); if (t==1) val=valm; v=vc; end; while(local==0) %calculul vecinilor, insotit de valorile functiei obiectiv [y,m]=repr_sir_bin(vc,a,b,nz); valc=f_obiectiv(vc); ny=zeros(m,m+1); for i=1:m ny(i,1:m)=y(1:m); ny(i,i)=not(y(i)); vn=repr_reale(ny(i,1:m),m,a,b); ny(i,m+1)=f_obiectiv(vn); end; nys=sortrows(ny,m+1); if(nys(m,m+1)>valc) vc=repr_reale(nys(m,1:m),m,a,b); valm=nys(m,m+1); else local=1; end; end; if(valm>val) val=valm; v=vc; timp=t; end; V=[V vc]; end; disp(v); disp(val); plot_obiectiv(V,timp,a,b); end function []=plot_obiectiv(V,timp,a,b);
figure x=a:0.001:b; plot(x,x.^1/3-3*sin(7*x+0.2)+2*cos(x/5-0.4)+1,'k-'); hold on [xx dim]=size(V); disp(dim); for i=1:dim x=V(i); y=f_obiectiv(V(i)); plot(x,y,'rs'); hold on end; x=V(timp); y=f_obiectiv(V(timp)); plot(x,y,'bs'); end
La un apel hillclimbing(-1,1,4,5); pot fi obţinute rezultatul: punctul în care este atins maximul 0.6476 maximul calculat 6.1425 şi evoluţia
La un apel hillclimbing(-1,1,4,2); pot fi obţinute rezultatul: punctul în care este atins maximul -0.2495 maximul calculat 5.7169 şi evoluţia
La un alt apel hillclimbing(-1,1,4,2); pot fi obţinute rezultatul: punctul în care este atins maximul 0.6476 maximul calculat 6.1425 şi evoluţia
2. Optimizarea unei funcţii de mai multe variabile. Fie , definită prin
Problema este de a calcula valoarea maximă a funcţiei pe . Implementarea algoritmului hill climbing în acest caz poate fi realizat astfel. function [val,v]=hillclimbing(a,b,nz,MAX); [y,m]=repr_sir_bin(0,a,b,nz); V=[]; %m este numarul de biti pe care este reprezetat un numar din [a,b]x[a,b] %cu precizia de nz zecimale for t=1:MAX local=0; vc=unifrnd(a,b,1,2); valm=f_obiectiv(vc(1),vc(2)); if (t==1) val=valm; v=vc; end; while(local==0) %calculul vecinilor, insotit de valorile functiei obiectiv for i=1:2 [y((i-1)*m+1:i*m),m]=repr_sir_bin(vc(i),a,b,nz); end; valc=f_obiectiv(vc(1),vc(2)); ny=zeros(2*m,2*m+1); for i=1:2*m ny(i,1:2*m)=y(1:2*m); ny(i,i)=not(y(i)); vn(1)=repr_reale(ny(i,1:m),m,a,b); vn(2)=repr_reale(ny(i,m+1:2*m),m,a,b); ny(i,2*m+1)=f_obiectiv(vn(1),vn(2)); end; nys=sortrows(ny,2*m+1); if(nys(2*m,2*m+1)>valc) vc(1)=repr_reale(nys(2*m,1:m),m,a,b); vc(2)=repr_reale(nys(2*m,m+1:2*m),m,a,b); valm=nys(2*m,2*m+1); else local=1; end; end; if(valm>val) val=valm; v=vc; timp=t; end; V=[V;vc]; end; disp(v); disp(val); disp(timp); plot_obiectiv(V,timp,a,b); end function [val]=f_obiectiv(x,y); val=exp(-x^2-y^2)+y*cos(5*x)-x*sin(3*y); end function []=plot_obiectiv(V,timp,a,b); figure [X,Y] = meshgrid([a:0.01:b]); Z = exp(-X.^2-Y.^2)+Y.*cos(5*X)-X.*sin(3*Y);
plot3(X,Y,Z,'y'); grid on hold on [dim xx]=size(V); disp(dim); for i=1:dim x=V(i,1); y=V(i,2); z=f_obiectiv(x,y); if(i==timp) plot3(x,y,z,'ks'); hold on else plot3(x,y,z,'g.'); hold on end; end; end
Funcţiile de reprezentare repr_reale şi repr_sir_bin sunt similare primului exemplu (asigură transformarea număr real din şir binar). La un apel hillclimbing(-2,2,5,75); pot fi obţinute rezultatele: x=-1.9102, y=-1.6250 valoarea maximă: 3.4989. În următoare figură este prezentat un exemplu de evoluţie posibilă a algoritmului hillclimbing aplicat pentru 75 de puncte de start.
2.4. Exemple de aplicare a EA Rezolvarea unei probleme de optimizare a unei funcţii de o variabilă Fie , definită prin Problema este de a calcula valoarea maximă a funcţiei pe intervalul . Spaţiul genotipurilor poate fi considerat mulţimea numerelor reale din intervalul . La fiecare moment de timp populaţia este constituită din dim numere reale din ; la momentul iniţial, populaţia conţine dim numere reale generate aleator pe intervalul . Operatorul de mutaţie aplicat unui cromozom x determină obţinerea valorii –x. (în acest caz este posibil, deoarece, dacă ). Operatorul de recombinare aplicat pentru părinţii determină obţinerea cromozomului . Selecţia părinţilor este realizată astfel: sunt selectaţi jumătate din membrii populaţiei curente pe baza procedurii de tip turnir. Operaţia de încrucişare este aplicată pentru o împerechere aleatoare a câte 2 indivizi părinţi, cu probabilitatea pc (pentru fiecare pereche de părinţi selectată este generat un număr aleator în ; dacă acesta este inferior valorii pc, este efectuată încrucişarea). Progeniturile sunt supuse mutaţiei cu o probabilitate pm. Mecanismul de selectare a noii generaţii presupune ordonarea descrescătoare a multisetului format din indivizii populaţiei curente şi progeniturile obţinute prin operatorii de variaţie şi selecţie a părinţilor şi alegerea primilor dim indivizi pentru a forma populaţia următoare. Condiţia terminală este formulată astfel: a fost depăşit un prag al numărului de generaţii sau calitatea populaţiei, măsurată ca medie a funcţiei de evaluare în membrii populaţiei nu mai poate fi îmbunătăţită semnificativ. În continuare sunt prezentate funcţiile MATLAB utilizate şi câteva exemple de aplicare a căutării evolutive descrise mai sus. % generarea populaţiei iniţiale function [pop]=genereza_ini(dim); pop=zeros(dim,2); % fiecare membru al populatiei este un numar in [-1,1] % la care este adaugata valoarea functiei obiectiv for i=1:dim pop(i,1)=unifrnd(-1,1); pop(i,2)=f_obiectiv(pop(i,1)); end; end %definirea functiei obiectiv function [val]=f_obiectiv(x); val=x.^1/3-3*sin(7*x+0.2)+2*cos(x/5-0.4)+1; end % operatorul mutatie function [y]=mutatie(x); y=x; y(1)=-x(1); y(2)=f_obiectiv(y(1)); end % operatorul de incrucisare function [y]=crossover(x1,x2); y=x1; y(1)=(x1(1)+x2(1))/2; y(2)=f_obiectiv(y(1)); end
% mecanismul de selectie a parintilor function [parinti]=selectie(pop); [dim,xx]=size(pop); d=round(dim/2); % dim trebuie sa fie multiplu de 4, pentru ca d sa fie par % va rezulta un singur copil din incrucisare parinti=zeros(d,2); for i=1:d p1=unidrnd(dim); p2=unidrnd(dim); while(p2==p1) p2=unidrnd(dim); end; if(pop(p1,2)>pop(p2,2)) parinti(i,:)=pop(p1,:); else parinti(i,:)=pop(p2,:); end; end; end %obtinerea unei noi populatii popNou pe baza populatiei curente pop %probabilitatea de incrucisare pc si probabilitatea de mutatie pm % evalmed este valoarea medie a functiei obiectiv pentru noua generatie function [popNou,evalmed]=trecere(pop,pc,pm); [parinti]=selectie(pop); [dim,xx]=size(pop); [dd,yy]=size(parinti); d=round(dd/2); popN=zeros(d,2); %aplica operatia de crossover nr=0; for i=1:d j=2*i; prc=unifrnd(0,1); if(prc<=pc) nr=nr+1; popN(nr,:)=crossover(parinti(j-1),parinti(j)); end; end; %aplica mutatia for i=1:nr prm=unifrnd(0,1); if(prm<=pm) popN(i,:)=mutatie(popN(i,:)); end; end; popNN=[pop;popN(1:nr,:)]; tt=sortrows(popNN,2); popNou=zeros(dim,2); popNou=tt(nr+1:dim+nr,:); evalmed=mean(popNou(:,2)); end function []=EA_maxim(dim,pc,pm,Max,eps); % dim este dimensiunea populatiei,multiplu de 4 % pc este probabilitatea de efectuare a % unei incrucisari, pm este probabilitatea de efectuare a unei mutatii, % Max este numarul maxim de iteratii(generatii) %daca diferenta dintre valorile maxime ale %functiei obiectiv de la o generatie la alta este in modulstop [pop]=genereaza_ini(dim); evalmed= mean(pop(:,2));
t=0; V=[]; er=1; plot_obiectiv(pop); while((teps)) [popN,evalmed1]=trecere(pop,pc,pm); pop=popN; er=abs(evalmed1-evalmed); %disp(evalmed1); %disp(er); evalmed=evalmed1; V=[V evalmed]; t=t+1; if (t==20) plot_obiectiv(pop); end; end; plot_obiectiv(pop); figure i=1:t; plot(i,V(i),'r-'); disp(t); disp(popN(dim,:)); end function []=plot_obiectiv(pop); figure x=-1:0.001:1; plot(x,x.^1/3-3*sin(7*x+0.2)+2*cos(x/5-0.4)+1,'k-'); hold on [dim,xx]=size(pop); for i=1:dim x=pop(i,1); y=pop(i,2); plot(x,y,'rs'); hold on end; end
Pentru rezultate.
pot fi obţinute următoarele
Pentru
sunt obţinute următoarele
rezultate.
Valoarea maximă a funcţiei obiectiv este atinsă pentru şi este . Valorile obţinute sunt conforme cu graficul funcţiei prezentat în prima figură a acestei secţiuni. În următoarele trei figuri este reprezentată o posibilă distribuţie a membrilor populaţiei la momentul curent, după 20 de iteraţii şi la momentul final. Apelul este EA_maxim(104,0.5,0.1,1000,0.0001); Iniţial, indivizii sunt distribuiţi aleator, pe între domeniul de definiţie al funcţiei obiectiv. După 20 de iteraţii, indivizii din populaţie sunt distribuiţi în vecinătatea unui punct de maxim local şi respectiv în vecinătatea punctului de maxim global. La terminarea căutării, EA reuşeşte să
identifice maximul global al funcţiei obiectiv şi membrii populaţiei la momentul final sunt grupaţi într-o vecinătate a punctului de maxim global.
Problema celor opt regine Problema este de a determina o configuraţie în care 8 regine pot fi plasate pe o tablă de şah astfel încât să nu se atace reciproc (nici o pereche de regine nu trebuie plasată pe aceeaşi linie, coloană sau diagonală). Aceasta poate fi generalizată imediat la cazul a N regine pentru o tablă de şah N x N -dimensională. Deoarece pe fiecare linie şi coloană a tablei de şah trebuie plasată o singură regină, configuraţiile sunt reprezentate succesiv printr-un vector cu N componente. Valoarea componentei i dintr-un vector configuraţie reprezintă indicele coloanei în care este plasată regina aflată pe linia i. Din această reprezentare rezultă că două regine nu pot fi plasate pe aceeaşi linie a tablei de şah. De asemena, dacă vom presupune că elementele vectorului configuraţie sunt distincte (deci voctorul configuraţie corespunde unei permutări pe mulţimea ), rezultă că două regine nu pot fi plasate pe aceeaşi coloană a tablei de şah. Rezolvarea clasică a unei astfel de probleme este prin căutare directă, utilizând metoda backtracking: iniţial este plasată o regină; după plasarea a n regine, este căutată o poziţie posibilă pentru plasarea celei de-a n+1-a regine (o poziţie din care noua regină să nu se afle în situaţie de atac cu nici una din celelalte n regine deja plasate pe tabla de şah). Dacă nu există nici o astfel de poziţie, cea de-a n-a regină este repoziţionată pe tabla de şah, dacă acest lucru este posibil. O abordare evolutivă a acestei probleme este total diferită de căutarea directă şi este de tip non-incremental. Soluţiile candidat sunt complete, în sensul că fiecare vector configuraţie este instanţiat cu o permutare. Din punct de vedere al reprezentării, un fenotip, care reprezintă o configuraţie a tablei de şah astfel încât două regine să nu fie plasate pe aceeaşi linie sau aceeaşi coloană (este soluţie potenţială), este codificat prin intermediul vectorului configuraţie, permutare a mulţimii . Spaţiul genotipurilor este deci format din mulţimea permutărilor setului . Evident, nu toate elementele acestui spaţiu sunt soluţii admisibile (două regine pot fi plasate astfel încât să fie pe o aceeaşi diagonală a tablei de şah, deci să se afle în poziţie de atac reciproc). Calitatea fiecărui genotip x, , poate fi evaluată în termenii numărului de perechi de regine care se află în poziţie de atac (numărul de perechi cu proprietatea că ): dacă acesta este 0 atunci genotipul este soluţie, în caz contrar valoarea
calculată este strict pozitivă. Problema de optim care trebuie rezolvată este deci de minimizare funcţie f sau, echivalent, maximizarea funcţiei , unde este numărul maxim de perechi de regine care se pot afla în poziţie de atac (de exemplu în cazul ). În implementarea algoritmului, fiecărui genotip îi este asociată valoarea funcţiei de evaluare, deci datele cu care se lucrează sunt vectori N+1-dimensionali: primele N componente reprezintă configuraţia şi ultima componentă valoarea funcţiei de evaluare corespunzătoare acesteia. La fiecare moment de timp, populaţia este constituită dintr-un multiset cu dim elemente (de exemplu, pentru , pentru ). Pentru această problemă, la fiecare generaţie sunt înlocuiţi câte 2 indivizi (cei mai slabi din punctul de vedere al funcţiei de evaluare) cu copii a doi părinţi. Cei doi părinţi sunt selectaţi aleator din populaţia curentă, . Operatorul de încrucişare este proiectat astfel încât progeniturile să păstreze proprietatea de a fi permutări: pentru doi indivizi şi pentru o poziţie sunt obţinute progeniturile astfel: copiază primele poz elemente din , respectiv în , respectiv copiază în ultimele dim-poz+1 poziţii din , respectiv , elementele din , respectiv , începând cu primul şi până când au fost completate poziţiile din , respectiv , astfel încât , respectiv să nu conţină dubluri Operatorul mutaţie este aplicat cu probabilitatea de 0.8 uneia din cele două progenituri rezultate după aplicarea operatorului de recombinare şi revine la selectarea aleatoare a două poziţii diferite din genotipul modificat şi interschimbarea valorilor din acele poziţii. Condiţia terminală este formulată astfel: a fost atinsă o configuraţie soluţie sau a fost depăşit pragul dat pentru numărul maxim de generaţii. În continuare sunt prezentate funcţiile MATLAB utilizate şi câteva exemple de aplicare a căutării evolutive descrise mai sus. function [pop]=genereaza_ini(N,dim); pop=zeros(dim,N+1); % fiecare membru al populatiei este o permutare pe 1,2,..,N % la care este adaugata valoarea functiei obiectiv N-numarul de perechi % de regine care se ataca reciproc for i=1:dim x=gen_perm(N); pop(i,1:N)=x; pop(i,N+1)=valoare(x); end; end % generarea aleatoare a unei permutari pe {1,2,…,N} function [y]=gen_perm(N); y=zeros(1,N); for i=1:N gata=0; while(~gata) v=unidrnd(N); if(~ismember(v,y)) y(i)=v; gata=1; end; end; end; disp(y); end % functia de evaluare calculata pentru un genotip
function [val]=valoare(x); [m,N]=size(x); v=0; for i=1:N-1 for j=i+1:N if(abs(i-j)==abs(x(i)-x(j))) v=v+1; end; end; end; val=N*(N-1)/2-v; end % recombinarea function [y1,y2]=crossover(x1,x2,poz); [m,p]=size(x1); N=p-1; y1=x1;y2=x2; y1=copiaza_rest(y1,x2,poz,N); y2=copiaza_rest(y2,x1,poz,N); y1(N+1)=valoare(y1(1:N)); y2(N+1)=valoare(y2(1:N)); %disp(y1); %disp(y2); end function [y]=copiaza_rest(y,x,poz,N) i=poz+1; while(i<=N) for j=1:N if(~ismember(x(j),y(1:i-1))) y(i)=x(j); i=i+1; break; end; end; end; end % mutatia function [y]=mutatie(x,poz1,poz2); [m,p]=size(x); N=p-1; y=x; y(poz1)=x(poz2); y(poz2)=x(poz1); y(N+1)=valoare(y(1:N)); end % selectarea parintilor – cate doi/popuatie function [parinti]=selectie(pop); [dim,p]=size(pop); N=p-1; parinti=zeros(2,N+1); p1=unidrnd(dim); p2=unidrnd(dim); while(p2==p1) p2=unidrnd(dim); end; parinti(1,:)=pop(p1,:); parinti(2,:)=pop(p2,:); end
% trecerea de generatia curenta la generatia urmatoare function [popNou,evalmax]=trecere(pop,pm); [parinti]=selectie(pop); [dim,m]=size(pop); N=m-1; poz=unidrnd(N-1); %aplica operatia de crossover y=zeros(2,N+1); [y(1,:),y2(2,:)]=crossover(parinti(1,:),parinti(2,:),poz); %aplica mutatia prm=unifrnd(0,1); if(prm<=pm) i=unidrnd(2); poz1=unidrnd(N); poz2=unidrnd(N); while(poz2==poz1) poz2=unidrnd(N); end; y(i,:)=mutatie(y(i,:),poz1,poz2); end; popN=[pop;y(1,:);y2(2,:)]; tt=sortrows(popN,N+1); %disp(tt); popNou=zeros(dim,N+1); popNou=tt(3:dim+2,:); evalmax=popNou(dim,N+1); %disp(popNou); end % algoritmul evolutiv function []=EA_Queens(N,dim,pm,Max); % N este umarul de regine, dim este dimensiunea populatiei, pm este % probabilitatea de efectuare a unei mutatii si Max este numarul maxim %de iteratii(generatii) [pop]=genereaza_ini(N,dim); evalmax=0; t=0; V=[]; while(evalmax
l=y-1:0.1:y; plot(k,l,'bv'); hold on k=x:-0.1:x-1; l=y-1:0.1:y; plot(k,l,'bv'); hold on end; axis([0 N 0 N]); end
O configuraţie corectă obţinută prin aplicarea algoritmului de mai sus
O configuraţie corectă obţinută prin aplicarea algoritmului de mai sus Problema rucsacului de tip 0-1 Problema rucsacului de tip 0-1 este enunţată în cele ce urmează. Fiind date m obiecte, fiecare având asociate o valoare şi respectiv un cost de selecţie, trebuie determinat un set de obiecte cu proprietatea că este de valoare maximă (unde valoarea unei mulţimi de obiecte este definită ca suma valorilor obiectelor ce o compun) şi costul (definit ca suma costurilor obiectelor setului) este sub un prag dat, Cmax. Problema este de tip 0-1 pentru că nu pot fi selectate fracţiuni dintr-un obiect, ci întregul obiect (dacă prin această operaţie nu este depăşit Cmax). O soluţie posibilă este dată de un set de obiecte selectate astfel încât costul lui este inferior valorii Cmax. Dacă val este vectorul valorilor asociate celor m obiecte şi cost este vectorul
costurilor, reprezentarea unui candidat la soluţie poate fi realizată printr-un vector de m elemente, v, unde ă î ţ şi î
Funcţia de evaluare asociată lui v calculează valoarea asociată selecţiei reprezentate de v,
Este evident că fiecare genotip v corespunde unui număr şi v este reprezentarea binară a lui R-1 şi cu proprietatea că nu este depăşit pragul Cmax. La fiecare moment de timp, populaţia este formată din N indivizi reprezentaţi aşa cum a fost explicat mai sus. La momentul iniţial, este generat aleator un număr , genotipul corespunzător lui fiind reprezentarea binară a lui R-1; R este selectat pentru reprezentare numai dacă nu este depăşit pragul Cmax. Procedeul continuă până la generarea a N cromozomi. Selecţia părinţilor este realizată prin următorul procedeu. De N ori sunt alese perechi de cromozomi din populaţia curentă şi este selectat cel mai bun dintre ei, din punctul de vedere al funcţiei de evaluare. Recombinarea este realizată cu o probabilitate pc ( ) şi este proiectată astfel încât progeniturile să rămână admisibile (costul asociat să fie inferior lui Cmax): pentru doi indivizi şi pentru o poziţie generată aleator sunt obţinute progeniturile astfel: copiază primele poz elemente din , respectiv în , respectiv copiază în ultimele m-poz+1 poziţii din , respectiv , ultimele m-poz+1 elementele din , respectiv Dacă astfel obţinuţi nu îndeplinesc proprietatea de admisibilitate, este selectată o altă pereche de indivizi şi este aplicat acelaşi mecanism, până când este obţinută o pereche de genotipuri (soluţii admisibile ale problemei de rezolvat). Dacă o pereche de părinţi nu este selectată pentru încrucişare, aceasta este menţinută în populaţia următoare. Operatorul mutaţie este aplicat cu o probabilitate pm (în general ) unui individ v şi revine la selectarea aleatoare a unei poziţiei şi modificarea valorii şi efectuarea operaţiei (valoarea genei poz este schimbată din 0 în 1 sau invers). Dacă rezultatul nu este admisibil, este selectat un alt individ pentru mutaţie. Mecanismul de înlocuire a populaţiei revine la selectarea acelor indivizi aleşi ca părinţi dar pentru care nu s-a realizat operaţia de încrucişare (valoarea generată aleator este inferioară valorii pc) şi pentru progeniturile (eventual mutante) rezultate. Fiecare generaţie are deci dimensiunea constantă, N. Condiţia terminală controlează numărul de iteraţii efectuat. Alternativ, poate fi implementată şi o variantă în care să fie controlată şi calitatea populaţiei, evaluată ca medie a funcţiei de evaluare sau ca valoarea maximă a funcţiei de evaluare calculată pentru fiecare din indivizii populaţiei curente. În continuare sunt prezentate funcţiile MATLAB pentru implementarea căutării evolutive. Datele sunt preluate din fişierul nume şi sunt reprezentate de costurile şi valorile asociate celor m obiecte. Testele au fost efectuate pentru m=16 şi m=32. % citirea datelor din fisier function [val,cost,costM]=citeste_date(nume); f=fopen(nume); m=fscanf(f,'%d',1);
val=fscanf(f,'%lg',[m,1]); cost=fscanf(f,'%lg',[m,1]); costM=fscanf(f,'%lg',1); fclose(f); end % generarea populaţiei iniţiale function [pop,val,cost,costM]=genereza_ini(nume,N); [val,cost,costM]=citeste_date(nume); [m,p]=size(val); pop=zeros(N,m); i=0; while(i
if(pop(p1,:)*val>=pop(p2,:)*val) parinti(i,:)=pop(p1,:); else parinti(i,:)=pop(p2,:); end; end; end % inlocuirea populatiei curente cu generatia urmatoare function [popN]=trecere(pop,val,cost,costM,pc,pm); [parinti]=selectie(pop,val,cost,costM); [N,m]=size(pop); popN=zeros(N,m); i=0; %aplica operatia de crossover for i=1:2:N p1=unidrnd(N);x1=parinti(p1,:); p2=unidrnd(N);x2=parinti(p2,:); prc=unifrnd(0,1); if(prc<=pc) cont=1; %trebuie ca progentiturile sa fie solutii admisibile while(cont) poz=unidrnd(m); %disp(poz); [y1,y2]=crossover(x1,x2,poz); [OK1,sum1]=verifica(y1,cost,costM); [OK2,sum2]=verifica(y2,cost,costM); if((OK1==1)&&(OK2==1)) popN(i,:)=y1; popN(i+1,:)=y2; cont=0; end; end; else popN(i,:)=x1; popN(i+1,:)=x2; end; end; %aplica mutatia for i=1:N prm=unifrnd(0,1); if(prm<=pm) cont=1; %trebuie ca progentitura sa fie solutie admisibila while(cont) poz=unidrnd(m); x=popN(i,:); [y]=mutatie(x,poz); [OK,sum]=verifica(y,cost,costM); if(OK==1) popN(i,:)=y; cont=0; end; end; end; end; end % calculul valorii maxime a functiei de evaluare function [Q,x,V]=maximQ(pop,val);
[N,m]=size(pop); Q=0; V=zeros(N); for i=1:N qm=pop(i,:)*val; V(i)=qm; if(qm>=Q) Q=qm; x=pop(i,:); end; end; end % implementarea cautarii evolutive function []=GA_Knapsack(nume,N,pc,pm); %GA_Knapsack('date4.txt',2000,0.9,1.0/8); - obtinerea solutiei exacte %pentru 32 de componente %pentru 16 componente GA_Knapsack('date.txt',500,0.8,1.0/8); -solutia %exacta [pop,val,cost,costM]=genereaza_ini(nume,N); [Q,x,V]=maximQ(pop,val); %disp(x); %disp(Q); figure; i=1:N; plot(i,V(i),'r-'); hold on; for j=1:15 [popN]=trecere(pop,val,cost,costM,pc,pm); pop=popN; [Q,x,V]=maximQ(pop,val); %disp(Q); %disp(x); end; [Q,x,V]=maximQ(pop,val); %disp(x); i=1:N; plot(i,V(i),'k-'); hold on for j=1:50 [popN]=trecere(pop,val,cost,costM,pc,pm); pop=popN; [Q,x,V]=maximQ(pop,val); %disp(Q); %disp(x); end; [Q,x,V]=maximQ(pop,val); disp('Solutia optima calculata'); disp(x); disp('Valoarea optima calculata'); disp(Q); i=1:N; plot(i,V(i),'b-'); end
La apelul GA_Knapsack('date.txt',500,0.8,1.0/8); fişierul date.txt conţine următoarele informaţii:
Numărul de componente: 16 Valoarea obţinută la alegerea fiecărei componente 4.5 6 8 5.4 10.2 3.2 4.2 8.3 3.2 4.5 9 10.9 5 6.2 7 8.2 Costul alegerii fiecărei componente 3 2 2.4 6.8 5 6.2 5 4.8 5 0.2 3 4.8 7 7.1 9.7 4 Costul maxim permis 26.3 În continuare este prezentat un exemple de evoluţie a EA.
Solutia optima calculata 0 1 1 0 1 0
0
1
0
1
1
Valoarea optima calculata 65.1000
La apelul GA_Knapsack('date4.txt',2000,0.9,1.0/8); fişierul date4.txt conţine următoarele informaţii: Numărul de componente: 32
1
0
0
0
1
Valoarea obţinută la alegerea fiecărei componente 2.5 6 8 3.4 10.2 3.2 4.2 8.3 3.2 4.5 9 10.9 5 6.2 7 8.2 9.2 1.3 4 5 8.9 0.4 7.3 4.1 8 3 11 2.5 3 1.2 5 2.3 Costul alegerii fiecărei componente 7 3.1 2.4 8.8 5 5.2 5 4.8 5 5.2 6 4.8 7 1.1 2.7 4.9 5 5.6 8 2.5 4 4 2.2 5.2 3.1 6.4 3.3 7 6.5 8 1.4 9.8 Costul maxim permis 56.6 În continuare este prezentat un exemple de evoluţie a EA.
Solutia optima calculata 0
1
1
0
1
0
0
1
0
0
1
1
0
1
1
1
1
0
0
1
1
0
1
0
1
0
1
0
0
0
1
0
Valoarea optima calculata 128.2000
Evoluţia căutare directă-căutare stochastică Componentele EA
I. Evoluţia căutare directă-căutare stochastică
Evoluţia căutare directă-căutare stochastică: metodele de tip “hill climbing” şi “simulated annealing”.
Metodele de tip “hill climbing”
tehnică de iterativitate îmbunătăţită, aplicată unui singur punct din spaţiul de căutare. la o iteraţie este selectat un nou punct aflat într-o vecinătate a punctului curent procesat (de exemplu, dacă punctul curent este numă real – consideră un tip de reprezentare binară și modifică un bit al reprezentării) dacă acest punct determină o valoare mai bună (din punct de vedere al criteriului de optim considerat) pentru funcţia obiectiv, el devine punct curent. altfel, este selectată o altă vecinătate a punctului curent, procesul desfăşurânduse ulterior similar. algoritmul se încheie când nici un punct vecin celui curent nu aduce îmbunătăţiri valorilor funcţiei obiectiv. sunt obţinute de obicei la valori de optim local, depinzând de punctul de start. Pentru a creşte performanţele unor astfel de modele, acestea se utilizează pentru un număr mare de punct de start.
II. Algoritmul “hill climbing”
III. Reprezentarea binară a unui numar real
Implementarea MatLab function [y,m]=repr_sir_bin(x,a,b,nz); nr=(b-a)*(10^nz); m=fix(log2(nr))+1; z=fix((x-a)*(2^m-1)/(b-a)); y=bitget(z,m:-1:1); end % obtinerea numărului real t corespunzator reprezentării binare y function [t]=repr_reale(y,m,a,b); x=0; for i=1:m x=bitset(x,m-i+1,y(i)); end; t=a+x*(b-a)/(2^m-1); end
IV. Maximizarea unei funcţii de 2 variabile
utilizând metoda “hill climbing”
while(local==0) %calculul vecinilor, insotit de valorile functiei obiectiv for i=1:2 [y((i-1)*m+1:i*m),m]=repr_sir_bin(vc(i),a,b,nz); end; valc=f_obiectiv(vc(1),vc(2)); ny=zeros(2*m,2*m+1); for i=1:2*m ny(i,1:2*m)=y(1:2*m); ny(i,i)=not(y(i)); vn(1)=repr_reale(ny(i,1:m),m,a,b); vn(2)=repr_reale(ny(i,m+1:2*m),m,a,b); ny(i,2*m+1)=f_obiectiv(vn(1),vn(2)); end; nys=sortrows(ny,2*m+1); if(nys(2*m,2*m+1)>valc) vc(1)=repr_reale(nys(2*m,1:m),m,a,b); vc(2)=repr_reale(nys(2*m,m+1:2*m),m,a,b); valm=nys(2*m,2*m+1); else local=1; end; end; %while (local==0)
if(valm>val) val=valm; v=vc; timp=t; end; V=[V;vc]; end; %for i=1:MAX disp(v); disp(val); disp(timp); plot_obiectiv(V,timp,a,b); end function []=plot_obiectiv(V,timp,a,b); figure, [X,Y] = meshgrid([a:0.01:b]); Z = exp(-X.^2-Y.^2)+Y.*cos(5*X)-X.*sin(3*Y); plot3(X,Y,Z,'y'); grid on hold on [dim xx]=size(V); for i=1:dim x=V(i,1); y=V(i,2); z=f_obiectiv(x,y); if(i==timp) plot3(x,y,z,'ks'); hold on else plot3(x,y,z,'g.'); hold on end; end;end
La un apel hillclimbing(-2,2,5,75); pot fi obţinute rezultatele: x=-1.9102, y=-1.6250, valoarea maximă: 3.4989.
Componentele unui EA Algoritmi genetici. Reprezentări cromozomiale.
Componentele EA 1. Reprezentarea (definirea membrilor populaţiei) - stabilirea unei conexiuni între contextul problemei particulare de rezolvat şi spaţiul în care evoluează tehnica PS considerată. Fenotipuri : soluţiile posibile în contextul problemei de rezolvat Genotipuri (cromozomi): reprezentarea fenotipurilor în context EA; conţin valori (alele), plasate în poziţii numite variabile sau gene. 2. Funcţia de evaluare (fitness) - măsoară gradul de adaptabilitate a fiecărui individ la mediul în care trăieşte. Stă la baza proceselor de selecție și este derivată pe baza unei funcţii de tip calitate definită pe spaţiul fenotipurilor. 3. Populaţia – multiset de genotipuri; menține o mulțime de genotipuri, în general de dimensiune constantă, corespunzătoare unor soluții posibile Operatorii de selecție: definiți la nivel de populație. Variația în cadrul unei populații – individ, calitate, entropie etc. 4. Mecanismul de selectare a părinţilor - permite celor mai buni indivizi să se reproducă, fără a-i exclude pe cei mai slabi. Selecția este probabilistă și depinde de calitatea indivizilor Rolul: forţează îmbunătăţirea calităţii globale a populaţiei de la o generaţie la alta.
5. Operatorii de variaţie –stochastici: rezultatul este funcție de alegeri aleatoare. Recombinarea: produce unul sau două genotipuri copil prin combinarea informaţiei din două genotipuri părinte și este stochastică Mutația: produce o variantă “mutantă” a unui genotip, numită progenitură sau copil 6. Mecanismul de selectare a membrilor generaţiei următoare - este aplicat fiecărui individ aparţinând populaţiei curente sau mulţimii progeniturilor pe baza unei fucții de decizie. Supraviețuire generațională Supraviețuire bazată pe calitate 7. Definirea modulului de iniţializare (determinarea populaţiei iniţiale) – sunt generate aleator fenotipurile și apoi este obținută reprezentarea prin genotipuri 8. Definirea condiţiei terminale atingerea unui număr maxim de iteraţii (generaţii); atingerea unui număr maxim de evaluări ale calităţii indivizilor; pentru o anumită perioadă de timp calitatea populaţiei curente nu este semnificativ îmbunătăţită (este sub un prag dat); diversitatea populaţiei scade sub un prag dat.
ALGORITMI GENETICI (GA)
Respectă structura unui EA
Reprezentarea soluțiilor. Reprezentarea binară
Alegerea unei anumite reprezentări depinde de problema particulară de rezolvat și este foarte importantă pentru ca GA să furnizeze soluții apropiate de cele optime.
Cele mai utilizate tipuri de reprezentări în GA: secvenţe binare; secvenţe de numere întregi; secvenţe de numere reale; permutări.
Reprezentarea binară: prima ca istoric
În cazul unor clase de probleme care conţin variabile de tip decizie booleană, reprezentarea binară este cea mai naturală. Altfel, pot fi obţinuţi GA superiori ca performanţe prin utilizarea reprezentărilor directe
Reprezentarea binară. Exemplu
Reprezentarea binară. Codificarea Gray
Număr
0
1
2
3
4
5
6
7
Cod binar std. Cod Gray
0000
0001
0010
0011
0100
0101
0110
0111
0000
0001
0011
0010
0110
0111
0101
0100
Număr
8
9
10
11
12
13
14
15
Cod binar std. Cod Gray
1000
1001
1010
1011
1100
1101
1110
1111
1100
1101
1111
1110
1010
1011
1001
1000
Reprezentarea prin numere întregi
Reprezentarea prin numere reale
Reprezentarea prin permutări
Permutările sunt utilizate pentru reprezentări cromozomiale în probleme în care trebuie stabilită ordinea apariţiei unor secvenţe de evenimente. În acest caz operatorii de variaţie trebuie definiţi astfel încât rezultatul aplicării acestora să corespundă unor soluţii admisibile.
Clase de probleme: probleme în care ordinea apariţiei evenimentelor este importantă. Această situaţie apare, de exemplu, când evenimentele utilizează resurse limitate sau se desfăşoară într-o anumită perioadă de timp. Exemplu: problema planificării activităţilor; probleme în care apare dependenţa de adiacenţă. Exemplu: problema comis-voiajorului, în care, pentru n oraşe interconectate date, trebuie determinat un drum de lungime (distanţă) minimă care să treacă prin toate cele n oraşe, cu revenire în oraşul de start. Diferenţa dintre cele două clase de probleme este dată de faptul că, evident, în cazul celei de-a doua clase, punctul de start (în cazul problemei comis-voiajorului oraşul de plecare) nu este important.
Algoritmi genetici. Operatori de variație
Operatorul mutaţie. Reprezentarea binară
Mutaţia în reprezentarea prin numere întregi
Mutaţia în reprezentarea prin numere reale
Mutaţia în reprezentarea prin permutări
Mutaţia în reprezentarea prin permutări
Recombinarea în reprezentarea binară
Recombinarea uniformă în reprezentarea binară și pe șiruri de numere întregi
Recombinarea în reprezentarea în numere reale
Algoritmi genetici. Operatorul de recombinare în reprezentarea prin permutări
Operatorul PMX
Operatorul OCX
Operatorul ECX
Operatorul CX
x1
1
2
4
6
5
7
3
9
10
8
y1
10
5
2
7
9
1
3
8
6
4
x1
1
2
4
6
5
7
3
9
10
8
y1
10
5
2
7
9
1
3
8
6
4
x1
1
2
4
6
5
7
3
9
10
8
y1
10
5
2
7
9
1
3
8
6
4
Recombinarea multiplă
Mecanisme de selecţie. Selecţia părinţilor. Selecţia supravieţuitorilor
Determinarea distribuţiei de probabilitate de selecţie
Determinarea distribuţiei de probabilitate de selecţie
Determinarea distribuţiei de probabilitate de selecţie
Determinarea distribuţiei de probabilitate de selecţie
Determinarea distribuţiei de probabilitate de selecţie
Nr. crt.
Şirul binar
1
0
1
1
0
2
1
0
0
3
1
0
4
1
5
1
Calitatea
FPS
Rang liniar Rang s=1.5 exp.
0
144
0.0598
0.1200
0.1430
1
0
324
0.1344
0.1600
0.1955
1
1
0
484
0.2008
0.2000
0.2149
1
0
1
1
729
0.3025
0.2400
0.2220
1
0
1
1
729
0.3025
0.2800
0.2246
Determinarea distribuţiei de probabilitate de selecţie
Nr. crt.
Şirul binar
1
0
0
1
1
2
0
1
1
3
0
1
4
1
5
1
Calitatea
FPS
Rang liniar Rang s=1.5 exp.
0
1036
0.1608
0.1200
0.1430
0
0
1144
0.1776
0.1600
0.1955
1
1
0
1196
0.1857
0.2000
0.2149
0
1
0
1
1441
0.2237
0.2400
0.2220
1
0
0
1
1625
0.2523
0.2800
0.2246
Implementarea distribuţiei de probabilitate de selecţie
Exemplu de implementare Nr. crt.
Fenotipul
Cromozomul populaţiei iniţiale
Calitatea lui
FPS asociat
1
6
0
0
1
1
0
36
0.0226
2
28
1
1
1
0
0
784
0.4922
3
18
1
0
0
1
0
324
0.2034
4
20
1
0
1
0
0
400
0.2511
5
7
0
0
1
1
1
49
0.0308
Cromozomii părinte selectaţi
Calitatea
Nr. crt.
Fenotipul
1
18
1
0
0
1
0
324
2
20
1
0
1
0
0
400
3
28
1
1
1
0
0
784
4
18
1
0
0
1
0
324
5
28
1
1
1
0
0
784
Mecanismului SUS
Implementarea mecanismului SUS
Implementarea mecanismului SUS Nr. crt.
Cromozomul populaţiei iniţiale
Calitatea lui
Rang liniar, s=1.8
1
0
0
0
1
0
4
0.0933
2
1
0
1
0
0
400
0.1467
3
1
1
0
0
1
625
0.2000
4
1
1
1
0
1
841
0.2533
5
1
1
1
1
0
900
0.3067
Nr. crt.
Cromozomii părinte selectaţi
Calitatea
1
1
0
1
0
0
400
2
1
1
0
0
1
625
3
1
1
1
0
1
841
4
1
1
1
1
0
900
5
1
1
1
1
0
900
Selecţia de tip turneu
Schimbul de generaţii bazat pe vârstă
Schimbul de generaţii bazat pe calitatea indivizilor
Aplicaţie. Problema planificării activităţilor
Problema planificării activităţilor de tip sisteme de producţie bazate pe comandă (JSS)
Problema JSS Ipoteze de lucru: în cadrul fiecărei sarcini, activităţile respectă o relaţie de precedenţă din punctul de vedere al execuţiei, astfel încât două sau mai multe activităţi nu pot fi executate simultan; cu alte cuvinte, fiecare sarcină este definită de un set ordonat de operaţii, ordinea fiind predefinită; activităţile nu îşi pot întrerupe execuţia; la fiecare moment de timp, pe oricare maşină, poate fi executată o singură operaţie. Planificarea unei operaţii o revine la a îi aloca un timp de execuţie (pe maşina corespunzătoare lui o), un plan fiind o colecţie de astfel de alocări cu proprietatea că fiecare operaţie este inclusă cel mult o dată. Problema este de a găsi un plan cu proprietăţile: completitudine: planul conţine toate operaţiile mulţimii O; corectitudine: sunt satisfăcute toate restricţiile impuse prin ordinea de execuţie; optimalitate: durata totală a planului este minimă.
Problema JSS
Problema JSS
JSS. Stabilirea asocierii permutare – plan fezabil
JSS. Stabilirea asocierii permutare – plan fezabil
Problema JSS
Problema JSS Mecanismul de selecţie
În cazul acestei probleme operatorii de selecţie sunt independenţi de reprezentarea cromozomială, deci pot fi utilizaţi oricare dintre cei prezentaţi. Operatorul de selecţie a părinţilor este de tip SUS cu distribuţia de probabilitate de selecţie FPS standard. Mecanismul de supravieţuire: generaţia următoare este construită pe baza urmaşilor cu propagarea celui mai bun cromozom din generaţia curentă în locul celui mai slab urmaş, dacă progeniturile sunt sub acel cromozom din punct de vedere al funcţiei de evaluare.
Populaţia iniţială şi condiţia terminală
Stabilirea populaţiei iniţiale este realizată aleatoriu Condiţia terminală este de tip prag: de exemplu, dacă a fost atins un număr de iteraţii sau au fost evaluaţi un număr maxim de cromozomi.
Problema JSS. Exemplu de test
[2
1
4
3 2
1
3
4
1
2
3
4
4
1
2
3
2
1
3
4]
Problema JSS. Exemplu de test
Exemplu de asociere (permutare, programare fezabilă)
permutare=(3 1 20 18 13 6 9 17 8 10 15 2 4 12 14 5 19 7 11 16) Programarea asociată a operaţiilor pe maşini
Maşina 1 Timp start op Timp stop
3 2 5 14 14 9 17 18 26 6
5 9 17 26 31
Maşina 2 Timp start op Timp stop
0 1 3 3 17 7 7 5 10 10 15 17 17 10 24
Maşina 3 Timp start op Timp stop
10 24 27 33 35
4 11 11 27 16 33 19 35 7 44
Maşina 4 Timp start op Timp stop
0 13 4 5 3 10 35 12 40 40 20 47 47 8 51
Problema JSS. Exemplu de test
La un apel >> GA_plan(300,0.8,0.02,80) pot fi obţinute rezultatele:
Durata minimă calculată: 33 Programarea operaţiilor pe maşini (câte 5 operaţii pe fiecare maşină) Maşina 1 Timp start op Timp stop
0 3 9 11 15
9 6 2 14 18
3 8 11 15 24
Maşina 2 Timp start op Timp stop
0 5 3 1 6 17 10 10 17 15
3 6 10 17 24
Maşina 3 Timp start op Timp stop
8 17 20 24 26
7 17 11 20 4 21 19 26 16 32
Maşina 4 Timp start op Timp stop
0 13 11 3 17 8 21 12 26 20
4 16 21 26 33
Problema JSS. Exemplu de test
Problema optimizării portofoliilor. Rezolvare prin tehnica de tip gradient.
Randamentul / riscul unui portofoliu
Randamentul / riscul unui portofoliu
Randamentul / riscul unui portofoliu
Definirea problemelor de tip risc minim
Definirea problemelor de tip risc minim
Definirea problemelor de tip randament maxim
Definirea problemelor de tip randament maxim
Transformarea în probleme de optimizare fără constrângeri
Transformarea în probleme de optimizare fără constrângeri
Rezolvarea RISCMIN1M prin tehnica celei mai rapide descreşteri
Rezolvarea RISCMIN1M prin tehnica celei mai rapide descreşteri
Rezolvarea RISCMIN1M prin tehnica celei mai rapide descreşteri
Rezolvarea RISCMIN1M prin tehnica celei mai rapide descreşteri. Exemplu S1
S2
S3
S4
S5
S6
S7
S8
S9
S10
A1
1.2
1.3
1.4
1.5
1.1
1.2
1.1
1.0
1.0
1.1
A2
1.3
1.0
0.8
0.9
1.4
1.3
1.2
1.1
1.2
1.1
A3
0.9
1.1
1.0
1.1
1.1
1.3
1.2
1.1
1.0
1.1
A4
1.1
1.1
1.2
1.3
1.2
1.2
1.1
1.0
1.1
1.2
A5
0.8
0.75
0.65
0.75
0.8
0.9
1.0
1.1
1.1
1.2
Rezolvarea RISCMIN1M prin tehnica celei mai rapide descreşteri. Exemplu
Problema optimizării portofoliilor. Abordare GA.
Randamentul / riscul unui portofoliu
Randamentul / riscul unui portofoliu
Definirea problemei RISCMIN1M
Definirea problemei RISCMIN1M
Abordarea genetică a problemei RISCMIN1M
Abordarea genetică a problemei RISCMIN1M
Abordarea genetică a problemei RISCMIN1M
Generarea populaţiei inițiale: aleator, cu respectarea restricțiilor
SHORT SELLING admis
function [pop]=gen_ini_short_selling(dim,n,Q,rmed,alpha,B,ro,Rp); pop=zeros(n,dim); for i=1:dim x=zeros(n-1,1); gata=0; while(~gata) for j=1:n-1 x(j)=unifrnd(-1,1); end; if((sum(x)>=0)&&(sum(x)<=2)) pop(1:n-1,i)=x(1:n-1); [val,V]=fobiectiv(Q,rmed,alpha,B,ro,Rp,x(1:n-1)); pop(n,i)=-val; gata=1; end;end; end; end
Abordarea genetică a problemei RISCMIN1M
SHORT SELLING exclus
function [pop]=gen_ini(dim,n,Q,rmed,alpha,B,ro,Rp); pop=zeros(n,dim); for i=1:dim x=zeros(n-1,1); for j=1:n-1 gata=0; while(~gata) r=unifrnd(0,1); if(sum(x)+r<=1) x(j)=r;gata=1;end; end; if(sum(x)==1) break; end; end; pop(1:n-1,i)=x(1:n-1); [val,V]=fobiectiv(Q,rmed,alpha,B,ro,Rp,x(1:n-1)); pop(n,i)=-val; end; end
Abordarea genetică a problemei RISCMIN1M
Abordarea genetică a problemei RISCMIN1M function [popN]=crossover1(pop,pc,p,Q,rmed,alpha,B,ro,Rp); [n,dim]=size(pop); poz=[]; popN=zeros(n,dim); for i=1:2:dim ok=0; while(~ok) p1=unidrnd(dim-1); p2=p1; while(p1>=p2) p2=unidrnd(dim); end; if(~ismember([p1 p2],poz,'rows')) poz=[poz;[p1 p2]]; ok=1; end; end; % nu pot fi generate aceleasi perechi de parinti la treceri diferite
Abordarea genetică a problemei RISCMIN1M x=pop(1:n-1,p1); y=pop(1:n-1,p2); r=unifrnd(0,1); if(r<=pc) x1=p*x+(1-p)*y; popN(1:n-1,i)=x1(1:n-1); [val,V]=fobiectiv(Q,rmed,alpha,B,ro,Rp,x1(1:n-1)); popN(n,i)=-val; y1=p*y+(1-p)*x; popN(1:n-1,i+1)=y1(1:n-1); [val,V]=fobiectiv(Q,rmed,alpha,B,ro,Rp,y1(1:n-1)); popN(n,i+1)=-val; else %recombinare asexuata popN(1:n,i)=pop(1:n,p1); popN(1:n,i+1)=pop(1:n,p2); end; end; end
Abordarea genetică a problemei RISCMIN1M
Abordarea genetică a problemei RISCMIN1M function [popN]=mutatie(pop,pm,t,Q,rmed,alpha,B,ro,Rp,caz); [n,dim]=size(pop); popN=pop; for i=1:dim efectuat=0; if(caz==0) % fara short selling for j=1:n-1 r=unifrnd(0,1); if(r<=pm) fluaj=normrnd(0,t/3); a=pop(j,i)+fluaj; efectuat=1; if(a<0) a=0; end; s=sum(popN(1:n-1,i)); if(s+fluaj>1) xx=s+fluaj-1; a=a-xx; end; popN(j,i)=a; end; end;
Abordarea genetică a problemei RISCMIN1M else %cu short selling for j=1:n-1 r=unifrnd(0,1); if(r<=pm) gata=0; while(~gata) fluaj=normrnd(0,t/3); if(fluaj>0) a=min([pop(j,i)+fluaj 1]); else a=max([pop(j,i)+fluaj -1]); end; s=sum(popN(1:n-1,i)); if((s+fluaj>=0)&&(s+fluaj<=2)) popN(j,i)=a; efectuat=1; gata=1; end; end; end; end;end; if(efectuat) [val,V]=fobiectiv(Q,rmed,alpha,B,ro,Rp,popN(1:n-1,i)); popN(n,i)=-val; end; end; end
Abordarea genetică a problemei RISCMIN1M
Selecţia părinţilor este realizată pe baza algoritmului SUS, prin utilizarea distribuţiei de probabilitate de selecţie de tip rang liniar, cu presiunea de selecţie s. La fiecare generaţie sunt selectaţi dim părinţi.
Mecanismul de supravieţuire este elistist standard function [rezultat]=selectie_generatie_urmatoare(pop,popN); [n,dim]=size(pop); fob=pop(n,1:dim); fobN=popN(n,1:dim); rezultat=popN; [max1,i]=max(fob); [max2,j]=max(fobN); if(max1>max2) [min1,k]=min(fobN); rezultat(1:n,k)=pop(1:n,i); end; end
Condiția terminală: simulare pe un număr date de epoci
Exemplu - excluderea situaţiei de tip “short selling” S1
S2
S3
S4
S5
S6
S7
S8
S9
S10
A1
1.2
1.3
1.4
1.5
1.1
1.2
1.1
1.0
1.0
1.1
A2
1.3
1.0
0.8
0.9
1.4
1.3
1.2
1.1
1.2
1.1
A3
0.9
1.1
1.0
1.1
1.1
1.3
1.2
1.1
1.0
1.1
A4
1.1
1.1
1.2
1.3
1.2
1.2
1.1
1.0
1.1
1.2
A5
0.8
0.75
0.65
0.75
0.8
0.9
1.0
1.1
1.1
1.2
Exemplu - excluderea situaţiei de tip “short selling”
Exemplu – considerarea situaţiei de tip “short selling”
Exemplu – considerarea situaţiei de tip “short selling”
ALGORITMI GENETICI
ALGORITMI GENETICI Reprezinta tehnici de cautare si optimizare avand ca punct de pornire o metafora bilogica. Aceasta metafora biologica este cea a mostenirii genetice si evolutiei naturale
Tehnici de inteligenţă computaţională în electronică, G. Oltean
1 /24
ALGORITMI GENETICI
Introducere ¾AG sunt metode de cautare stocastice care mimeaza evolutia naturala biologica ¾Opereaza pe o populatie de solutii potentiale aplicand principiul supravietuirii celui mai bun (teoria evolutionista Darwin) pentru a produce aproximari din ce in ce mai bune ale solutiei. ¾Fiecare individ al populatiilor se descrie printr-un singur cromozom ¾Genotipul fiecarui individ contine un singur cromozom Tehnici de inteligenţă computaţională în electronică, G. Oltean
2 /24
ALGORITMI GENETICI
Introducere – cont.
¾In fiecare generatie este creat un nou set de indivizi (aproximatori, cautatori) in urma selectiei celor mai adecvati indivizi si combinarea acestora pentru a da nastere la noi indivizi utilizand operatori imprumutati din genetica ¾Are loc evolutia populatiei de indivizi care astfel devin mai adecvati (potriviti) mediului decat indivizii din care au fost creati, similar cu adaptarea naturala. ¾Sunt modelate procese naturale: selectie, recombinare, mutatie. Tehnici de inteligenţă computaţională în electronică, G. Oltean
3 /24
ALGORITMI GENETICI
Structura unui AG
Tehnici de inteligenţă computaţională în electronică, G. Oltean
4 /24
ALGORITMI GENETICI
Reprezentarea variabilelor ¾ Specifica AG este notiunea de cromozom, ce contine toate informatiile necesare reprezentarii unui individ. ¾ Un cromozom este compus din gene – variabila a problemei de optimizat ¾ Cromozom generic in care fiecare gena reprezinta o variabila:
¾ “Alfabetul” utilizat in reprezentarea genelor poate fi teoretic orice alfabet, cele mai utilizate fiind: reprezentarea binara reprezentarea reala – specifica problemelor ingineresti
Tehnici de inteligenţă computaţională în electronică, G. Oltean
5 /24
ALGORITMI GENETICI
Reprezentarea variabilelor - binar ¾ De exemplu in cazul unei variabile cu valori in domeniul (0, 255) se utilizeaza un sir de 8 biti:
0:
00000000
127 : 01111111 128 : 10000000 255 : 11111111
• cea mai mica schimbare in valoarea functiei obiectiv (intre 127 si 128) poate solicita schimbarea tuturor bitilor – nu este de dorit ! • solutie: codul Gray – distanta Hamming intre valori adiacente este 1 o Provocari la reprezentarea in binar: • rezolutia • numere zecimale • numere negative • mai multe variabile • ramanerea in domeniul dinamic al fiecarei variabile Tehnici de inteligenţă computaţională în electronică, G. Oltean
6 /24
ALGORITMI GENETICI
Reprezentarea variabilelor – valori reale ¾ De exemplu in cazul a trei variabile putem avea:
124; 10,56; − 235 43; − 0,45; + 47
• avantaj major, in special pentru implementare: vector cu valori reale • pe parcursul evolutiei nu exista interactiune intre variabile diferite
o Provocari la reprezentarea cu valori reale: • mentinerea domenului dinamic al fiecarei variabile
Tehnici de inteligenţă computaţională în electronică, G. Oltean
7 /24
ALGORITMI GENETICI
Generarea populatiei initiale ¾ Uzual initializarea se realizeaza stocastic (aleator) ¾ Uneori se introduc in populatia initila catva indivizi selectati euristic (indivizi promitatori) si se completeaza cu indivizi alesi aleator ¾ Populatia initiala ar trebui sa conste dintr-o varietate mare a indivizilor ¾ Marimea populatiei: moderata 50 – 500 indivizi ¾ Marimea populatiei tinde sa creasca liniar cu dimensiunea unui individ • Generare aleatoare cu distributie de probabilitate uniforma POP_INIT=zeros(NumInd, NumVar); for i=1:NumVar RandVar=(HB(i)-LB(i)).*rand(NumInd,1)+LB(i); POP_INIT(:,i)=RandVar; end Tehnici de inteligenţă computaţională în electronică, G. Oltean
8 /24
ALGORITMI GENETICI
Functia de adecvare ¾ Functia de adecvare (fitness) se determina in concordanta cu valoarea functiei obiectiv definita pentru problema de optimizare de rezolvat. ¾ Formularea problemei de optimizare este de tipul minimizeaza sau maximizeaza (se poate trece de la una la cealalta utilizand semnul minus in fata functiei)
¾ Exemplu de problema de minimizare
Gaseste x care minimizeaza F ( x ) pentru ∀x ∈ D
Functia De Jong – 2 variabile
x = [ x1 , x2 ];
F ( x1 , x2 ) = x12 + x22 ; D = [−10,10] x [−10,10]
Tehnici de inteligenţă computaţională în electronică, G. Oltean
9 /24
ALGORITMI GENETICI
Functia de adecvare - cont ¾ Pentru probleme de optimizare multiobiectiv exista doua variante: Optimizare multiobiectiv reala – multimea solutiilor optime Pareto Transformarea intr-o problema cu un singur obiectiv prin combinarea functiilor obiectiv individuale intr-o singura functie cost – rezulta o singura solutie N
Gaseste x care minimizeaza F ( x ) = ∑ wk f k ( x ) pentru ∀x ∈ D k =1
unde wk sunt ponderi ce arata preferinta relativa pentru fiecare dintre functiile obiectiv f k ( x)
¾ Ca functie de adecvare se poate utiliza direct functia obiectiv dar apare un neajuns: Dupa un anumit numar de generatii multe dintre valorile functiei de adecvare vor fi foarte apropiate de valoarea optima, ceea ce conduce la dificultati in diferentierea indivizilor in procesul de selectie (convergenta prematura, pirderea diversitati populatiei) Solutie: ordonarea indivizilor in functie de valoarile functiei obiectiv Tehnici de inteligenţă computaţională în electronică, G. Oltean
10 /24
ALGORITMI GENETICI
Atribuirea adecvarii - ordonare ¾ Functie de adecvare proportionala ¾ Functie de adecvare bazata pe rang (in urma ordonarii) liniara neliniara
¾ Functie de adecvare multiobiectiv ordonare Pareto (multi-ranking) atingerea scopului insumare ponderata
Tehnici de inteligenţă computaţională în electronică, G. Oltean
11 /24
ALGORITMI GENETICI
Atribuirea adecvari bazata pe ordonare ¾ Populatia este ordonata in concordanta cu valoarea functiei obiectiv ¾ Valoarea adecvarii atribuita fiecarui individ depinde numai de pozitia sa in urma ordonarii si nu de valoarea functiei obiectiv ¾ Fiecare individ primeste o probabilitate de reproducere depinzand de propria valoare a functiei obiectiv si de valorile functiilor obiectiv a celorlalti indivizi
Pos − 1 Adecvare(Pos ) = 2 − PS + 2(PS − 1) Nind − 1 Pos - pozitia; Nind − dimensiunea populatiei PS - presiunea de selectie • Cel mai adecvat individ are Pos=Nind
si cea mai mare valoare a functiei de adecvare • Cel mai putin potrivit individ are Pos=1 si cea mai mica valoare a functiei de adecvare Tehnici de inteligenţă computaţională în electronică, G. Oltean
12 /24
ALGORITMI GENETICI
Atribuirea adecvari bazata pe ordonare – cont. Pos − 1 Adecvare(Pos ) = 2 − PS + 2(PS − 1) Nind − 1 Pos - pozitia; Nind − dimensiunea populatiei PS - presiunea de selectie
De regula
PS ∈ [1, 2]
Cresterea presiunii de selectie focalizeaza cautarea asupra celor mai performanti indivizi, exploatand cele mai bune solutii • Convergenta prematura a cautarii, pierdere a diversitatii genetice, reducerea capacitatii de explorare a spatiului starilor Reducerea presiunii de selectie poate duce la uniformizarea selectiei, cautarea devenind putin eficienta • creste capacitatile de explorare, in procesul de selectie fiind inclusi mai multi cromozomi Trebuie mentinut un echilibru explorare - exploatare
Tehnici de inteligenţă computaţională în electronică, G. Oltean
13 /24
ALGORITMI GENETICI
Atribuirea adecvari bazata pe ordonare Adecvare = fitness value
Problema de minimizare
Tehnici de inteligenţă computaţională în electronică, G. Oltean
14 /24
ALGORITMI GENETICI
Selectia
¾ Determinarea populatiei intermediare ce contine parintii care vor fi supusi operatorilor genetici de recombinare si mutatie - selectarea indivizilor care vor produce urmasi. ¾ Metode:
aleatoare – in procesul de selectie sunt introduse elemente aleatoare, in general prin utilizarea unor probabilitati de selectie care depind de gradul de adecvare. Elementele cu grad mare de adecvare au sanse mai mari de a fi selectate, astfel ca numarul de urmasi ai acestora poate fi mai mare decat al celor cu grad mai mic de adecvare Selectia tip ruleta (esantionare stocastica cu inlocuire); selectie de tip turneu, selectie proportionala. deterministe – indivizii cu grad mare de adecvare sunt intotdeauna selectati in defavoarea celor cu grad mai mic de adecvare: selectia prin trunchiere
¾ Elitism: supravietuirea celui mai bun dintre indivizii generatiei pana la un moment dat – de exemplu prin amplasarea explicita a celui mai bun individ al populatiei curente in populatia corespunzatoare generatiei urmatoare Tehnici de inteligenţă computaţională în electronică, G. Oltean
15 /24
ALGORITMI GENETICI
Selectia tip ruleta ¾ Algoritm stocastic ¾ Indivizii sunt atribuiti la segmente contigue a unei linii astfel ca lungimea fiecarui segmant sa fie proportionala cu gradul sau de adecvare. ¾ Se genereaza un numar aleator si este selectat individul al carui segment corespunde valorii aleatoare ¾ Procesul se repeta pana cand este selectat numarul dorit de indivizi ¾ Procesul este asemanator rotii de ruleta in care marimea fiecarei “felii” este proportionala cu gradul de adecvare ¾ Pentru fiecare individ se calculeaza o probabilitate de selectie:
Selection _ probability (i ) =
Fitness(i ) N
∑ Fitness(i) i =1
Tehnici de inteligenţă computaţională în electronică, G. Oltean
16 /24
ALGORITMI GENETICI
Selectia tip ruleta ¾ Algoritm stocastic ¾ Indivizii sunt atribuiti la segmente contigue a unei linii astfel ca lungimea fiecarui segmant sa fie proportionala cu gradul sau de adecvare. ¾ Se genereaza un numar aleator si este selectat individul al carui segment corespunde valorii aleatoare ¾ Procesul se repeta pana cand este selectat numarul dorit de indivizi ¾ Procesul este asemanator rotii de ruleta in care marimea fiecarei “felii” este proportionala cu gradul de adecvare ¾ Pentru fiecare individ se calculeaza o probabilitate de selectie:
Selection _ probability (i ) =
Fitness(i ) N
∑ Fitness(i) i =1
Tehnici de inteligenţă computaţională în electronică, G. Oltean
17 /24
ALGORITMI GENETICI
Selectia tip ruleta - cont
Au fost selectati indivizii: 6, 2, 9, 1, 5 si 3 Adica 1, 2, 3, 5, 6 si 9 Tehnici de inteligenţă computaţională în electronică, G. Oltean
18 /24
ALGORITMI GENETICI
Recombinare ¾ Produce noi indivizi (urmasi) prin combinarea informatiilor continute de doi sau mai multi parinti ¾ Combinarea valorilor variabilelor parintilor ¾ Tipuri de recombinari: discreta pentru valori reale: recombinare intermediara recombinare liniara recombinare liniara extinsa
pentru valori binare (incrucisare - crossover): incrucisare cu un singur puncte / cu doua puncte / cu puncte multiple incrucisare uniforma etc. Tehnici de inteligenţă computaţională în electronică, G. Oltean
19 /24
ALGORITMI GENETICI
Var
U j
Recombinare intermediara = a Var + (1 − a )Var , j = 1, 2, ..., Nvar j
P1 j
j
P2 j
VarjU - reprezinta variabila j a urmasului VarjP1 , VarjP 2 - reprezinta variabila j a primului, respectiv celui de-al doilea parinte a - reprezinta factorul de scalare, generat aleator in intervalul [-d, 1+d] uzual d=0,25
Aria posibila a urmasilor
Tehnici de inteligenţă computaţională în electronică, G. Oltean
20 /24
ALGORITMI GENETICI
Recombinare intermediara – cont. Var = a Var + (1 − a )Var , j = 1, 2, ..., Nvar U j
j
P1 j
j
P2 j
Din subpopulatia selectata pentru recombinare, cum sunt alesi cei doi parinti care genereaza urmasi? Tehnici de inteligenţă computaţională în electronică, G. Oltean
21 /24
ALGORITMI GENETICI
Mutatia ¾ Indivizii (urmasii) sunt modificati aleator ¾ Mutatie Pentru variabile reale Pentru variabile binare
Mutatia pentru variabile reale ¾ Valori create aleator sunt adaugate variabilelor reale ¾ Trebuiesc definite: Probabilitatea ca o variabila sa sufere o mutatie (rata de mutatie) • Este invers proportionala cu numarul variabilelor • O valoare optima se pare a fi 1/Nvar - o singura variabila a unui individ surefa procesul de mutatie Valoarea schimbarii variabilei prin procesul de mutatie Tehnici de inteligenţă computaţională în electronică, G. Oltean
22 /24
ALGORITMI GENETICI
Mutatia
Tehnici de inteligenţă computaţională în electronică, G. Oltean
23 /24
ALGORITMI GENETICI
Reinsertia ¾ Generarea noii populatii ¾ Reinsertie globala Numar urmasi > numar parinti: toti parintii sunt inlocuiti de urmasi Numar urmasi < numar parinti: se inlocuiesc parinti in mod aleator Numar urmasi < numar parinti: se inlocuiesc parintii cu cel mai scazut grad de adecvare Numar urmasi > numar parinti: se inlocuiesc toti parintii cu cei mai buni urmasi
Reinsertie locala
Tehnici de inteligenţă computaţională în electronică, G. Oltean
24 /24
Laboratorul 5 – Învăţare Automata
Algoritmi genetici
Algoritmi genetici 1.1 Generalităţi Algoritmii genetici fac parte din categoria algoritmilor de calcul evoluţionist şi sunt inspiraţi de teoria lui Darwin asupra evoluţiei. Idea calculului evoluţionist a fost introdusă în 1960 de I. Rechenberg în lucrarea intitulată “Evolution strategies”. Algoritmii genetici au fost aplicaţi cu succes într-o varietate de aplicaţii care necesită optimizarea globală a soluţiei. Algoritmii genetici se referă la un model introdus şi analizat de J. Holland în 1975 şi sunt proceduri adaptive care găsesc soluţia problemei pe baza unui mecanism de selecţie naturală şi evoluţie genetică. Algoritmul este des folosit pentru probleme în care găsirea soluţiei optime nu este uşoară sau cel puţin ineficientă datorită caracteristicilor căutării probabilistice. Algoritmii genetici codifică o soluţie posibilă la o problemă specifică într-o singură structură de date numită „cromozom” şi aplică operatori genetici la aceste structuri astfel încât să menţină informaţiile critice. Algoritmii genetici pornesc de la o mulţime iniţială de soluţii (de obicei aleasă aleator) numită în literatură „populaţie”. În această populaţie fiecare individ este numit „cromozom” şi reprezintă o soluţie posibilă a problemei. În aproape toate cazurile cromozomul este un şir de simboluri (de obicei reprezentat ca un şir de biţi). Aceşti cromozomi evoluează pe durata iteraţiilor succesive numite generaţii. În fiecare generaţie, cromozomii sunt evaluaţi utilizând unele măsuri de potrivire (fitness). Pentru crearea următoarei populaţii cei mai buni cromozomi din generaţia (populaţia) curentă sunt selectaţi şi noii cromozomi sunt formaţii folosind unul dintre cei trei operatori genetici esenţiali: selecţia, crossover şi mutaţia. Selecţia asigură că anumiţi cromozomi din generaţia curentă sunt copiaţi în acord cu valoarea funcţiei lor de potrivire în noua generaţie ceea ce înseamnă că cromozomii cu o importanţă mare au o probabilitate mare să contribuie la formarea noii generaţii. Crossover este un alt operator genetic care reprezintă procesul prin care pe baza a doi cromozomi din populaţia curentă sunt formaţi doi cromozomi pentru populaţia următoare. Mutaţia este procesul prin care un cromozom din populaţia curentă este modificat şi salvat în noua populaţie.
1 of 6
Laboratorul 5 – Învăţare Automata
Algoritmi genetici
1.2 Codificarea cromozomilor şi problema de optimizare Algoritmii genetici au două componente principale care depind de problema abordată: codificarea problemei şi funcţia de evaluare (de fitness). Cromozomii care reprezintă codificarea problemei trebuie într-o oarecare măsură să conţină informaţiile despre soluţia problemei şi depind foarte mult de problemă. Există mai multe codificări, care au fost utilizate cu succes cum ar fi codificarea binară (cromozomul este format din şiruri de 0 sau 1 care reprezintă binar soluţia problemei) sau codificarea prin valoare (cromozomul este format dintr-un şir de valori vector întregi sau reale care pe ansamblu reprezintă soluţia problemei). De exemplu un cromozom poate avea următoare formă (reprezentat prin valoare): Cromozom 1 -0.23 0 Cromozom 2
0
0
0.89
0
0 0.08 -0.67 -0.01
0.52 0 0 0 0
0
0 0 0 0.01
-0.04 … 0.03 0
… 0.01
Funcţia de evaluare numită şi funcţia de „fitness” (potrivire) este funcţia care ne permite să dăm o încredere la fiecare cromozom din populaţie. Această funcţie este de obicei funcţia care reprezintă descrierea problemei. Când trebuie să rezolvăm o problemă, de obicei ne uităm după anumite soluţii care sunt mai bune decât alte soluţii obţinute anterior. Spaţiul tuturor soluţiilor fezabile este numit spaţiul de căutare sau spaţiul stărilor. Problemele abordate folosind algoritmi genetici sunt de obicei probleme pentru care căutarea în spaţiul soluţiilor este o problemă complicată sau chiar (NP-completă). De obicei nu ştim unde să ne uităm după soluţie şi de unde să începem. Soluţiile obţinute folosind algoritmi genetici sunt de obicei considerate ca soluţii bune deoarece nu este întotdeauna posibil să cunoaştem care este optimul real.
1.3 Metode de selecţie a cromozomilor Un alt pas important în algoritmul genetic este cum selectăm părinţii din populaţia curentă care vor alcătuii noua populaţie. Aceasta poate fi făcută în mai multe feluri, dar idea de bază este de a selecta cei mai buni părinţi (în speranţa că aceştia vor produce cei mai buni copii). În acest pas poate apărea o problemă: făcând noua populaţie doar pe baza noilor copii obţinuţii poate duce la pierderea celui mai bun cromozom obţinut până la acel pas. De obicei această problemă este rezolvată prin utilizarea aşa numitei metode de „elitism”. Adică cel puţin un cromozom care produce cea mai bună soluţie conform cu funcţia de fitness este copiat fără nici o modificare în noua populaţie, astfel cea mai bună 2 of 6
Laboratorul 5 – Învăţare Automata
Algoritmi genetici
soluţie obţinută până la acel moment să nu se pierde. Ca si metode de selecţie a cromozomilor propunem două metode, fiecare dintre ele cu avantajele şi dezavantajele ei:
1.3.1 Metoda „Roulette Wheel” (ruleta) În această metodă fiecare individ din populaţia curentă este reprezentat printr-un spaţiu proporţional cu valoarea funcţiei lui de evaluare. Prin eşantionări aleatoare succesive din acest spaţiu de reprezentare a cromozomilor asigură că cei mai buni cromozomi au şanse mai mari să fie selectaţi la un anumit pas decât cei cu mai slabi. Această metodă de selecţie va avea probleme în momentul în care valoarea funcţiei de evaluare diferă foarte mult de la un cromozom la altul. De exemplu dacă cel mai bun cromozom are valoare funcţiei de evaluare mare (care va ocupa 90% din spaţiul de reprezentare) iar restul cromozomilor au valori ale funcţiilor de evaluare foarte mici această metodă va selecta de foarte multe ori cromozomul cel mai bun ducând în final la degenerarea populaţiei.
1.3.2 Selecţia utilizând metoda lui Gauss Paşii propuşi pentru această metodă sunt: 1. Se alege un cromozom din populaţie curentă. 2. Utilizând formula lui Gauss calculăm probabilitatea ca acel cromozom să fie un cromozom bun (Acela care obţine valoarea funcţie de evaluare maximă).
P(ci ) = e
−
( M − fitness ( ci )) 2 2σ 2
unde P(.) reprezintă probabilitatea calculată pentru cromozomul ci, M reprezintă media, care aici este valoarea maximă care poate fi obţinută de către funcţia de evaluare şi σ care reprezintă dispersia sau panta cu care scade probabilitatea, iar fitness(ci) reprezintă valoarea funcţiei de evaluare pentru acel cromozom. De exemplu dacă valoare maximă a funcţiei de evaluare este 1, M va fi 1 iar pentru dispersie propunem o valoare între 0.3-0.5. 3. În al treilea pas această probabilitate calculată este comparată cu o probabilitate aleasă aleator în domeniul [0,1] (Probabilitatea lui Gauss întoarce valori în acest domeniu). 4. Se verifică dacă probabilitatea lui Gauss calculată pentru cromozomul ales este mai mare decât probabilitatea aleasă aleator: 3 of 6
Laboratorul 5 – Învăţare Automata
Algoritmi genetici
a. Dacă da cromozomul ales aleator se ia în considerare pentru a forma noua populaţie b. Dacă nu se trece din nou la pasul 1 Această metodă asigură posibilitatea luării în considerare şi a cromozomilor care nu au obţinut valori mari pentru funcţia de evaluare (oferă şanse mai mari de evoluţie şi cromozomilor mai slabi).
1.4 Operatorii genetici 1.4.1 Selecţia Pentru acest operator genetic de obicei se selectează doar un singur cromozom din populaţia. Acest cromozom este copiat în noua populaţie fără nici o modificare. Această metodă se mai foloseşte şi pentru a nu pierde cromozomul care a obţinut cea mai bună valoare la funcţia de evaluare (elitism) în populaţia curentă. De asemenea, acest operator se aplică şi pentru alţi cromozomi selectaţi pe baza metodelor de selecţie propuse dar de obicei acest operator apare de un număr mic de ori la generarea noii populaţii.
1.4.2 Mutaţia Mutaţia este un alt operator genetic important şi reprezintă un proces prin care cromozomul curent îşi modifică ocazional una sau mai multe valori într-un singur pas. Mutaţia depinde de asemenea de codificarea cromozomului. Mutaţia alege doar un singur candidat şi aleator modifică unele valori ale acestuia (modificând doar semnul acelei valori sau uneori se modifică şi valoarea – in cazul reprezentării prin valoare sau se schimbă doar valoarea în cazul reprezentării binare). Mutaţia funcţionează prin alegerea aleatoare a numărului de valori care vor fi schimbate şi a modului de modificare a acestora. Prezentăm un exemplu de modificare a 2 cromozomi primul având trei puncte de modificare iar al doilea doar două puncte de modificare. În funcţie de dimensiunea cromozomului se alege numărul de puncte pentru care se aplică mutaţia. Original 1 Original 2
-0.23 0 0
0
0.89
0
0 0.08 -0.67 -0.01
Urmaş modificat 1
0.23
0
0
0.89
0
Urmaş modificat 2
1.0
0 0.08 -0.67 -0.01
4 of 6
0.52 0 0 0
0 0
0
0
0
0.01
0.52 0 0 -1.0 0
0 0
0
0 0.1
-0.04 … 0
…
0.03 0.01
-0.04 … -0.03 0
…
0.01
Laboratorul 5 – Învăţare Automata
Algoritmi genetici
1.4.3 Crossover Crossover poate fi văzut ca crearea următoarei populaţii folosind populaţia curenta. Acest operator depinde foarte mult de tipul de codificare al cromozomilor. Metoda de crossover este aplicată la o pereche de părinţi aleşi folosind una din metodele prezentate. Cu o probabilitate pc părinţii sunt recombinaţi pentru a forma doi noi copii care vor fi introduşi în noua populaţie. De exemplu luăm 2 părinţi din populaţia curentă, îi împărţim şi încrucişăm componentele astfel încât să producem 2 noi candidaţi. Aceşti candidaţi în urma încrucişării trebuie să reprezenta o soluţie posibilă pentru parametrii problemei noastre de optimizare de aceea de obicei se interschimbă valori de pe aceleaşi poziţii. Utilizând un punct de recombinare putem crea noii candidaţi prin combinarea primei părţi din primul părinte cu a doua parte din al doilea părinte. După recombinare se poate face aleator o mutaţie pe noii candidaţi obţinuţii. Dacă dimensiunea cromozomului este mare se pot alege mai multe puncte de recombinare. Prezentăm un exemplu cu două puncte de recombinare: Cromozom 1 -0.23 0 Cromozom 2 Urmaş1 Urmaş 2
0
0.89
0
0.52 0 0 0
0 0.08 -0.67 -0.01
-0.23 0 0
0 0
0.89
0 0.08 -0.67
-0.01 0
0
-0.04 … 0.03
0
0 0 0 0.01
0
… 0.01
0
0 0 0 0.01
0
… 0.03
0.52 0 0 0
0
-0.04 … 0.01
1.5 Paşii algoritmului genetic: 1. Se codifică datele problemei într-un cromozom. 2. Se generează aleator o populaţie. Se recomandă ca populaţia să aibă un număr suficient de mare de cromozomi (50 -100 cromozomi – soluţii aleatoare la problemă). Fiecare valoare din cromozom este iniţializată cu o valoare aleatoare mică. 3. Pentru fiecare cromozom din populaţie se calculează încrederea acestuia folosind funcţia de evaluare (fitness). 4. Dacă s-a găsit un cromozom pentru care se obţine valoarea dorită se termină algoritmul iar acel cromozom reprezintă soluţia problemei (în cazul în care se ştie unde dorim să ajungem). O altă condiţie de terminare a algoritmului ar putea fi cazul în care după un număr specificat de paşi nu s-au mai obţinut îmbunătăţiri (în cazul în care nu ştim exact valoarea unde vom ajunge). 5. Folosind rezultatele funcţiei de evaluare se generează următoare populaţie astfel: a. Se vor selecta primii cei mai buni 50% din cromozomi din prima populaţie şi se vor 5 of 6
Laboratorul 5 – Învăţare Automata
Algoritmi genetici
copia în noua populaţie; b. Pentru restul de 50% din noua populaţie se vor folosii operatorii de mutaţie şi crossover astfel: i. Se selectează aleator folosind una din metodele prezentate unul sau doi cromozomi din prima jumătate a noii populaţii. ii. Dacă s-a selectat doar un cromozom se aplică acestuia operatorul de mutaţie. iii. Dacă s-au selectat 2 cromozomi se aplică operatorul de crossover. 6. Se sare la pasul 3. Problema. Să se implementeze un algoritm genetic pentru calcul minimului următoarei funcţii: f ( x) = sinh (cos( x) * cos( x) + 1), pentru x ∈ [0,5] , x număr real
Obs. ª Pentru această problemă un cromozom va fi format din reprezentarea binară a numărului x. ª Se va folosi o populaţie de 100 de cromozomi. ª Funcţia de fitness pentru această problemă va fi de fapt funcţia f(x) prezentată mai sus. ª Pentru a respecta teoria evoluţiei se recomandă ca operatorii de mutaţie şi selecţie să se folosească de un număr considerabil redus de ori în comparaţie cu operatorul crossover pentru generarea unei noi populaţii. Exemplu de algoritm genetic: http://www.obitko.com/tutorials/genetic-algorithms/example-functionminimum.php
6 of 6
( ) { } , care trebuie maximizată (un genotip este un vector 1. Fie funcţia ( ) ∑ binar cu 7 componente). a. Scrieţi o funcţie MATLAB pentru generarea aleatoare a unei populaţii (pop) cu dimensiunea dim; calitatea fiecărui individ este memorată la sfârşitul fiecărei reprezentări cromozomiale; (1 punct) b. Pentru o probabilitate de recombinare dată (pc), scrieţi o funcţie de recombinare utilizând operatorul de încrucişare multi-punct pentru 2 puncte de încrucişare care generează o nouă populaţie (popc), pe baza populaţiei pop. Populaţia rezultată are tot dim indivizi (este utilizată şi recombinarea asexuată şi calitatea fiecărui individ este memorată la sfârşitul fiecărei reprezentări cromozomiale) (2 puncte)
{ } { } ( ) ( ) 2. Fie funcţia obiectiv a unei } ( ) din mulţimea { probleme de maxim. Cromozomii sunt reprezentaţi prin şiruri { } a. Scrieţi o funcţie MATLAB pentru generarea aleatoare a unei populaţii (pop) cu dimensiunea dim; calitatea fiecărui individ este memorată la sfârşitul fiecărei reprezentări cromozomiale (1 punct); b. Pentru o probabilitate de mutaţie dată (pm) scrieţi o funcţie mutaţie pe baza operatorului resetare aleatoare care generează o nouă populaţie (popm) pornind de la populaţia pop (calitatea fiecărui individ este memorată la sfârşitul fiecărei reprezentări cromozomiale). (2 puncte)
3. Fie problema rucsacului de tip 0-1, enunţată în cele ce urmează. Fiind date m obiecte, fiecare având asociate o valoare şi respectiv un cost de selecţie, trebuie determinat un set de obiecte cu proprietatea că este de valoare maximă (unde valoarea unei mulţimi de obiecte este definită ca suma valorilor obiectelor ce o compun) şi costul (definit ca suma costurilor obiectelor setului) este sub un prag dat, Cmax. O soluţie posibilă este dată de un set de obiecte selectate astfel încât costul lui este inferior valorii Cmax. Dacă val este vectorul valorilor asociate celor m obiecte şi cost este vectorul costurilor, reprezentarea unui candidat la soluţie poate fi realizată printr-un vector (v) de m elemente, unde ()
{ ∑
()
()
Funcţia de evaluare asociată lui v calculează valoarea asociată selecţiei reprezentate de v: ∑
()
()
{ } şi v este reprezentarea binară a lui R-1 şi cu Fiecare genotip v corespunde unui număr proprietatea că nu este depăşit pragul Cmax. a. Scrieţi o funcţie MATLAB pentru generarea aleatoare a unei populaţii (pop) cu dimensiunea dim; calitatea fiecărui individ este memorată la sfârşitul fiecărei reprezentări cromozomiale; costurile şi valorile de selecţie ale fiecărui obiect sunt memorate într-un fişier text, creat înaintea generării populaţiei (1 punct) b. Scrieţi o funcţie MATLAB care selectează o populație de părinți din populaţia generată (pop) prin ( ) aplicarea selecţiei de tip ruletă cu distribuţia de probabilitate exponenţială, dată prin (
)
unde este un parametru care asigură faptul că ∑
( )
funcţie de meritul indivizilor înaintea aplicării procedurii de selecţie). (2 puncte)
(pop trebuie sortată crescător în
Implementarea utilizând un vector care mentine indicia ciclurilor la nivel de genă (poziție) function [x2,y2]=cx_copil(x1,y1) %vectorul c pastreaza indexul ciclului in care se afla fiecare gena [~,m]=size(x1); [c,nrcicluri]=cicluri(x1,y1,m); disp('Indecsii ciclurilor:'); disp(c); x2=x1;y2=y1; for t=2:2:nrcicluri for i=1:m if(c(i)==t) x2(i)=y1(i); y2(i)=x1(i); end; end; end; disp('Progeniturile:'); disp(x2); disp(y2); end function [c1,index]=cicluri(x1,y1,m) c1=zeros(1,m); continua=1;i=1;index=1; while(continua) a=y1(i); c1(i)=index; while(x1(i)~=a) [~,j]=ismember(a,x1); c1(j)=index; a=y1(j); end; continua=0; for k=1:m if(c1(k)==0) i=k;index=index+1; continua=1; break; end; end; end; end
Exemplu: x1=[ 4
8 13 16
2 19 10
9
7 11 17 18 12
y1=[ 2
5 19
4 17 11 20
9
3
1 16 18
8
5 20
3
6 15
6 12 13 10
1 14]
7 15 14]
>> cx_copil(x1,y1); Indecsii ciclurilor: 1
2
3
1
1
3
2
4
3
3
1
5
2
2
2
3
2
3
3
6
Progeniturile: 4
5 13 16
2 19 20
9
7 11 17 18
2
8 19
4 17 11 10
9
3
8
1 16 18 12
6 12
3 10 15
5 20 13
6
1 14
7 15 14
Implementarea utilizând un vector care mentine indicia ciclurilor la nivel de alelă (valoare) function [x2,y2]=cx_copil_alela(x1,y1) %vectorul c pastreaza indexul ciclului in care se afla fiecare alela [~,m]=size(x1); [c,nrcicluri]=cicluri(x1,y1,m); disp('Indecsii ciclurilor:'); disp(c); x2=x1;y2=y1; for t=2:2:nrcicluri for i=1:m if(c(i)==t) [~,j]=ismember(i,x1); x2(j)=y1(j); y2(j)=x1(j); end; end; end; disp('Progeniturile:'); disp(x2); disp(y2); end function [c1,index]=cicluri(x1,y1,m) c1=zeros(1,m); gata=0;i=1;index=1; while(~gata) a1=x1(i); c1(a1)=index; a=y1(i); while(y1(i)~=a1) a=y1(i); [~,j]=ismember(a,x1); c1(a)=index; i=j; end; gata=1; for k=1:m if(c1(x1(k))==0) i=k;index=index+1; gata=0; break; end; end; end; end
Exemplu (același ca cel din primul caz): x1=[ 4
8 13 16
2 19 10
9
7 11 17 18 12
y1=[ 2
5 19
4 17 11 20
9
3
1 16 18
8
5 20
3
6 15
6 12 13 10
1 14]
7 15 14]
>> cx_copil_alela(x1,y1); Indecsii ciclurilor: 3
1
3
1
2
2
3
2
4
2
3
2
3
6
3
1
1
5
3
2
Progeniturile: 4
5 13 16
2 19 20
9
7 11 17 18
2
8 19
4 17 11 10
9
3
8
1 16 18 12
6 12
3 10 15
5 20 13
6
1 14
7 15 14
Sunt obținute aceleași progenituri, diferă doar modul de interpretare ai indicilor din cicluri
4. Optimizarea portofoliilor de acţiuni. Abordări clasice şi de natură genetică 4.1. Randamentul / riscul unui portofoliu. Definirea problemelor de optimizare În cele ce urmează este prezentat calculul randamentului aşteptat, respectiv al riscului asociat unui portofoliu de acţiuni. (Bartholomeu-Biggs, 2005) Considerăm disponibil istoricul randamentelor procentuale pe m perioade de timp pentru fiecare acţiune dintr-un grup de n acţiuni şi notăm cu , randamentul acţiunii i în perioada j; , fracţiunea investită în acţiunea i, astfel încât , varianţa acţiunii i; , covarianţa dintre acţiunile i şi k. Portofoliul este definit de fracţiunile de investiţii . Randamentul mediu al fiecărei acţiuni
, notat cu
, este calculat prin
Randamentul aşteptat al portofoliului este dat prin
Varianţa fiecărei acţiuni acţiuni , sunt calculate prin
, respectiv covarianţa dintre oricare două
Varianţa portofoliului este definită prin
şi este utilizată ca măsură a riscului portofoliului. Funcţiile randament, respectiv risc, definite prin relaţiile (4.2), respectiv (4.5) sunt reprezentate matriceal prin
unde
De asemenea, în reprezentare matriceală relaţia
devine unde
este vectorul unitar n-dimensional.
Problema primară de minimizare a riscului, RISCMIN0, este formulată prin (Bartholomeu-Biggs, 2005) RISCMIN0: Minimizează cu restricţia . Observaţie. RISCMIN0 poate fi modificată prin eliminarea restricţiei şi a variabilei . În multe situaţii practice, investitorul este interesat atât în minimizarea riscului, cât şi în optimizarea randamentului portofoliului ales. În general, un portofoliu este considerat optim dacă el furnizează cel mai mare randament cu cel mai mic risc. O modalitate de a determina un astfel de portofoliu este prin considerarea funcţiei de tip compozit unde constanta pozitivă controlează raportul dintre randament şi risc. Cu aceste modificari se obţine problema de optimizare RISC-RANDAMENT1, (Bartholomeu-Biggs, 2005) RISC-RANDAMENT1: Minimizează cu restricţia . . Observaţie. RISC-RANDAMENT1 poate fi modificată prin eliminarea restricţiei şi a variabilei . O variantă alternativă pentru a determina portofoliul optim este de a fixa o valoare ţintă pentru randament, de exemplu de Rp procente, şi de a considera problema de optimizare RISCMIN1, (Bartholomeu-Biggs, 2005) RISCMIN1: Minimizează cu restricţiile
. sau, alternativ, problema modificată RISCMIN1M, RISCMIN1M: Minimizează
cu restricţia . Constanta pozitivă
semnifică raportul dintre randament şi risc.
O problemă des întâlnită în practică este aceea în care este selectat un nivel acceptabil de risc, , şi este maximizat randamentul aşteptat. Modelul matematic revine la problema de minimizare cu constrângeri RANDAMENTMAX1: RANDAMENTMAX1: Minimizează cu restricţiile . sau, alternativ, problema modificată RANDAMENTMAX1M, (Bartholomeu-Biggs, 2005): RANDAMENTMAX1M: Minimizează
cu restricţia . Constanta pozitivă portofoliului.
semnifică relaţia existentă între randamentul şi riscul
Observaţie. RISCMIN1M şi respectiv RANDAMENTMAX1M pot fi modificate prin eliminarea restricţiei şi a variabilei .
4.2. Optimizarea portofoliilor cu n acţiuni Definirea problemelor de optimizarea portofoliilor cu n acţiuni în termenii problemelor de optimizare fără constrângeri Prin utilizarea relaţiei (4.8), variabila
este poate fi eliminată,
şi funcţiile randament şi risc sunt exprimate exclusiv în termenii restricţia (4.8) poate fi eliminată din problemele de optim în care apare.
. În plus,
Fie , vector de dimensiune n-1, vector ndimensional, cu unicul element nenul şi B matrice de dimensiune , cu primele linii liniile corespunzătoare matricei unitate şi ultima linie formată cu elementul -1,
. Cu aceste notaţii, obţinem Similar celor prezentate în în §4.1, procedura MINRISC0 defineşte problema primară de minimizare a riscului în cazul unui portofoliu definit de fracţiunile de investiţii . Prin utilizarea relaţiei (4.13), rezultă (Bartholomeu-Biggs, 2005): MINRISC0: (4.14) Minimizează Relaţia (4.14) defineşte o problemă de optimizare fără constrângeri, în n-1 variabile. Dacă este o soluţie a problemei (4.14), atunci portofoliul de risc minim, notat , este definit prin
O serie de metode care rezolvă problema minimizării unei funcţii de mai multe variabile utilizează vectorul derivatelor parţiale de ordinul I, numit gradient. Dacă V este funcţie de m variabile, atunci gradientul lui V, notat sau , este definit prin
. Gradientul funcţiei obiectiv din relaţia (4.14) este (4.16) V 2BT Qα 2BT QBx 2BT Qα Bx Pentru rezolvarea problemelor de optim, unele metode necesită şi calculul derivatelor parţiale de ordinul II, adică a matricei Hessian. Dacă V este funcţie de m variabile, atunci matricea Hessian, notată 2V sau Vxx , este definită prin
2V 2V x x i j
1i m 1 j m
Hessianul funcţiei obiectiv din relaţia (4.14) este (4.17) 2V 2BT QB Problema RISCMIN1M, definită în în §4.1, poate fi exprimată în termenii unei probleme de optimizare fără restricţii prin utilizarea relaţiei (4.13), astfel (BartholomeuBiggs, 2005):
RISCMIN1M (4.18) Minimizează
Pentru calculul vectorului gradient şi al matricei Hessian pentru funcţia F definită în (4.18), considerăm reprezentarea unde şi
Sunt obţinute relaţiile unde şi Similar, este obţinută matricea Hessian, prin T Fxx Vxx 2R x R x unde Vxx 2BT QB şi
R x R x este o matrice cu rangul 1, pentru orice i,j, 1 i, j n 1 , R R T R x R x i , j xi x j T
Problema RANDAMENTMAX1 este reformulată în termenii RANDAMENTMAX1M (vezi în §4.1) şi, prin utilizarea relaţiei (4.13) rezultă problema de optimizare fără restricţii (Bartholomeu-Biggs, 2005): RANDAMENTMAX1M (4.19) Minimizează
Expresiile care definesc gradientul şi Hessianul funcţiei definite în (4.19) sunt obţinute prin reprezentarea 2 F R V Vac , unde R r T α Bx V α Bx Qα Bx şi T
Vacc 2
Rezultă
.
Fx BT r 2 V Va Vx
Fxx 2 Vx Vx V Va Vxx T
unde Vx Vx este matrice de rangul I; pentru orice i,j, 1 i, j n 1 , V V T Vx Vx i , j . xi x j T
Observaţii. 1. În cadrul problemelor enuţate în acesastă secţiune, nu este impusă codiţia ca fiecare să fie pozitiv. O valoare negativă a unei fracţiuni de investiţii are semnificaţia următoare: strategia optimă de investiţie implică vânzarea de tip “short selling”, adică vânzarea unor active pe care investitorul nu le deţine, prin împrumutul acestora de la broker cu intenţia de a le returna ulterior. Această strategie este efectivă doar în situaţia în care preţul acţiunilor este în scădere, deoarece achiziţionarea lor la un moment de timp ulterior investiţiei curente implică un cost mai mic decât preţul obţinut prin vânzarea activelor împrumutate la momentul efectuării investiţiei curente. 2. În general, soluţia unei probleme de risc minim nu implică situaţia de tip “short selling” dacă randamentul dorit este ales corespunzător, adică în conformitate cu randamentele medii calculate pentru activele care vor fi incluse în portofoliu. 4.3. Metode clasice de optimizare a funcţiilor de n variabile Condiţii de optimalitate Fie F x1 , x2 ,..., xn funcţie de variabile, continuă şi diferenţiabilă. Caracterizarea punctului de minim atins de F este realizată în termenii vectorului gradient şi a matricei Hessian T
F F F , notat în continuare cu g sau cu Fx , respectiv F , ,..., x x x 1 2 n 2 F 2F , matrice notată în continuare cu G sau Fxx x x 1i n i j 1 j n
Observaţie. În cazul în care F este dublu diferenţiabilă, matricea Hessian G este simetrică. Definiţia 4.1. Matricea simetrică A este pozitiv definită dacă şi numai dacă, pentru orice x 0 , are loc relaţia, xT Ax 0 . Definiţia 4.2.Fie F x, x x1 , x2 ,..., xn funcţie de n variabile şi x * cu proprietăţile
(4.20) g x * 0 şi G x * este pozitiv definită. Atunci x * este punct de minim local al lui F.
Dacă o funcţie F are mai multe minime locale (puncte ce îndeplinesc (4.20)), atunci minimul global este acel minim local pentru care este obţinută cea mai mică valoare a lui F. Observaţie. Problema RISCMIN0 poate fi rezolvată prin abordare analitică. Deoarece funcţia gradient este V 2BT Qα 2BT QBx , valoarea optimală a lui x este obţinută prin rezolvarea sistemului linia BT QBx BT Qα Metode directe de căutare a optimului În general, în problemele de optimizare a portofoliilor, vectorul gradient şi matricea Hessian pot fi în general calculate, funcţiile obiectiv fiind în general dublu diferenţiabile. Pentru situaţiile de acest gen sunt folosite metode de tip gradient. În cazul în care optimizarea nu poate fi realizată prin utilizarea relaţiilor (4.20), o variantă de rezolvare a problemelor de optimizare o constituie metodele de căutare directă, bazate exclusiv pe analizarea valorile funcţiei obiectiv. Căutarea directă a valorii minime a unei funcţii obiectiv F este realizată prin evaluarea lui F în punctele unei „reţele” de valori posibile ale vectorului variabilă a funcţiei. Deşi metodele de acest tip nu sunt în general eficiente, există situaţii în care valoarea minimă poate fi aproximată prin considerarea unei variante a lui F discretizată pe un set de puncte „aleatoare” şi utilizarea unor argumente de natură statistică pentru estimarea probabilităţii de determinare a minimului într-n anumit număr de încercări. Căutarea univariantă Metoda implică utilizarea unei metode directe de căutare (ca, de exemplu, metoda bisecţiei) pentru generarea unei secvenţe de tip minimizarea unidimensională a lui F astfel încât, la fiecare etapă i, 1 i n , F este minimizat în raport cu x i . Cu alte cuvinte, punctul optim este căutat de-a lungul direcţiilor date de fiecare coordonată pe rând. Deşi uneori metoda funcţionează eficient, ea nu poate fi general aplicabilă deoarece nu este convergentă. Metoda Hooke şi Jeeves Tehnica Hooke&Jeeves utilizează metoda căutării pe o singura axă pe baza următorului raţionament. Dacă xˆ , ~ x sunt estimări ale punctelor de minim ale lui F x la momentul iniţial, respectiv la momentul final al ciclului de căutare, atunci minimizarea x printr-o estimare de tipul unidimensională a alui F este realizată pe direcţia xˆ ~ ~ ~ (4.21) x x xˆ x , unde este o constantă scalară. Metoda continuă prin efectuarea ciclurilor de căutare univariantă urmate de estimări de forma (4.21). Metode de aproximare a derivatelor Una dintre cele mai uzuale metode de minimizarea a lui F x exclusiv pe baza valorilor funcţiei F este prin adaptarea metodelor de tip gradient la estimările de tip diferenţă finită ale derivatelor funcţiei. De exemplu, pentru derivatele de ordinul I poate fi utilizată estimarea diferenţă centrată F x1 , x2 ,..., xn F x1 h, x2 ,..., xn F x1 h, x2 ,..., xn x1 2h
Abordările care implică estimarea derivatelor funcţiei obiectiv sunt dezvoltate pe baza presupunerii că F este diferenţiabilă. În plus, metodele din această clasă nu sunt în general aplicate problemelor pentru care derivatele funcţiei F nu sunt funcţii continue.
Metode de tip gradient Aşa cum a fost menţionat, în problemele de optimizare a portofoliilor funcţiile obiectiv sunt dublu diferenţiabile şi relaţiile (4.20) pot fi verificate. Optimizarea funcţiilor în n variabile şi care îndeplinesc proprietăţile din definiţia 4.2 poate fi realizată prin metode de tip gradient, respectiv de tip Newton. Sunt prezentate în continuare metoda celei mai rapide (abrupte) descreşteri şi metoda Newton. Ambele metode presupun construcţia câte unui şir care, în anumite condiţii de regularitate impuse funcţiei obiectiv, converge către soluţia optimală a problemei de optimizare. Metoda celei mai rapide descreşteri Tehnica celei mai rapide descreşteri este justificată geometric astfel. Presupunem că este funcţia de minimizat şi este punctul construit la momentul curent. Un punct „mai bun” (în sensul că valoare funcţiei obiectiv descreşte în acel punct faţă de punctul curent) poate fi determinat prin deplasarea pe direcţia de căutare care determină descreşterea cea mai rapidă a lui F, adică pe direcţia gradientului negativ. Metoda celei mai rapide descreşteri de tip „perfect line search” este descrisă astfel (Bartholomeu-Biggs, 2005): Selectează , estimare iniţiale a punctului de minim al lui Repetă pentru
şi
calculează care minimizează aplică regula de actualizare Până când Observaţie. O serie de metode de optimizare utilizează în construcţia şirului tipare similare celui prezentat în algoritmul de mai sus; fiecare iteraţie constă în două etape: alegerea direcţiei de căutare (calculul lui ) şi respectiv procedura de determinare a demarcaţiei (line search) în scopul stabilirii unei valori adecvate a pasului . Definiţia 4.3. Procedura de determinare a demarcaţiei s * care minimizează s F x k sp k se numeşte perfectă sau exactă. Definiţia 4.4. O procedură de determinare a demarcaţiei prin care este acceptată orice valoare a pasului s care îndeplineşte F x k sp k F x k 0 şi este mărginită se numeşte inexactă sau slabă. În continuare este prezentată teorema de convergenţă a metodei. Propoziţia 4.1. Fie o funcţie dublu diferenţiabilă, cu derivatele continue şi mărginită inferior şi pentru care este îndeplinită proprietatea
pentru orice vector z, unde M>0 este constantă scalară. Atunci şirul definit prin
are proprietatea când
Metoda Newton Tehnica celei mai abrupte descreşteri are inconvenientul că nu foloseşte informaţia dată de cea de-a doua derivată. Pot fi obţinute metode mai eficiente pe baza proprietăţii funcţiilor pătratice, Qx , de a avea matricea Hessian constantă. Fie 1 (4.22) Qx x T Ax b T x c . 2 Gradientul este Qx Ax b . Punctul staţionar rezultă prin rezolvarea sistemului de ecuaţii liniare (4.23) Ax b . Soluţia sistemului (4.23) este punct de minim dacă matricea Hessian, A, este pozitiv definită. Dacă A este negativ definită, soluţia sistemului (4.23) este punct de maxim. Dacă A este oarecare, soluţia lui (4.23) este punct şa. Dacă A este nesingulară, atunci (4.22) are un unic punct staţionar. Principiile expuse mai sus pot fi aplicate pentru minimizarea unei funcţii generale, F x . Fie x k estimaţia punctului de minim al lui F la momentul curent şi g k F x k , G k 2 F x k . Utilizând dezvoltarea Taylor în jurul lui x k obţinem 1 (4.24) F x k p Qp F x k p T g k p T G k p şi 2 (4.25) F x k p Qp g k G k p
Rezultă că, dacă G k este pozitiv definită, (4.26) p G k g k Este obţinut astfel următorul algoritm: T
Metoda Newton Selectează x 0 , estimare iniţiale a punctului de minim al lui F x şi 0 Repetă pentru k 0,1,2,... g k F x k , G k 2 F x k Dacă G k este pozitiv definită, atunci calculează p k G k g k Altfel p k g k T
calculează s * astfel încât F x k sp k îndeplineşte condiţiile Wolfe 2 şi 3 (Bartholomeu-Biggs, 2005) aplică regula de actualizare x k 1 x k s * p k
Până când F x k 1
Observaţie. În cazul problemei RISCMIN1M, matricea Hessian corespunzătoare funcţiei obiectiv este
deci este matrice constantă (nu depinde de x). G este pozitiv definită şi simetrică. Constanta M din propoziţia 4.1 (convergenţa metodei celei mai rapide descreşteri) poate fi setată astfel.
Deoarece G este pozitiv definită şi simetrică, rezultă că este diagonalizabilă şi există matrice cu coloane un set de vectori proprii ortogonali, corespunzători valorilor proprii
ale matricei G
astfel încât Rezultă că problema revine la calculul constantei M astfel încât
Pentru
.
În continuare obţinem
Deoarece
dacă
Rezultă că şi M poate fi setat pe valoarea
Exemplul 1
(valoarea proprie dominantă a matricei constante G)
În tabelul 4.1 este prezentat istoricul randamentelor corespunzătoare acţiunilor A1, A2, A3, A4, A5 pe o perioadă de 10 săptămâni. (Bartholomeu-Biggs, 2005)
A1 A2 A3 A4 A5
S1 1.2 1.3 0.9 1.1 0.8
S2 1.3 1.0 1.1 1.1 0.75
S3 1.4 0.8 1.0 1.2 0.65
S4 1.5 0.9 1.1 1.3 0.75
S5 1.1 1.4 1.1 1.2 0.8
S6 1.2 1.3 1.3 1.2 0.9
S7 1.1 1.2 1.2 1.1 1.0
S8 1.0 1.1 1.1 1.0 1.1
S9 1.0 1.2 1.0 1.1 1.1
S10 1.1 1.1 1.1 1.2 1.2
Tabelul 4.1 Problema de rezolvat: determinarea portofoliului de risc minim pentru un randament dat . Randamentul mediu al portofoliului rezultă
şi matricea de covarianţă este
Problema este modelată în termenii RISCMIN1M: Minimizează
Prin aplicarea metodelor de tip gradient, respectiv Newton prezentate, pentru eroarea permisă , rezultă portofoliul riscul minim randamentul , randamentul dat. Exemplul 2 În cadrul acestui exemplu au fost folosite date reale, selectate de pe Bursa de Valori din Londra, pe 20 de perioade de timp cuprinse între anii 2002 şi 2003. Vectorului medie a randamentelor şi a matricei de covarianţă sunt disponibile în (Bartholomeu-Biggs, 2005) şi au următoarele valori,
Observaţie. În cazurile reale, istoricul evoluţiei randamentelor acţiunilor poate înregistra şi valori negative şi, de asemenea, matricea de covarianţă poate avea valori mult mai mari decât în cazul datelor generate artificial (cum este cazul exemplului 1). Problema este modelată în termenii RISCMIN1M. Prin aplicarea metodelor de tip gradient, respectiv Newton prezentate, pentru eroarea permisă , rezultă portofoliul riscul minim randamentul , randamentul dat. Observaţie. Pentru aceeaşi eroarea permisă, 10 5 n , testele indică faptul că numărul de iteraţii ale metodei celei mai rapide descreşteri este de ordinul sutelor (în implementarea cu s M 1 constantă este de ordinul miilor), în timp ce metoda Newton necesită câteva zeci de iteraţii. Următoarea funcţie MATLAB implementează o metodă de tip gradient în care s M constantă. Este tratat separat cazul în care este disponibil istoricul acţiunilor şi cazul în care sunt cunoscute randamentul mediu şi matricea de covarianţă (similar exemplului 2). 1
function [y]=GRAD_riscmin1(nume,ro,Rp,eps,NM,caz); % GRAD_riscmin1('portofoliu1.txt',100,1.15,10^-5*sqrt(5),50000,0); % GRAD_riscmin1('',10,0.25,10^-5*sqrt(5),10000,1); % nume=numele fisierului din care sunt prelute datele % ro=din functia obiectiv % Rp=randamentul prognozat % NM=numarul de iteratii % eps = eroarea maxima admisa % caz=0 daca preiau date din fisier, altfel este 1 if(caz==0) R=citeste_date(nume); [n,m]=size(R); [Q,rmed,alpha,B]=parametri(R); else n=5; In1=eye(n-1); ul=-ones(1,n-1); B=[In1; ul]; alpha=zeros(n,1); alpha(n)=1; rmed=[-0.028, 0.366, 0.231, -0.24, 0.535]'; Q=[1.0256 -0.4340 0.0202 -0.1968 -0.0311; -0.4340 1.1049 -0.0783 0.2347 -0.1776; 0.0202 -0.0783 0.4328 -0.1236 -0.1895; -0.1968 0.2347 -0.1236 8.0762 1.0093; -0.0311 -0.1776 -0.1895 1.0093 2.9007]; end; % calcul matrice Hessian H=2*B.'*Q*B+2*(ro/(Rp^2))*(B.'*rmed)*(B.'*rmed).'; %disp(H); [V,D]=eig(H); % valoarea proprie maxima a matricei Hessian pentru stabilirea %valorii cu care este actualizat xk din teorema de convergenta Maxim=max(max(D)); rata=1/(Maxim);
k=1;er=1; x0=ones(n-1,1); x0=x0/(n-1); while((k<=NM)&&(er>=eps)) val=fgrad(Q,rmed,alpha,B,ro,Rp,x0); er=norm(val); x=x0-rata*val; x0=x; k=k+1; end; disp(['Eroarea: ' num2str(er)]); [vall,V]=fobiectiv(Q,rmed,alpha,B,ro,Rp,x); y=alpha+B*x; disp('Portofoliul calculat:');disp(y); disp(['Riscul minim calculat: ' num2str(V)]); disp(['Randamentul calculat: ' num2str(rmed.'*y)]); disp(['Randamentul predictionat: ' num2str(Rp)]); disp(['Numarul de iteratii: ' num2str(k)]); end
În continuare sunt prezentate evoluţiile algoritmului de tip gradient pentru fiecare din cele două exemple considerate. La apelul GRAD_riscmin1('portofoliu1.txt',100,1.15,10^-5*sqrt(5),50000,0);
La apelul GRAD_riscmin1('',10,0.25,10^-5*sqrt(5),10000,1);
4.4. Abordarea GA pentru problema optimizării portofoliilor de n acţiuni Problema pe care ne propunem să o rezolvăm este determinarea portofoliului de risc minim pentru un randament prognozat . Problema este modelată în termenii RISCMIN1M, transformată în problema de maxim. Maximizează . Pentru comparaţie vor fi folosite datele din tabelul 4.1 şi cele din exemplul 2. Vor fi tratate atât situaţiile de tip “short selling”, cât şi situaţiile în care acest lucru este evitat. Aşa cum am menţionat în §4.2, dacă randamentul prognozat este ales în conformitate cu randamentele medii calculate , în general soluţia unei probleme de risc minim nu implică situaţia de tip “short selling” pentru activele care vor fi incluse în portofoliu. La fiecare moment de timp, populaţia este constituită din dim indivizi. Fiecărui fenotip y (portofoliu) îi corespunde un cromozom definit de un şir cu n-1 numere reale, însoţit de informaţia calitatea evaluată în termenii funcţiei obiectiv. Din punct de vedere al reprezentării, este utilizat un vector x, cu
unde y este un portofoliu:
pentru este fracţiunea investită în acţiunea i, astfel încât şi şi este valoarea funcţiei obiectiv asociată vectorului (calitatea în termenii funcţiei de evaluare). Generarea populaţiei iniţiale este realizată aleator. Dacă este aleasă varianta în care nu este admisă o situaţie de tip “short selling”, sunt impuse constrângerile fiecărui individ x:
1. În caz contrar, fiecare alelă Pentru ca să fie în
este generată aleator uniform între -1 şi 1. , trebuie ca .
Operatorii de variaţie sunt definiţi astfel. Recombinarea este aplicată cu o rată pc şi revine la aplicarea operatorului de recombinare aritmetică totală, cu ponderea p, celor perechi de cromozomi aleşi aleator din populaţia de părinţi (fiecare pereche de cromozomi ocupă poziţiile în multisetul părinţilor). Pot fi utilizate două variante: 1. aceeaşi pereche de cromozomi poate fi generată de mai multe ori, respectiv 2. orice pereche de cromozomi aleşi ca părinţi este unică. Dacă o pereche de cromozomi nu generează progenituri prin recombinare aritmetică (aleator a fost generat un număr sub rata de încrucişare), atunci are loc recombinarea asexuată. Observaţie. Prin aplicarea operatorului de recombinare aritmetică totală, dacă doi indivizi respectă constrângerile (4.28), atunci şi progeniturile lor îndeplinesc (4.28). Această observaţie este importantă în contextul excluderii situaţiei de tip “short selling”. Operatorul de mutaţie ales este cel de tip fluaj, cu o probabilitate de mutaţie mică şi cu de asemenea foarte mic (aici a fost ales ). Operatorul este implementat în două variante. 2. Varianta în care este exclusă situaţia de tip “short selling”. Cu o rată pm, fiecare genă din fiecare cromozom suferă o mutaţie prin adăugarea unei valori generate din repartiţia normală de medie 0 şi varianţă , dar astfel încât cromozomul rezultat să corespundă unei soluţii fezabile (să fie îndeplinite condiţiile 4.28). Dacă prin modificarea valorii unei gene, a, rezultă un cromozom, x, care nu aparţine setului soluţiilor fezabile, atunci a este ajustată astfel încât x să îndeplinească 4.28: dacă a rezultă negativă, atunci a este setată pe valoarea 0, respectiv dacă suma valorilor genelor lui x, sv, este supraunitară, a este modificată astfel încât sv să devină 1 (implicit suma investită în ultima acţiune a portofoliului devine 0). 3. Varianta generală: cu o rată pm, fiecare genă din fiecare cromozom suferă o mutaţie prin adăugarea unei valori generate din repartiţia normală de medie 0 şi varianţă . Este impusă o restricţie prin care valoarea fiecărei alele să fie în intervalul deci, în modul, să fie subunitară, pentru a menţie semnificaţia fiecărei valori de fracţiune investită în acţiunea corespunzătoare. De asemenea, pentru ca să fie în , trebuie ca . Selecţia părinţilor este realizată pe baza algoritmului SUS, prin utilizarea distribuţiei de probabilitate de selecţie de tip rang liniar, cu presiunea de selecţie s. La fiecare generaţie
sunt selectaţi dim părinţi. Mecanismul de supravieţuire este implementat astfel: generaţia următoare este dată de multisetul progeniturilor, eventual mutante, dar în care cel mai bun individ al generaţiei curente, bx, înlocuieşte cel mai slab cromozom copil, dacă nici unul dintre indivizii generaţi în urma aplicării operatorilor de variaţie nu are calitatea cel puţin egală cu cea a lui bx. Este prezentată în continuare implementarea algoritmului în cea de a doua variantă de generare a unei perechi de cromozomi din bazinul de recombinare (orice pereche de cromozomi aleşi ca părinţi este unică). Pentru prima variantă, în funcţia crossover sunt generate aleator perechi de cromozomi, pentru care se impune doar condiţia ca cei doi cromozomi să ocupe poziţii diferite în multisetul părinţilor. function [R]=citeste_date(nume); R=load(nume); end function [Q,rmed,alpha,B]=parametri(R); %n actiuni observate in m saptamani [n,m]=size(R); rmed=zeros(n,1); for i=1:n rmed(i)=mean(R(i,:)); end; Q=cov(R')*(m-1)/m; In1=eye(n-1); ul=-ones(1,n-1); B=[In1; ul]; alpha=zeros(n,1); alpha(n)=1; end function [val,V]=fobiectiv(Q,rmed,alpha,B,ro,Rp,x); val=((alpha+B*x).')*Q*(alpha+B*x)+(ro/(Rp^2))*((rmed.')*alphaRp+(rmed.')*B*x)^2; %disp(val); V=((alpha+B*x).')*Q*(alpha+B*x); %disp(V); end function [pop]=gen_ini(dim,n,Q,rmed,alpha,B,ro,Rp); pop=zeros(n,dim); for i=1:dim x=zeros(n-1,1); for j=1:n-1 gata=0; while(~gata) r=unifrnd(0,1); if(sum(x)+r<=1) x(j)=r; gata=1; end; end; if(sum(x)==1) break; end; end; pop(1:n-1,i)=x(1:n-1); [val,V]=fobiectiv(Q,rmed,alpha,B,ro,Rp,x(1:n-1));
pop(n,i)=-val; end; end function [pop]=gen_ini_short_selling(dim,n,Q,rmed,alpha,B,ro,Rp); pop=zeros(n,dim); for i=1:dim x=zeros(n-1,1); gata=0; while(~gata) for j=1:n-1 x(j)=unifrnd(-1,1); end; if((sum(x)>=0)&&(sum(x)<=2)) pop(1:n-1,i)=x(1:n-1); [val,V]=fobiectiv(Q,rmed,alpha,B,ro,Rp,x(1:n-1)); pop(n,i)=-val; gata=1; end; end; end; end function [parinti]=selectie_SUS_rang_l(pop,s); [n,dim]=size(pop); p=rang_l(pop,s); q=zeros(dim,1); for i=1:dim q(i)=sum(p(1:i)); end; parinti=zeros(n,dim); i=1;k=1;r=unifrnd(0,1/dim); while(k<=dim) while(r<=q(i)) parinti(1:n,k)=pop(1:n,i); r=r+1/dim; k=k+1; end; i=i+1; end; end function [p]=rang_l(pop,s); [n,dim]=size(pop); p=zeros(1,dim); for i=1:dim p(i)=(2-s)/dim+(2*i*(s-1)/(dim*(dim+1))); end; end function [popN]=crossover1(pop,pc,p,Q,rmed,alpha,B,ro,Rp); [n,dim]=size(pop); poz=[]; popN=zeros(n,dim); for i=1:2:dim ok=0; while(~ok) p1=unidrnd(dim-1); p2=p1; while(p1>=p2) p2=unidrnd(dim);
end; if(~ismember([p1 p2],poz,'rows')) poz=[poz;[p1 p2]]; ok=1; end; end; % nu pot fi generate aceleasi perechi de parinti la treceri diferite x=pop(1:n-1,p1); y=pop(1:n-1,p2); r=unifrnd(0,1); if(r<=pc) x1=p*x+(1-p)*y; popN(1:n-1,i)=x1(1:n-1); [val,V]=fobiectiv(Q,rmed,alpha,B,ro,Rp,x1(1:n-1)); popN(n,i)=-val; y1=p*y+(1-p)*x; popN(1:n-1,i+1)=y1(1:n-1); [val,V]=fobiectiv(Q,rmed,alpha,B,ro,Rp,y1(1:n-1)); popN(n,i+1)=-val; else popN(1:n,i)=pop(1:n,p1); popN(1:n,i+1)=pop(1:n,p2); end; end; end function [popN]=mutatie(pop,pm,t,Q,rmed,alpha,B,ro,Rp,caz); % mutatia intr-un cromozom, la nivel de gena revine la operatiei % de fluaj [n,dim]=size(pop); popN=pop; for i=1:dim efectuat=0; if(caz==0) % fara short selling for j=1:n-1 r=unifrnd(0,1); if(r<=pm) fluaj=normrnd(0,t/3); a=pop(j,i)+fluaj; efectuat=1; if(a<0) a=0; end; s=sum(popN(1:n-1,i)); if(s+fluaj>1) xx=s+fluaj-1; a=a-xx; end; popN(j,i)=a; end; end; else %cu short selling for j=1:n-1 r=unifrnd(0,1); if(r<=pm) gata=0; while(~gata) fluaj=normrnd(0,t/3);
aplicarea
if(fluaj>0) a=min([pop(j,i)+fluaj 1]); else a=max([pop(j,i)+fluaj -1]); end; s=sum(popN(1:n-1,i)); if((s+fluaj>=0)&&(s+fluaj<=2)) popN(j,i)=a; efectuat=1; gata=1; end; end; end; end; end; if(efectuat) [val,V]=fobiectiv(Q,rmed,alpha,B,ro,Rp,popN(1:n-1,i)); popN(n,i)=-val; end; end; end function [rezultat]=selectie_generatie_urmatoare(pop,popN); [n,dim]=size(pop); fob=pop(n,1:dim); fobN=popN(n,1:dim); rezultat=popN; [max1,i]=max(fob); [max2,j]=max(fobN); if(max1>max2) [min1,k]=min(fobN); rezultat(1:n,k)=pop(1:n,i); end; end function [x]=GA_riscmin1(nume,dim,ro,Rp,s,pc,pm,p,t,NM,caz); % nume=numele fisierului din care sunt prelute datele % dim=dimensiunea populatiei, numar par % ro=din functia obiectiv % Rp=randamentul prognozat % s=constrangerea de selectie pentru distributia de selectie rang liniar % pc=probabilitatea de recombinare % p=ponderea la recombinarea prin medie % pm=probabilitatea de mutatie % t=pragul de la fluaj % NM=numarul de iteratii % caz=0, pentru exemplul1, fara short selling % caz=1, pentru exemplul2, cu short selling %GA_riscmin1('portofoliu1.txt',500,100,1.15,1.8,0.8,0.01,0.7,0.1,20,0); %GA_riscmin1('',500,10,0.25,1.8,0.8,0.02,0.7,0.1,20,1); if(caz==0) R=citeste_date(nume); [n,m]=size(R); [Q,rmed,alpha,B]=parametri(R); pop=gen_ini(dim,n,Q,rmed,alpha,B,ro,Rp); else n=5; In1=eye(n-1); ul=-ones(1,n-1); B=[In1; ul];
alpha=zeros(n,1); alpha(n)=1; rmed=[-0.028, 0.366, 0.231, -0.24, 0.535]'; Q=[1.0256 -0.4340 0.0202 -0.1968 -0.0311; -0.4340 1.1049 -0.0783 0.2347 -0.1776; 0.0202 -0.0783 0.4328 -0.1236 -0.1895; -0.1968 0.2347 -0.1236 8.0762 1.0093; -0.0311 -0.1776 -0.1895 1.0093 2.9007]; pop=gen_ini_short_selling(dim,n,Q,rmed,alpha,B,ro,Rp); end; pop1=sortrows(pop.',n); pop=pop1.'; T=[]; T1=[]; for nrit=1:NM %populatia sortata crescator dupa -fobiectiv [parinti]=selectie_SUS_rang_l(pop,s); [popN]=crossover1(parinti,pc,p,Q,rmed,alpha,B,ro,Rp); % operatia de mutatie este realizata functie de caz - cu sau fara %short selling [popNou]=mutatie(popN,pm,t,Q,rmed,alpha,B,ro,Rp,caz); [rezultat]=selectie_generatie_urmatoare(pop,popNou); pop1=sortrows(rezultat.',n); pop=pop1.'; [val,V]=fobiectiv(Q,rmed,alpha,B,ro,Rp,pop(1:n-1,dim)); T=[T V]; T1=[T1 val]; end; disp(['riscul minim:' num2str(T(NM))]); disp(['minimul functiei obiectiv MINRISC1:' num2str(T1(NM))]); disp('Fractiunile investite'); disp([pop(1:n-1,dim);1-sum(pop(1:n-1,dim))]); disp('Randamentul obtinut:'); Rr=(rmed.')*(alpha+B*pop(1:n-1,dim)); disp(Rr); figure i=1:NM; plot(i,T1(i),'-rs','LineWidth',2,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','y',... 'MarkerSize',8); figure i=1:NM; plot(i,T(i),'-rs','LineWidth',2,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','m',... 'MarkerSize',8); end
Variantă de implementare cu excluderea situaţiei de tip “short selling” pentru datele din tabelul 4.1 Rezultatele care pot fi obţinute la apelul GA_riscmin1('portofoliu1.txt',500,100,1.15,1.8,0.8,0.01,0.7,0.1,20,0) sunt figurate mai jos. În acest exemplu, minimul funcţiei obiectiv corespunzătoare RISCMIN1M este , riscul calculat după 20 de generaţii este
problemei
randamentul este
şi portofoliul obţinut:
Variantă de implementare, cu considerarea situaţiei de tip “short selling” pentru datele din exemplul 2 Rezultatele care pot fi obţinute la apelul GA_riscmin1('',500,10,0.25,1.8,0.8,0.02,0.7,0.1,20,1); sunt figurate mai jos. În acest exemplu, minimul funcţiei obiectiv corespunzătoare RISCMIN1M este 0.14238, riscul calculat după 20 de generaţii este
randamentul este
şi portofoliul obţinut:
problemei