Algoritmi genetici paraleli. Implementari Java. Continut laborator: 1. Obiectivul lucrarii. 2. Notiuni teoretice: 3. Cerinte laborator. 4. Tema. 1. Obiectivul lucrarii. Lucrarea de faţă are rolul de a prezenta şi familiariza studentul cu modul de folosire a algoritmilor genetici in variant paralela pentru rezolvarea unor probleme. La sfârşitul acestei lucrări, studentul va avea posibilitatea să foloseasca notiunile si algoritmii prezentati pentru rezolvarea unor probleme. 2. Notiuni teoretice Forma generala a unui algoritm genetic
import java.io.*; import java.util.*; public class genetic { public static int m,n,a,b,nrpop=1400, NrMutatii=50; public static int[][] a=new int[101][101]; public static int[][] pop=new int[1700][30];//retine indivizii populatiei //si costul traseului (coloana n+1) pe cate o linie
public static int f(int i){ //functia performanta - calculeaza costul total al deplasarii //pentru un individ din populatie (adica a unui traseu) int s,j; s=0; for(j=2;j<=n;j++) s+=a[pop[i][j-1]][pop[i][j]]; return s; public static void ordonare(){ //clasificarea indivizilor dupa valorile crescatoare ale //functiei de performanta (adica, cost traseu) int i,j,k,aux; for(i=1;i<nrpop;i++) for(j=i+1;j<=nrpop;j++) if(pop[i][n+1]>pop[j][n+1]) for(k=1;k<=n+1;k++){ aux=pop[i][k]; pop[i][k]=pop[j][k]; pop[j][k]=aux; public static void generare(){ //generarea populatiei initiale in mod aleator int i,j,k,x,sw; for(i=1;i<=nrpop-200;i++){ pop[i][1]=a;pop[i][n]=b; for(j=2;j<=n-1;j++){ x=(int)math.ceil(math.random()*n); sw=1; for(k=1;k<j;k++) if(x==pop[i][k]) if(x==b) while(sw==0); pop[i][j]=x; pop[i][n+1]=f(i); public static void mutatie(){ //mutatiile genetice au fost modelate prin alegerea, //in mod aleator, a unui traseu si inversarea poz. unor
//orase, selectate tot aleator int i,n,m,p,aux,sw; for(i=1;i<=nrmutatii;i++){ N=1+(int)Math.round(Math.random()*(NrPop-201)); //generam nodul M M=1+(int)Math.round(Math.random()*(n-1)); sw=1; if(m==a M==B) while(sw==0); //generam nodul P P=1+(int)Math.round(Math.random()*(n-1)); sw=1; if(p==a P==B) while(sw==0); aux=pop[n][m]; pop[n][m]=pop[n][p]; pop[n][p]=aux; //se poate repeta cu inca o perechete de noduri N,P pop[n][n+1]=f(n); public static void generatie(){ //generatie noua - pentru doua trasee, care se intersecteaza //vom crea doua noi trasee, asfel: //-primul traseu continua, de la intersectie, pe cel de-al doilea traseu //-al doilea traseu, continua de la intersesctie, la primul traseu //cele doua noi trasee sunt valide daca trec prin toate orasele int i,j,k,m,n,sw; for(i=nrpop-200+1;i<=nrpop+100;i++){ sw=1; M=(int)Math.round(Math.random()*20); N=(int)Math.round(Math.random()*20); k=1; k++; while(pop[m][k]!=pop[n][k]);//k= nod de intersesctie individ M cu N //prima noua solutie se adauga la populatie for(j=1;j<=k;j++) pop[i][j]=pop[m][j]; for(j=k+1;j<=n;j++) pop[i][j]=pop[n][j]; for(j=2;j<=n-1;j++)
for(k=2;k<=n-1;k++) if(pop[i][j]==pop[i][k] && j!=k) for(j=1;j<=k;j++) pop[i+100][j]=pop[n][j]; for(j=k+1;j<=n;j++) pop[i+100][j]=pop[m][j]; for(j=2;j<=n-1;j++) for(k=2;k<=n-1;k++) if(pop[i+100][j]==pop[i+100][k] && j!=k) while(sw==0); pop[i][n+1]=f(i); pop[i+100][n+1]=f(i+100); public static void main(string[] args) throws IOException { FileInputStream f = new FileInputStream("genetic.in"); InputStreamReader fchar = new InputStreamReader(f); BufferedReader buf = new BufferedReader(fchar); String linie =buf.readline(); StringTokenizer st = new StringTokenizer(linie); n=integer.parseint(st.nexttoken()); m=integer.parseint(st.nexttoken()); A=Integer.parseInt(st.nextToken()); B=Integer.parseInt(st.nextToken()); int i,j,k,cost; //initializare matrice costuri for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) a[i][j]=0; else a[i][j]=10000; //citire costuri si construire matrice costuri for(k = 0; k<m ;k++){ linie =buf.readline(); st = new StringTokenizer(linie); i = Integer.parseInt(st.nextToken()); j = Integer.parseInt(st.nextToken()); cost = Integer.parseInt(st.nextToken()); a[i][j]=cost; a[j][i]=cost;
//algoritm genetic pentru problema Comis-Voiajor generare(); int NrGeneratii=600; for(i=1;i<=nrgeneratii;i++){ generatie(); mutatie(); ordonare(); System.out.println("Nrgeneratii="+NrGeneratii); for(i=1;i<=n;i++) System.out.print(pop[1][i]+" "); System.out.println("cost="+pop[1][n+1]); Pentru datele de intrare: genetic.in 15 20 1 15 1 4 10 1 14 50 14 4 10 14 2 200 14 5 10 2 8 10 5 8 20 2 9 10 9 10 10 2 10 50 6 10 10 6 2 200 7 6 200 6 11 20 12 11 20 12 13 20 7 13 20 3 7 100 7 15 400 3 15 100 s-au obtinut rezultatele:
3. Cerinte laborator. Se va verifica programul anterior si se va testa pe mai multe exemple, pentru a observa modul de functionare. Realizarea de implementari pentru problemele propuse. 4. Tema. Să se rezolve problemele urmatoare folosind algoritmi genetici implementati prin programe paralele. 1. Problema ciclului hamiltonian. 2. Problema celor n regine. 3. Problema permutarilor fara puncte fixe. 4. Problema rucsacului folosind codificarea binara.
Bibliografie 1. Crina Grosan, Mihai Oltean, Algoritmi Evolutivi, GInfo, Nr. 8, 2001 2. George Daniel Mateescu, Corina Saman, Mihai Buneci, Algoritmi Genetici, ftp://www.ipe.ro/repec/workingpapers/cs14-2.pdf 3. Popescu Rozica Maria, Algoritmi Genetici, Editura Sfântul Ierarh Nicolae 4. http://en.wikipedia.org/wiki/genetic_algorithm 5. Mitchell Melanie, An Introduction to Genetic Algorithms, A Bradford Book The MIT Press, 1999, http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf Probleme recapitulative 1. Folosind metoda divide et impera determinate numarul de componente impare dintr-un vector. 2. Se da un tablou bidimensional cu m linii si n coloane cu component intregi. Pentru fiecare linie scrieti unul din mesajele: DA sau NU. DA, daca linia are suma componentelor numar de doua cifre, respectiv NU contrar. Exemplu 3 4 10 2 50 250 51 4 23 55 16 2 34 20 se va afisa NU NU DA 3. Folosind fire de executie creati un applet care sa afiseze pe cate o linie fiecare numar de doua cifre de 10 ori. 4. Se da un graf neorientat prin numãrul de vârfuri şi muchii. Sã se scrie un program care afiseaza nodurile izolate din graf. Exemplu graf.in 6 2 2 3 2 5 graf.out 1 4 6 5. Se da un graf neorientat prin numãrul de vârfuri şi muchii. Sã se scrie un program care verifica daca graful este conex. Exemplu graf.in 6 2 2 3 2 5 graf.out neconex