没有合适的资源?快使用搜索试试~ 我知道了~
自编遗传算法C版本 主要针对微波电磁场专业
需积分: 10 1 下载量 191 浏览量
2011-01-24
11:13:29
上传
评论
收藏 10KB TXT 举报
温馨提示
试读
13页
自编遗传算法C版本 主要针对微波电磁场专业
资源推荐
资源详情
资源评论
基本概念:
基因:组成染色体的单元,可以表示为一个二进制位,一个整数或一个字符。
染色体:表示待求解问题的一个解。
个体:等同于染色体,从基因角度而言称染色体,从适应度函数角度称个体。
群体:一定数量的染色体组成群体,表示遗传搜索空间。
适应度:代表一个染色体所求解的优劣,通常由适应度函数表示。
基本操作:
选择:根据个体的适应度,在群体中按照一定的概率选择可以作为父本的个体,选择依
据是适应度大的个体被选中的概率高。体现了适者生存、优胜劣汰的进化规则。
交叉:将父本染色体的基因按照一定概率随机的交换,形成新的染色体。
变异:按照一定概率改变染色体内的某个基因值。
步骤:
首先对优化问题的解进行编码,即用染色体表示优化问题的可能解,组成染色体的元素
称为基因。编码的目的主要是用于问题解的表现和利于遗传算法的其他操作。然后是适
应度函数的构造和应用。适应度函数因优化问题的目标函数而定。当适应度函数确定后
,选择定律将以各染色体所对应的适应度的大小决定那些染色体适应生存,那些被淘汰
。生存下来的染色体构成种群,形成一个可以繁衍下一代的群体。此后是染色体的结合
,即交叉。双亲遗传的结合通过编码的交叉实现下一代的产生。新的染色体产生后将以
一定的概率发生基因变异,变异使解带有更大的遍历性,防止过早收敛于局部最小值。
举例:求解多项式y=(((((x-10)x-26)x+344)x+193)x-1846)x-1680在(-8,+8)之间使表达
式达到最小值的x,误差为0.001.
分析:
编码:采用二进制编码。每隔0.001取一个点,求解空间为16000,可用n=14位二进制数
表示。
群体规模m:可选为n和2n之间的一个确定数,这里取m=20。
初始种群的选取:随机选取。
终止规则:1、最优解在连续20次循环中改变量小于0.01,则认为求解成功;
2、总循环次数大于1200次时循环也结束,求解失败。
交叉规则:采用双亲双子法。在双亲确定后产生一个随机位,将双亲在随机位后的所有
基因:组成染色体的单元,可以表示为一个二进制位,一个整数或一个字符。
染色体:表示待求解问题的一个解。
个体:等同于染色体,从基因角度而言称染色体,从适应度函数角度称个体。
群体:一定数量的染色体组成群体,表示遗传搜索空间。
适应度:代表一个染色体所求解的优劣,通常由适应度函数表示。
基本操作:
选择:根据个体的适应度,在群体中按照一定的概率选择可以作为父本的个体,选择依
据是适应度大的个体被选中的概率高。体现了适者生存、优胜劣汰的进化规则。
交叉:将父本染色体的基因按照一定概率随机的交换,形成新的染色体。
变异:按照一定概率改变染色体内的某个基因值。
步骤:
首先对优化问题的解进行编码,即用染色体表示优化问题的可能解,组成染色体的元素
称为基因。编码的目的主要是用于问题解的表现和利于遗传算法的其他操作。然后是适
应度函数的构造和应用。适应度函数因优化问题的目标函数而定。当适应度函数确定后
,选择定律将以各染色体所对应的适应度的大小决定那些染色体适应生存,那些被淘汰
。生存下来的染色体构成种群,形成一个可以繁衍下一代的群体。此后是染色体的结合
,即交叉。双亲遗传的结合通过编码的交叉实现下一代的产生。新的染色体产生后将以
一定的概率发生基因变异,变异使解带有更大的遍历性,防止过早收敛于局部最小值。
举例:求解多项式y=(((((x-10)x-26)x+344)x+193)x-1846)x-1680在(-8,+8)之间使表达
式达到最小值的x,误差为0.001.
分析:
编码:采用二进制编码。每隔0.001取一个点,求解空间为16000,可用n=14位二进制数
表示。
群体规模m:可选为n和2n之间的一个确定数,这里取m=20。
初始种群的选取:随机选取。
终止规则:1、最优解在连续20次循环中改变量小于0.01,则认为求解成功;
2、总循环次数大于1200次时循环也结束,求解失败。
交叉规则:采用双亲双子法。在双亲确定后产生一个随机位,将双亲在随机位后的所有
基因对换,形成两个后代。
选择:则交叉、变异后,种群中的个体个数达到2m个,将这2m个染色体按其适应度进行
排序,保留最优的m个,淘汰其余的,保证种群在整体上得到优化。
源程序(C语言):
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define SUM 20 //定义群体的染色体数量
#define MAXloop 1200 //最大循环次数
#define error 0.01 //若两次最优值之差小于此数则认为结果没有改变
#define crossp 0.7 //交叉概率,所选中的双亲按此概率进行交叉
#define mp 0.04 //变异概率
struct gen //定义染色体结构
{
int info; //用一整型数的后十四位作为染色体编码
float suitability; //此染色体所对应的适应度函数值,即表达式的值
};
struct gen gen_group[SUM]; //定义含有20个染色体的种群
struct gen gen_new[SUM]; //定义含有20个染色体的种群,记录交叉产生的子代染色
体
struct gen gen_result; //记录上一轮循环中得到的最优的染色体
int result_unchange_time; //当相邻两轮得到的最优值对应的适应度之差小于error
时
,其值增1,反之清0
struct log //形成链表,记录每次循环所产生的最优的适应度
{
float suitability;
选择:则交叉、变异后,种群中的个体个数达到2m个,将这2m个染色体按其适应度进行
排序,保留最优的m个,淘汰其余的,保证种群在整体上得到优化。
源程序(C语言):
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define SUM 20 //定义群体的染色体数量
#define MAXloop 1200 //最大循环次数
#define error 0.01 //若两次最优值之差小于此数则认为结果没有改变
#define crossp 0.7 //交叉概率,所选中的双亲按此概率进行交叉
#define mp 0.04 //变异概率
struct gen //定义染色体结构
{
int info; //用一整型数的后十四位作为染色体编码
float suitability; //此染色体所对应的适应度函数值,即表达式的值
};
struct gen gen_group[SUM]; //定义含有20个染色体的种群
struct gen gen_new[SUM]; //定义含有20个染色体的种群,记录交叉产生的子代染色
体
struct gen gen_result; //记录上一轮循环中得到的最优的染色体
int result_unchange_time; //当相邻两轮得到的最优值对应的适应度之差小于error
时
,其值增1,反之清0
struct log //形成链表,记录每次循环所产生的最优的适应度
{
float suitability;
剩余12页未读,继续阅读
资源评论
mingheroluo
- 粉丝: 1
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功