没有合适的资源?快使用搜索试试~ 我知道了~
遗传算法c++版本
3星 · 超过75%的资源 需积分: 9 66 下载量 46 浏览量
2007-09-01
18:20:15
上传
评论
收藏 188KB DOC 举报
温馨提示
试读
32页
遗传算法c++版本实现
资源推荐
资源详情
资源评论
(1) 初始化参数
(2) 随机产生初始种群
(3) 评价种群中的每个个体的适应行函数值
(4) 对种群中的个体进行选择
(5) 从选择后的种群中随机选择个体 Xi ,Xj 进行交叉(要交叉的数量由交换因子控
制),通过交叉操作产生两个新个体 X/i ,X/j ,并计算他们的适应函数值 f(X/i)和
f(X/j),按接受概率 Pij(Tk)=min{1 , },判断接受或拒绝新解,若 min{1 , }>
radom 则接受新解。其中 radom∈[0,1]
(6) 对交叉后的个体进行变异操作,并按(5)中的方法判断是否接受新解
(7) 对新种群中适应函数值最好个体记录
(8) 若满足收敛条件进化过程结束,否则 Tk+1=βTk ,转(3)
(9) 进化过程结束,对记录的最好个体进行适应函数值比较,输出最好的做为结果。
参数 发射机数量 N=30 可用频点数 20 个([1,20])
种群数 X=50 交叉概率 Pc=0.6 突变概率 Pm=0.01
T0=3000 β=0.95
遗传代数为 M=300
一个 N×N 矩阵,支持手动输入
初始种群的产生:
种群中的每个个体(染色体)采用序列编码的方式。每个染色体的长度与发射机的数量一
致,为包含 N 个基因的一维数组,染色体中的每个基因是一个整数,分别对应着一个被分
配的频率编号∈[1,N]
T1 T2 TN
a1 a2 aN
从可用频率集中为发射机分配一个频率,并检测这个频率是否适合,如果适合就分配给发
射机,然后为下一个发射机随机选一个频率,不合适就重新选取,频率是否合适的标准是
被分配的频率没被前一次分配时使用,当所有的发射机都被分配一个频率后,一个染色体
完成。
按需求数量逐个完成所有染色体构建。
适应函数:
f(xi)=
其中:kij=
Cij 为 N×N 约束矩阵
选择
采用择优选择法,根据个体的相对适应度 ,反复地从群体中选择 X 个个体组成下一代群
体。
操作过程如下:
(1)顺序累计群体中各个个体的适应函数值 fi ,的适应值的累加值 Sn
Sn=
(2)用各个个体的适应值 fi 除以 Sn 得相对适应度 Pi ,即该个体被选中的概率
Pi=fi/Sn
(3)累计 Pi 得累积概率 gi
gi=
(4)产生[0,1]均匀分布的随机数 γ
(5)将 γ 与 gi 相比较,若 gi-1<γ<gi 则选个体 i 进入下一代新群体
(6)反复执行(4)及(5)项 X 次,直至新种群的个体数等于父代群数目 X
交叉
被交叉的个体从选择后的新群体中随机选择
交叉概率控制被交叉个体数目 Xc
Xc=Pc×X
若 Xc 奇数,则删去一个个体,使交叉成对出现。个体的选择采用择优选择法,按选出的
顺序两两配对
交叉点的选择也是随机的,若字符串的长度为 N,则在[1,N-1]区间内产生均匀分布的随
机整数,该整数便是交叉点的位置,交换所选交叉点右边的部分,就产生两个新个体
变异
变异基因的位置是随机的,变异概率为 Pm=0.01,针对每个染色体的每个基因都产生[0,1]
区间内 3 位有效数字的均匀随机数,则随机数小于 0.01 的基因产生变异,在可用频率集中
随机选取一个值来替换它
结束条件;算法的迭代次数达到遗传代数 M
下面是找的一个程序结构,看看有用没用
一个串行运算的遗传算法(Seguential Genetic Algoritm, SGA)按如下过程进行:
(1) 对待解决问题进行编码;
(2) 随机初始化群体 X(0):=(x1, x2, … xn);
(3) 对当前群体 X(t)中每个个体 xi 计算其适应度 F(xi),适应度表示了该个体的性能好
坏;
(4) 应用选择算子产生中间代 Xr(t);
(5) 对 Xr(t)应用其它的算子,产生新一代群体 X(t+1),这些算子的目的在于扩展有限个
体的覆盖面,体现全局搜索的思想;
(6) t:=t+1;如果不满足终止条件继续(3)。
GA 中最常用的算子有如下几种:
(1) 选择算子(selection/reproduction): 选择算子从群体中按某一概率成对选择个体,某个
体 xi 被选择的概率 Pi 与其适应度值成正比。
(2) 交叉算子(Crossover): 交叉算子将被选中的两个个体的基因链按概率 pc 进行交叉,
生成两个新的个体,交叉位置是随机的。其中 Pc 是一个系统参数。
(3) 变异算子(Mutation): 变异算子将新个体的基因链的各位按概率 pm 进行变异,
GA 的程序设计应考虑到通用性,而且要有较强的适应新的算子的能力。OOP 中
的类的继承为我们提供了这一可能。
定义两个基本结构:基因(ALLELE)和个体(INDIVIDUAL),以个体的集合作为群体类
TPopulation 的数据成员,而 TSGA 类则由群体派生出来,定义 GA 的基本操作。对任一个
应用实例,可以在 TSGA 类上派生,并定义新的操作。
TPopulation 类包含两个重要过程:
FillFitness: 评价函数,对每个个体进行解码(decode)并计算出其适应度值,具体操作在
用户类中实现。
Statistic: 对当前群体进行统计,如求总适应度 sumfitness、平均适应度 average、最好个体
fmax、最坏个体 fmin 等。
TSGA 类在 TPopulation 类的基础上派生,以 GA 的系统参数为构造函数的参数,它有 4 个
重要的成员函数:
Select: 选择算子,
Crossover: 交叉算子,以概率 Pc 在两基因链上的随机位置交换子串。
Mutation: 变异算子,以概率 Pm 对基因链上每一个基因进行随机干扰(取反)。
Generate: 产生下代,包括了评价、统计、选择、交叉、变异等全部过程,每运行一次,
产生新的一代。
SGA 的结构及类定义如下(用 C++编写):
[code] typedef char ALLELE; // 基因类型
typedef struct{
ALLELE *chrom;
float fitness; // fitness of Chromosome
}INDIVIDUAL; // 个体定义
class TPopulation{ // 群体类定义
public:
int size; // Size of population: n
int lchrom; // Length of chromosome: l
float sumfitness, average;
INDIVIDUAL *fmin, *fmax;
INDIVIDUAL *pop;
TPopulation(int popsize, int strlength);
~TPopulation();
inline INDIVIDUAL &Individual(int i){ return pop[i];};
void FillFitness(); // 评价函数
virtual void Statistics(); // 统计函数
};
class TSGA : public TPopulation{ // TSGA 类派生于群体类
public:
float pcross; // Probability of Crossover
float pmutation; // Probability of Mutation
int gen; // Counter of generation
TSGA(int size, int strlength, float pm=0.03, float pc=0.6):
TPopulation(size, strlength)
{gen=0; pcross=pc; pmutation=pm; } ;
virtual INDIVIDUAL& Select();
virtual void Crossover(INDIVIDUAL &parent1, INDIVIDUAL &parent2,
INDIVIDUAL &child1, INDIVIDUAL &child2);
&child1, INDIVIDUAL &child2);
virtual ALLELE Mutation(ALLELE alleleval);
virtual void Generate(); // 产生新的一代
};
用户 GA 类定义如下:
class TSGAfit : public TSGA{
public:
TSGAfit(int size,float pm=0.0333,float pc=0.6)
:TSGA(size,24,pm,pc){};
void print();
}; [/code]
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MaxGen 30
#define chrom_length 4
#define PopSize 20
#define Upper_Num 5
#define Down_Num 6
#define Point_Num 11
#define INFINITY 9999
#define pc 0.6
#define pm 0.05
#define E 2.78
double d=2,l=10;
double weight=0.5;
int gen;
剩余31页未读,继续阅读
资源评论
- nd0022011-10-28函数都没写全,都没用上,请新手注意。。。
wwf5067
- 粉丝: 2
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功