Kashub's Code Barn - "ag_4"

podświetlone jako idl (dodał(a) aa @ 2021-01-29 17:46:18)

Twoja wyszukiwarka
Podświetl ten kod w:
Ostatnio dodane:
Losowe wpisy:
/*
n - zadana liczba zmiennych
m - zadana liczba genów użyta do zakodowania jednej zmiennej
lp - zadana liczność populacji, z założenia parzysta
xmin[lp] - zadana jednowymiarowa tablica minimalnych wartości zmiennych projektowania
xmax[lp] - zadana jednowymiarowa tablica maksymalnych wartości zmiennych projektowania
f(x) - zadana funkcja przystosowania
x[n] - jednowymiarowa tablica zmiennych projektowania
fp[lp] - jednowymiarowa tablica funkcji przystosowania osobników populacji
tchr[lp][n*m] - dwuwymiarowa tablica chromosomów osobników rodzicielskich
tchp[lp][n*m] - dwuwymiarowa tablica chromosomów osobników potomnych
nfp - funkcja przystosowania najlepszego aktualnie osobnika
nx[n] - jednowymiarowa tablica najlepszych aktualnie rozwiązań
tiz[lp] - jednowymiarowa tablica indeksów zwycięzców turniejów (potencjalnych rozwiązań rodzicielskich)
pk - zadane prawdopodobieństwo krzyżowania (bliskie 1)
pm - zadane prawdopodobieństwo mutacji (bliskie zera)
lg - liczba generacji (iteracji)
*/
 
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
 
 
/*parametry algorytmu widoczne w kazdej funkcji programu, wartosci testowe*/
#define n 2     
#define m 24    
#define lp 100  
#define pk 0.99   
#define pm 0.01 
#define lg 200  
 
/*zmienne globalne widoczne w kazdej funkcji programu, wartosci testowe*/
float xmin[n]={0,0};
float xmax[n]={20,20};
float nx[n]; 			//sensownie zainicjowac
float nfp=-1e30;		//sensownie zainicjowac
 
float f(float x[n])
{
	int i;
	float s=0.;
 
	for(i=0;i<n;i++) s+=x[i]*sin(x[i])*sin(x[i]);
	return s;	
}
 
void inicjalizacja_najlepszego_rozwiazania()
{
	int i;
	for(i=0;i<n;i++) nx[i]=xmin[i];
	nfp=f(nx);
}
 
void drukuj_populacje(int tchr[lp][n*m])
{
	int i,j;
	for(i=0;i<lp;i++){
		for(j=0;j<n*m;j++){
			printf("%1d",tchr[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}
 
void inicjalizacja_pierwszej_populacji(int tchr[lp][n*m])
{
	int i,j;
	for(i=0;i<lp;i++){
		for(j=0;j<n*m;j++){
			tchr[i][j]=rand()%2;
		}
	}
}
 
void ocena_osobnikow_populacji(int tchr[lp][n*m], float fp[lp])
{
	int i,j,k,ng;
	float p2,wdi;
	float x[n];
 
	for(j=0;j<lp;j++){
		for(i=0;i<n;i++){
			p2=1.;
			wdi=0.;
			for(k=0;k<m;k++){
				ng=i*m+k;
				wdi+=tchr[j][ng]*p2;
				p2*=2;
			}
			x[i]=xmin[i]+(xmax[i]-xmin[i])*wdi/(p2-1);
		}
		//for(k=0;k<n;k++) printf("%f\t",x[k]); 
		//printf("\n");
		//for(k=0;k<n*m;k++) printf("%1d",tchr[j][k]); 
		//printf("\n");
		fp[j]=f(x);
		if(fp[j]>nfp){
			nfp=fp[j];
			for(k=0;k<n;k++) nx[k]=x[k];
		}
	}
} 
 
void selekcja(float fp[lp], int tiz[lp])
{
	int j,i1,i2;
 
	for(j=0;j<lp;j++){
		i1=rand()%lp;
		i2=rand()%lp;
		if(fp[i1]>fp[i2]) tiz[j]=i1;
		else tiz[j]=i2;
	}
}
 
void krzyzowanie(int tiz[lp], int tchr[lp][n*m], int tchp[lp][n*m])
{
	int li,j,i1,i2,r1,r2,k,p1,p2,pc;
 
	li=lp;
	for(j=0;j<lp/2;j++){
		i1=rand()%li;
		r1=tiz[i1]; 
		li--;
		tiz[i1]=tiz[li];
 
		i2=rand()%li;
		r2=tiz[i2];
		li--;
		tiz[i2]=tiz[li];
 
		p1=2*j;
		p2=p1+1;
 
		if(((float)rand()/RAND_MAX)<=pk){
			pc=rand()%(n*m-1)+1;
			for(k=0;k<pc;k++){
				tchp[p1][k]=tchr[r1][k];
				tchp[p2][k]=tchr[r2][k];
			}
			for(k=pc;k<n*m;k++){
				tchp[p1][k]=tchr[r2][k];
				tchp[p2][k]=tchr[r1][k];
			}
		}
		else{
			for(k=0;k<n*m;k++){
				tchp[p1][k]=tchr[r1][k];
				tchp[p2][k]=tchr[r2][k];
			}
		}
	}
}
 
 
void mutacja(int tchp[lp][n*m])
{	
	int i,j;
	for(i = 0; i < lp; i++)
		for(j = 0; j < n*m; j++)
			if((float) (rand()%RAND_MAX) <= pm)
			{
				if(tchp[i][j] == 1)
				{
          tchp[i][j] = 0;
				}
				else
				{
          tchp[i][j] = 1;
				}
			}
}
 
void sukcesja(int tchp[lp][n*m], int tchr[lp][n*m])
{
	int i,j;
	for(i = 0; i < lp; i++)
  {
		for(j = 0; j < n*m; j++)
		{
			tchr[i][j] = tchp[i][j];
		}
	}
}
 
void drukuj_rozwiazanie()
{
	int i;
	printf("%f\n",nfp);
	for(i=0;i<n;i++) printf("%15.6f",nx[i]);	
	printf("\n");
}
int main()
{
	int tchr[lp][n*m];
	int tchp[lp][n*m];
	float fp[lp];
	int tiz[lp];
	int l,i;
	double ar1=0, war1=0;
	srand(time(0));
 
	l=0;
	inicjalizacja_najlepszego_rozwiazania();
	inicjalizacja_pierwszej_populacji(tchr);
	for(i=0;i<1000;i++)
	{
		do{
		ocena_osobnikow_populacji(tchr,fp);
		selekcja(fp,tiz);
	//	printf("Rodzice\n");
	//	drukuj_populacje(tchr);
		krzyzowanie(tiz,tchr,tchp);
	//	printf("Krzyzowanie\n");
	//	drukuj_populacje(tchp);
		mutacja(tchp);
	//	printf("Mutacja\n");
	//	drukuj_populacje(tchp);
		sukcesja(tchp,tchr);
	//	printf("Sukcesja\n");
	//	drukuj_populacje(tchr);
		l++;
 
		l++;
	}while(l<=lg);
 
 
	drukuj_rozwiazanie();
	}
 
	return 0;
}
| Opony całoroczne | | Opony letnie | | Opony zimowe | | Sklep z artykułami RTV/AGD | | Blogi za darmo | | Przenieś bloga z onetu | | Skróć link | | Gnieżdżewo | | Smutne Opisy |