QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2076|回复: 4
打印 上一主题 下一主题

Genetic algorithms

[复制链接]
字体大小: 正常 放大
HelloDan        

2

主题

3

听众

27

积分

升级  23.16%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2007-5-10 01:56 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<p><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: &quot;Times New Roman&quot;; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Denis Cormier(North Carolina State University)</span><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: &quot;Times New Roman&quot;; mso-hansi-font-family: &quot;Times New Roman&quot;; mso-bidi-font-family: &quot;Times New Roman&quot;;">开发的,</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: &quot;Times New Roman&quot;; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Sita Raghavan(University of North Carolina at Charlotte)</span><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: &quot;Times New Roman&quot;; mso-hansi-font-family: &quot;Times New Roman&quot;; mso-bidi-font-family: &quot;Times New Roman&quot;;">修正的遗传算法</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: &quot;Times New Roman&quot;; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">C</span><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: &quot;Times New Roman&quot;; mso-hansi-font-family: &quot;Times New Roman&quot;; mso-bidi-font-family: &quot;Times New Roman&quot;;">代码。</span></p><p></p><p>/***************************************************************/<br/>/* This is a simple genetic algorithm implementation where the */<br/>/* evaluation function takes positive values only and the&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>/* fitness of an individual is the same as the value of the&nbsp;&nbsp;&nbsp; */<br/>/* objective function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>/***************************************************************/</p><p>#include &lt;stdio.h&gt;<br/>#include &lt;stdlib.h&gt;<br/>#include &lt;math.h&gt;</p><p>/* Change any of these parameters to match your needs */</p><p>#define POPSIZE 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* population size */<br/>#define MAXGENS 1000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* max. number of generations */<br/>#define NVARS 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* no. of problem variables */<br/>#define PXOVER 0.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* probability of crossover */<br/>#define PMUTATION 0.15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* probability of mutation */<br/>#define TRUE 1<br/>#define FALSE 0</p><p>int generation;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* current generation no. */<br/>int cur_best;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* best individual */<br/>FILE *galog;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* an output file */</p><p>struct genotype /* genotype (GT), a member of the population */<br/>{<br/>&nbsp; double gene[NVARS];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* a string of variables */<br/>&nbsp; double fitness;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* GT's fitness */<br/>&nbsp; double upper[NVARS];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* GT's variables upper bound */<br/>&nbsp; double lower[NVARS];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* GT's variables lower bound */<br/>&nbsp; double rfitness;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* relative fitness */<br/>&nbsp; double cfitness;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* cumulative fitness */<br/>};</p><p>struct genotype population[POPSIZE+1];&nbsp;&nbsp;&nbsp; /* population */<br/>struct genotype newpopulation[POPSIZE+1]; /* new population; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* replaces the */<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* old generation */</p><p>/* Declaration of procedures used by this genetic algorithm */</p><p>void initialize(void);<br/>double randval(double, double);<br/>void evaluate(void);<br/>void keep_the_best(void);<br/>void elitist(void);<br/>void select(void);<br/>void crossover(void);<br/>void Xover(int,int);<br/>void swap(double *, double *);<br/>void mutate(void);<br/>void report(void);</p><p>/***************************************************************/<br/>/* Initialization function: Initializes the values of genes&nbsp;&nbsp;&nbsp; */<br/>/* within the variables bounds. It also initializes (to zero)&nbsp; */<br/>/* all fitness values for each member of the population. It&nbsp;&nbsp;&nbsp; */<br/>/* reads upper and lower bounds of each variable from the&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>/* input file `gadata.txt'. It randomly generates values&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>/* between these bounds for each gene of each genotype in the&nbsp; */<br/>/* population. The format of the input file `gadata.txt' is&nbsp;&nbsp;&nbsp; */<br/>/* var1_lower_bound var1_upper bound&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>/* var2_lower_bound var2_upper bound ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>/***************************************************************/</p><p>void initialize(void)<br/>{<br/>FILE *infile;<br/>int i, j;<br/>double lbound, ubound;</p><p>if ((infile = fopen("gadata.txt","r"))==NULL)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(galog,"\nCannot open input file!\n");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>/* initialize variables within the bounds */</p><p>for (i = 0; i &lt; NVARS; i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fscanf(infile, "%lf",&amp;lbound);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fscanf(infile, "%lf",&amp;ubound);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j = 0; j &lt; POPSIZE; j++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population[j].fitness = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population[j].rfitness = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population[j].cfitness = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population[j].lower = lbound;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population[j].upper= ubound;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population[j].gene = randval(population[j].lower,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population[j].upper);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>fclose(infile);<br/>}</p><p>/***********************************************************/<br/>/* Random value generator: Generates a value within bounds */<br/>/***********************************************************/</p><p>double randval(double low, double high)<br/>{<br/>double val;<br/>val = ((double)(rand()%1000)/1000.0)*(high - low) + low;<br/>return(val);<br/>}</p><p>/*************************************************************/<br/>/* Evaluation function: This takes a user defined function.&nbsp; */<br/>/* Each time this is changed, the code has to be recompiled. */<br/>/* The current function is:&nbsp; x[1]^2-x[1]*x[2]+x[3]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>/*************************************************************/</p><p>void evaluate(void)<br/>{<br/>int mem;<br/>int i;<br/>double x[NVARS+1];</p><p>for (mem = 0; mem &lt; POPSIZE; mem++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; NVARS; i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[i+1] = population[mem].gene;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population[mem].fitness = (x[1]*x[1]) - (x[1]*x[2]) + x[3];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>}</p><p>/***************************************************************/<br/>/* Keep_the_best function: This function keeps track of the&nbsp;&nbsp;&nbsp; */<br/>/* best member of the population. Note that the last entry in&nbsp; */<br/>/* the array Population holds a copy of the best individual&nbsp;&nbsp;&nbsp; */<br/>/***************************************************************/</p><p>void keep_the_best()<br/>{<br/>int mem;<br/>int i;<br/>cur_best = 0; /* stores the index of the best individual */</p><p>for (mem = 0; mem &lt; POPSIZE; mem++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (population[mem].fitness &gt; population[POPSIZE].fitness)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cur_best = mem;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population[POPSIZE].fitness = population[mem].fitness;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>/* once the best member in the population is found, copy the genes */<br/>for (i = 0; i &lt; NVARS; i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population[POPSIZE].gene = population[cur_best].gene;<br/>}</p><p>/****************************************************************/<br/>/* Elitist function: The best member of the previous generation */<br/>/* is stored as the last in the array. If the best member of&nbsp;&nbsp;&nbsp; */<br/>/* the current generation is worse then the best member of the&nbsp; */<br/>/* previous generation, the latter one would replace the worst&nbsp; */<br/>/* member of the current population&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>/****************************************************************/</p><p>void elitist()<br/>{<br/>int i;<br/>double best, worst;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* best and worst fitness values */<br/>int best_mem, worst_mem; /* indexes of the best and worst member */</p><p>best = population[0].fitness;<br/>worst = population[0].fitness;<br/>for (i = 0; i &lt; POPSIZE - 1; ++i)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(population.fitness &gt; population[i+1].fitness)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (population.fitness &gt;= best)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; best = population.fitness;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; best_mem = i;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (population[i+1].fitness &lt;= worst)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; worst = population[i+1].fitness;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; worst_mem = i + 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (population.fitness &lt;= worst)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; worst = population.fitness;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; worst_mem = i;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (population[i+1].fitness &gt;= best)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; best = population[i+1].fitness;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; best_mem = i + 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>/* if best individual from the new population is better than */<br/>/* the best individual from the previous population, then&nbsp;&nbsp;&nbsp; */<br/>/* copy the best from the new population; else replace the&nbsp;&nbsp; */<br/>/* worst individual from the current population with the&nbsp;&nbsp;&nbsp;&nbsp; */<br/>/* best one from the previous generation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</p><p>if (best &gt;= population[POPSIZE].fitness)<br/>&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; NVARS; i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population[POPSIZE].gene = population[best_mem].gene;<br/>&nbsp;&nbsp;&nbsp; population[POPSIZE].fitness = population[best_mem].fitness;<br/>&nbsp;&nbsp;&nbsp; }<br/>else<br/>&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; NVARS; i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population[worst_mem].gene = population[POPSIZE].gene;<br/>&nbsp;&nbsp;&nbsp; population[worst_mem].fitness = population[POPSIZE].fitness;<br/>&nbsp;&nbsp;&nbsp; } <br/>}<br/>/**************************************************************/<br/>/* Selection function: Standard proportional selection for&nbsp;&nbsp;&nbsp; */<br/>/* maximization problems incorporating elitist model - makes&nbsp; */<br/>/* sure that the best member survives&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>/**************************************************************/</p><p>void select(void)<br/>{<br/>int mem, i, j, k;<br/>double sum = 0;<br/>double p;</p><p>/* find total fitness of the population */<br/>for (mem = 0; mem &lt; POPSIZE; mem++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum += population[mem].fitness;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>/* calculate relative fitness */<br/>for (mem = 0; mem &lt; POPSIZE; mem++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population[mem].rfitness =&nbsp; population[mem].fitness/sum;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>population[0].cfitness = population[0].rfitness;</p><p>/* calculate cumulative fitness */<br/>for (mem = 1; mem &lt; POPSIZE; mem++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population[mem].cfitness =&nbsp; population[mem-1].cfitness +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population[mem].rfitness;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>/* finally select survivors using cumulative fitness. */</p><p>for (i = 0; i &lt; POPSIZE; i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p = rand()%1000/1000.0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (p &lt; population[0].cfitness)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newpopulation = population[0];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j = 0; j &lt; POPSIZE;j++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (p &gt;= population[j].cfitness &amp;&amp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p&lt;population[j+1].cfitness)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newpopulation = population[j+1];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>/* once a new population is created, copy it back */</p><p>for (i = 0; i &lt; POPSIZE; i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population = newpopulation;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>}</p><p>/***************************************************************/<br/>/* Crossover selection: selects two parents that take part in&nbsp; */<br/>/* the crossover. Implements a single point crossover&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>/***************************************************************/</p><p>void crossover(void)<br/>{<br/>int i, mem, one;<br/>int first&nbsp; =&nbsp; 0; /* count of the number of members chosen */<br/>double x;</p><p>for (mem = 0; mem &lt; POPSIZE; ++mem)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = rand()%1000/1000.0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (x &lt; PXOVER)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++first;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (first % 2 == 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Xover(one, mem);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; one = mem;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>}<br/>/**************************************************************/<br/>/* Crossover: performs crossover of the two selected parents. */<br/>/**************************************************************/</p><p>void Xover(int one, int two)<br/>{<br/>int i;<br/>int point; /* crossover point */</p><p>/* select crossover point */<br/>if(NVARS &gt; 1)<br/>&nbsp;&nbsp; {<br/>&nbsp;&nbsp; if(NVARS == 2)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; point = 1;<br/>&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; point = (rand() % (NVARS - 1)) + 1;</p><p>&nbsp;&nbsp; for (i = 0; i &lt; point; i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swap(&amp;population[one].gene, &amp;population[two].gene);</p><p>&nbsp;&nbsp; }<br/>}</p><p>/*************************************************************/<br/>/* Swap: A swap procedure that helps in swapping 2 variables */<br/>/*************************************************************/</p><p>void swap(double *x, double *y)<br/>{<br/>double temp;</p><p>temp = *x;<br/>*x = *y;<br/>*y = temp;</p><p>}</p><p>/**************************************************************/<br/>/* Mutation: Random uniform mutation. A variable selected for */<br/>/* mutation is replaced by a random value between lower and&nbsp;&nbsp; */<br/>/* upper bounds of this variable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>/**************************************************************/</p><p>void mutate(void)<br/>{<br/>int i, j;<br/>double lbound, hbound;<br/>double x;</p><p>for (i = 0; i &lt; POPSIZE; i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j = 0; j &lt; NVARS; j++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = rand()%1000/1000.0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (x &lt; PMUTATION)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* find the bounds on the variable to be mutated */<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lbound = population.lower[j];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hbound = population.upper[j];&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; population.gene[j] = randval(lbound, hbound);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>}</p><p>/***************************************************************/<br/>/* Report function: Reports progress of the simulation. Data&nbsp;&nbsp; */<br/>/* dumped into the&nbsp; output file are separated by commas&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>/***************************************************************/</p><p>void report(void)<br/>{<br/>int i;<br/>double best_val;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* best population fitness */<br/>double avg;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* avg population fitness */<br/>double stddev;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* std. deviation of population fitness */<br/>double sum_square;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* sum of square for std. calc */<br/>double square_sum;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* square of sum for std. calc */<br/>double sum;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* total population fitness */</p><p>sum = 0.0;<br/>sum_square = 0.0;</p><p>for (i = 0; i &lt; POPSIZE; i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum += population.fitness;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum_square += population.fitness * population.fitness;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>avg = sum/(double)POPSIZE;<br/>square_sum = avg * avg * POPSIZE;<br/>stddev = sqrt((sum_square - square_sum)/(POPSIZE - 1));<br/>best_val = population[POPSIZE].fitness;</p><p>fprintf(galog, "\n%5d,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %6.3f, %6.3f, %6.3f \n\n", generation, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; best_val, avg, stddev);<br/>}</p><p>/**************************************************************/<br/>/* Main function: Each generation involves selecting the best */<br/>/* members, performing crossover &amp; mutation and then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>/* evaluating the resulting population, until the terminating */<br/>/* condition is satisfied&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>/**************************************************************/</p><p>void main(void)<br/>{<br/>int i;</p><p>if ((galog = fopen("galog.txt","w"))==NULL)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>generation = 0;</p><p>fprintf(galog, "\n generation&nbsp; best&nbsp; average&nbsp; standard \n");<br/>fprintf(galog, " number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value fitness&nbsp; deviation \n");</p><p>initialize();<br/>evaluate();<br/>keep_the_best();<br/>while(generation&lt;MAXGENS)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; generation++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crossover();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mutate();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; evaluate();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elitist();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>fprintf(galog,"\n\n Simulation completed\n");<br/>fprintf(galog,"\n Best member: \n");</p><p>for (i = 0; i &lt; NVARS; i++)<br/>&nbsp;&nbsp; {<br/>&nbsp;&nbsp; fprintf (galog,"\n var(%d) = %3.3f",i,population[POPSIZE].gene);<br/>&nbsp;&nbsp; }<br/>fprintf(galog,"\n\n Best fitness = %3.3f",population[POPSIZE].fitness);<br/>fclose(galog);<br/>printf("Success\n");<br/>}<br/>/***************************************************************/</p><p><br/></p>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
kasim        

0

主题

3

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

wei321hai        

0

主题

3

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

天当天        

0

主题

3

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

luciferlr        

0

主题

3

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2025-12-19 09:31 , Processed in 1.039983 second(s), 76 queries .

回顶部