«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告

本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!

             ——既瑜


天气预报(南京)


我的分类(专题)

首页(183)
【趣味文摘】(22)
【五子连珠】(13)
【技术文档】(136)
【电脑技术】(6)
【疑难问题】(1)
【我的心情】(5)


最新日志
花语(中英文对照版)
各种花的花语
NTFS格式的7个精彩问答(pconli
童言无忌,有趣得一蹋
给MM修电脑的三个步骤[转载]
J2EE 面试题综合
JAVA编程规则
[转] P2P之UDP穿透NAT的原理与
[转]词法分析器
文件加密技术
一个让人发狂的PI求解C程序
[转]直线生成算法之DDA
[转]利用内核对象----互斥量实现应用
[转]如何正确的计算文件收发进度
双机调试VC程序
[转]分治法优化大整数乘法 C++实现
浮点数值的内存结构
[转]双链表实现大整数的加法与乘法[VC
拜占廷将军问题[转]
某人的挂QQ的程序源代码,虽然没用了,拿

最新回复
回复:vc中的CString的操作
回复:[转]分治法优化大整数乘法 C++
回复:[转]分治法优化大整数乘法 C++
回复:花语(中英文对照版)
回复:基本排序算法比较与选择[转载]
回复:c++中强制类型转换操作符小结
回复:c++中强制类型转换操作符小结
何必那么执着于是大头猫还是愤怒的小鸟,淡
回复:浮点数值的内存结构
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:32位位图到24位位图的转换
dren, ages 16 and 20
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:各种花的花语

留言板
签写新留言

不是0-1背包喔
桂花的花语``
谢谢
提议
提议

统计
blog名称:★既瑜★
日志总数:183
评论数量:636
留言数量:-25
访问次数:1406343
建立时间:2005年3月12日

链接


http://www.nju.edu.cn
http://bbs.nju.edu.cn 
http://www.t7-online.com
http://www.csdn.net
http://www.91f.net
http://www.crsky.com
我的MSN BLOG 

联系我

  OICQ:215768265
  njucs2001@hotmail.com
  erichoo1982@gmail.com

 

W3CHINA Blog首页    管理页面    写新日志    退出


[【技术文档】]一个简单实用的遗传算法c程序(转载)
既瑜(224499) 发表于 2005/7/13 9:08:25

          代码没有任何图形,甚至也没有屏幕输出,主要是保证在平台之间的高可移植性。要求输入的文件应该命名为‘gadata.txt’;系统产生的输出文件为‘galog.txt’。输入的文件由几行组成:数目对应于变量数。且每一行提供次序——对应于变量的上下界。如第一行为第一个变量提供上下界,第二行为第二个变量提供上下界,等等。 /**************************************************************************//* This is a simple genetic algorithm implementation where the *//* evaluation function takes positive values only and the      *//* fitness of an individual is the same as the value of the    *//* objective function                                          *//**************************************************************************/ #include <stdio.h>#include <stdlib.h>#include <math.h> /* Change any of these parameters to match your needs */ #define POPSIZE 50               /* population size */#define MAXGENS 1000             /* max. number of generations */#define NVARS 3                  /* no. of problem variables */#define PXOVER 0.8               /* probability of crossover */#define PMUTATION 0.15           /* probability of mutation */#define TRUE 1#define FALSE 0 int generation;                  /* current generation no. */int cur_best;                    /* best individual */FILE *galog;                     /* an output file */ struct genotype /* genotype (GT), a member of the population */{  double gene[NVARS];        /* a string of variables */  double fitness;            /* GT's fitness */  double upper[NVARS];       /* GT's variables upper bound */  double lower[NVARS];       /* GT's variables lower bound */  double rfitness;           /* relative fitness */  double cfitness;           /* cumulative fitness */}; struct genotype population[POPSIZE+1];    /* population */struct genotype newpopulation[POPSIZE+1]; /* new population; */                                          /* replaces the */                                          /* old generation */ /* Declaration of procedures used by this genetic algorithm */ void initialize(void);double randval(double, double);void evaluate(void);void keep_the_best(void);void elitist(void);void select(void);void crossover(void);void Xover(int,int);void swap(double *, double *);void mutate(void);void report(void); /***************************************************************//* Initialization function: Initializes the values of genes    *//* within the variables bounds. It also initializes (to zero)  *//* all fitness values for each member of the population. It    *//* reads upper and lower bounds of each variable from the      *//* input file `gadata.txt'. It randomly generates values       *//* between these bounds for each gene of each genotype in the  *//* population. The format of the input file `gadata.txt' is    *//* var1_lower_bound var1_upper bound                           *//* var2_lower_bound var2_upper bound ...                       *//***************************************************************/ void initialize(void){FILE *infile;int i, j;double lbound, ubound; if ((infile = fopen("gadata.txt","r"))==NULL)      {      fprintf(galog,"\nCannot open input file!\n");      exit(1);      } /* initialize variables within the bounds */ for (i = 0; i < NVARS; i++)      {      fscanf(infile, "%lf",&lbound);      fscanf(infile, "%lf",&ubound);       for (j = 0; j < POPSIZE; j++)           {           population[j].fitness = 0;           population[j].rfitness = 0;           population[j].cfitness = 0;           population[j].lower[i] = lbound;           population[j].upper[i]= ubound;           population[j].gene[i] = randval(population[j].lower[i],                                   population[j].upper[i]);           }      } fclose(infile);} /***********************************************************//* Random value generator: Generates a value within bounds *//***********************************************************/ double randval(double low, double high){double val;val = ((double)(rand()%1000)/1000.0)*(high - low) + low;return(val);} /*************************************************************//* Evaluation function: This takes a user defined function.  *//* Each time this is changed, the code has to be recompiled. *//* The current function is:  x[1]^2-x[1]*x[2]+x[3]           *//*************************************************************/ void evaluate(void){int mem;int i;double x[NVARS+1]; for (mem = 0; mem < POPSIZE; mem++)      {      for (i = 0; i < NVARS; i++)            x[i+1] = population[mem].gene[i];            population[mem].fitness = (x[1]*x[1]) - (x[1]*x[2]) + x[3];      }} /***************************************************************//* Keep_the_best function: This function keeps track of the    *//* best member of the population. Note that the last entry in  *//* the array Population holds a copy of the best individual    *//***************************************************************/ void keep_the_best(){int mem;int i;cur_best = 0; /* stores the index of the best individual */ for (mem = 0; mem < POPSIZE; mem++)      {      if (population[mem].fitness > population[POPSIZE].fitness)            {            cur_best = mem;            population[POPSIZE].fitness = population[mem].fitness;            }      }/* once the best member in the population is found, copy the genes */for (i = 0; i < NVARS; i++)      population[POPSIZE].gene[i] = population[cur_best].gene[i];} /****************************************************************//* Elitist function: The best member of the previous generation *//* is stored as the last in the array. If the best member of    *//* the current generation is worse then the best member of the  *//* previous generation, the latter one would replace the worst  *//* member of the current population                             *//****************************************************************/ void elitist(){int i;double best, worst;             /* best and worst fitness values */int best_mem, worst_mem; /* indexes of the best and worst member */ best = population[0].fitness;worst = population[0].fitness;for (i = 0; i < POPSIZE - 1; ++i)      {      if(population[i].fitness > population[i+1].fitness)            {                  if (population[i].fitness >= best)                  {                  best = population[i].fitness;                  best_mem = i;                  }            if (population[i+1].fitness <= worst)                  {                  worst = population[i+1].fitness;                  worst_mem = i + 1;                  }            }      else            {            if (population[i].fitness <= worst)                  {                  worst = population[i].fitness;                  worst_mem = i;                  }            if (population[i+1].fitness >= best)                  {                  best = population[i+1].fitness;                  best_mem = i + 1;                  }            }      }/* if best individual from the new population is better than *//* the best individual from the previous population, then    *//* copy the best from the new population; else replace the   *//* worst individual from the current population with the     *//* best one from the previous generation                     */ if (best >= population[POPSIZE].fitness)    {    for (i = 0; i < NVARS; i++)       population[POPSIZE].gene[i] = population[best_mem].gene[i];    population[POPSIZE].fitness = population[best_mem].fitness;    }else    {    for (i = 0; i < NVARS; i++)       population[worst_mem].gene[i] = population[POPSIZE].gene[i];    population[worst_mem].fitness = population[POPSIZE].fitness;    } }/**************************************************************//* Selection function: Standard proportional selection for    *//* maximization problems incorporating elitist model - makes  *//* sure that the best member survives                         *//**************************************************************/ void select(void){int mem, i, j, k;double sum = 0;double p; /* find total fitness of the population */for (mem = 0; mem < POPSIZE; mem++)      {      sum += population[mem].fitness;      } /* calculate relative fitness */for (mem = 0; mem < POPSIZE; mem++)      {      population[mem].rfitness =  population[mem].fitness/sum;      }population[0].cfitness = population[0].rfitness; /* calculate cumulative fitness */for (mem = 1; mem < POPSIZE; mem++)      {      population[mem].cfitness =  population[mem-1].cfitness +                                 population[mem].rfitness;      } /* finally select survivors using cumulative fitness. */ for (i = 0; i < POPSIZE; i++)      {       p = rand()%1000/1000.0;      if (p < population[0].cfitness)            newpopulation[i] = population[0];            else            {            for (j = 0; j < POPSIZE;j++)                        if (p >= population[j].cfitness &&                               p<population[j+1].cfitness)                        newpopulation[i] = population[j+1];            }      }/* once a new population is created, copy it back */ for (i = 0; i < POPSIZE; i++)      population[i] = newpopulation[i];      } /***************************************************************//* Crossover selection: selects two parents that take part in  *//* the crossover. Implements a single point crossover          *//***************************************************************/ void crossover(void){int i, mem, one;int first  =  0; /* count of the number of members chosen */double x; for (mem = 0; mem < POPSIZE; ++mem)      {      x = rand()%1000/1000.0;      if (x < PXOVER)            {            ++first;            if (first % 2 == 0)                  Xover(one, mem);            else                  one = mem;            }      }}/**************************************************************//* Crossover: performs crossover of the two selected parents. *//**************************************************************/ void Xover(int one, int two){int i;int point; /* crossover point */ /* select crossover point */if(NVARS > 1)   {   if(NVARS == 2)         point = 1;   else         point = (rand() % (NVARS - 1)) + 1;    for (i = 0; i < point; i++)        swap(&population[one].gene[i], &population[two].gene[i]);    }} /*************************************************************//* Swap: A swap procedure that helps in swapping 2 variables *//*************************************************************/ void swap(double *x, double *y){double temp; temp = *x;*x = *y;*y = temp; } /**************************************************************//* Mutation: Random uniform mutation. A variable selected for *//* mutation is replaced by a random value between lower and   *//* upper bounds of this variable                              *//**************************************************************/ void mutate(void){int i, j;double lbound, hbound;double x; for (i = 0; i < POPSIZE; i++)      for (j = 0; j < NVARS; j++)            {            x = rand()%1000/1000.0;            if (x < PMUTATION)                  {                  /* find the bounds on the variable to be mutated */                  lbound = population[i].lower[j];                  hbound = population[i].upper[j];                    population[i].gene[j] = randval(lbound, hbound);                  }            }} /***************************************************************//* Report function: Reports progress of the simulation. Data   *//* dumped into the  output file are separated by commas        *//***************************************************************/ void report(void){int i;double best_val;            /* best population fitness */double avg;                 /* avg population fitness */double stddev;              /* std. deviation of population fitness */double sum_square;          /* sum of square for std. calc */double square_sum;          /* square of sum for std. calc */double sum;                 /* total population fitness */ sum = 0.0;sum_square = 0.0; for (i = 0; i < POPSIZE; i++)      {      sum += population[i].fitness;      sum_square += population[i].fitness * population[i].fitness;      } avg = sum/(double)POPSIZE;square_sum = avg * avg * POPSIZE;stddev = sqrt((sum_square - square_sum)/(POPSIZE - 1));best_val = population[POPSIZE].fitness; fprintf(galog, "\n%5d,      %6.3f, %6.3f, %6.3f \n\n", generation,                                       best_val, avg, stddev);} /**************************************************************//* Main function: Each generation involves selecting the best *//* members, performing crossover & mutation and then          *//* evaluating the resulting population, until the terminating *//* condition is satisfied                                     *//**************************************************************/ void main(void){int i; if ((galog = fopen("galog.txt","w"))==NULL)      {      exit(1);      }generation = 0; fprintf(galog, "\n generation  best  average  standard \n");fprintf(galog, " number      value fitness  deviation \n"); initialize();evaluate();keep_the_best();while(generation<MAXGENS)      {      generation++;      select();      crossover();      mutate();      report();      evaluate();      elitist();      }fprintf(galog,"\n\n Simulation completed\n");fprintf(galog,"\n Best member: \n"); for (i = 0; i < NVARS; i++)   {   fprintf (galog,"\n var(%d) = %3.3f",i,population[POPSIZE].gene[i]);   }fprintf(galog,"\n\n Best fitness = %3.3f",population[POPSIZE].fitness);fclose(galog);printf("Success\n");}/***************************************************************/

阅读全文(14027) | 回复(9) | 编辑 | 精华

回复:一个简单实用的遗传算法c程序(转载)
1234(游客)发表评论于2009/5/28 21:54:45

为什么我的输出文件是空的?

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:一个简单实用的遗传算法c程序(转载)
armigy(游客)发表评论于2009/3/10 10:10:15

能不能把你的文件包发给我,我的邮箱是wufengqing1984@163.com
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:一个简单实用的遗传算法c程序(转载)
song(游客)发表评论于2009/3/7 20:06:03

能不能把一份gadata.txt的例子发给我,非常感谢,初学遗传算法,想理解使用,我的邮箱是:hust_song880222@126.com window.google_render_ad();
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:一个简单实用的遗传算法c程序(转载)
second(游客)发表评论于2009/2/11 14:08:02

能不能把gadata.txt 发给我,我的邮箱是:secondxx@gmail.com
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:一个简单实用的遗传算法c程序(转载)
GeGe(游客)发表评论于2006/4/23 12:55:41

格式: lbound ubound lbound ubound lbound ubound  
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:一个简单实用的遗传算法c程序(转载)
rongerhou(游客)发表评论于2006/4/17 21:26:18

也帮我发一份gadata.txt的准确格式吗? sunnyeeee88.student@sina.com
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:一个简单实用的遗传算法c程序(转载)
11nong(游客)发表评论于2006/3/21 10:38:37

very good
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:一个简单实用的遗传算法c程序(转载)
宽 容(游客)发表评论于2006/3/9 21:07:37

能把gadata.txt文件也发到我的邮箱里吗? orangeron@163.com 谢谢,毕业设计急用!!
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:一个简单实用的遗传算法c程序(转载)
fengjie(游客)发表评论于2006/1/9 20:32:05

能不能把你的文件包发给我,我的邮箱是:fengjie12132003@yahoo.com.cn 谢谢
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:一个简单实用的遗传算法c程序(转载)
既瑜(224499)发表评论于2005/10/17 13:37:25

对不起,不是我的原创,我无能为力。不过它不是有说明么?
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

» 1 2 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.063 second(s), page refreshed 144753602 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号