Genetic Algorithm遗传算法学习

参考资料:http://blog.csdn.net/b2b160/article/details/4680853/#comments(冒昧的用了链接下的几张图)
百度百科:http://baike.baidu.com/link?url=FcwTBx_yPcD5DDEnN1FqvTkG4QNllkB7Yis6qFOL65wpn6EdT5LXFxUCmv4JlUfV3LUPHQGdYbGj8kHVs3GuaK

算法介绍

遗传算法是模拟达尔文生物进化论的自然选择和遗传学进化机理的计算模型。运用到了生物学中“适者生存,优胜劣汰”的原理。在每一次的进化过程中,把拥有更好环境适应性的基因传给下一代,直到最后的个体满足特定的条件,代表进化的结束,GA(后面都以GA代称为遗传算法的意思)算法是一种利用生物进化理论来搜索最优解的一种算法。

算法原理

算法的基本框架

了解算法的基本框架是理解整个算法的基础,算法的框架包含编码、适应度函数、初始群体的选择。先假设本例子的目标函数如下,求出他的最大值

f(x) = x1 * x1 + x2 * x2; 1<= x1 <=7, 1<= x2<=7

1、适应度函数。适应度函数是用来计算个体的适应值计算,顾名思义,适应值越高的个体,环境适应性越好,自然就要有更多的机会把自己的基因传给下一代,所以,其实适应度函数在这里起着一个过滤条件的作用。在本例子,目标函数总为非负值,并且以函数最大化为优化目标,所以可以将函数的值作为适应值。

2、编码。编码指的是将个体的信息表示成编码的字符串形式。如果个体变量时数字的形式,可以转为二进制的方式。

算法的群体选择过程

这个过程是遗传算法的核心过程,在里面分为了3个小的步骤,选择,交叉,变异。

1、初始个体的选择过程。就是挑选哪些个体作为即将产生下一代的个体呢。过程如下:

(1).利用适值函数,计算每个个体的适值,计算每个个体的适值占总和的百分比。

(2).根据百分比为每个个体划定一定的所属区间。

(3).产生一个[0, 1]的小数,判断这个小数点落在哪个个体的区间内,就表明要选出这个个体。这里其实就已经蕴含着把高适值的个体优先传入下一代,因为适值高,有更高的几率小数是落在自己的区间内的。

用图示范的形式表现如下:


  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我了解您的问题了。以下是一个简单的Python实现遗传算法的示例代码: ```python import random # 定义目标函数 def fitness_function(x): return x**2 # 定义种群数量 POPULATION_SIZE = 100 # 定义染色体长度 CHROMOSOME_LENGTH = 20 # 定义交叉概率 CROSSOVER_RATE = 0.8 # 定义变异概率 MUTATION_RATE = 0.1 # 定义种群 population = [] # 初始化种群 for i in range(POPULATION_SIZE): chromosome = [] for j in range(CHROMOSOME_LENGTH): chromosome.append(random.randint(0, 1)) population.append(chromosome) # 迭代次数 GENERATIONS = 500 # 开始迭代 for generation in range(GENERATIONS): # 计算适应度 fitness_values = [] for chromosome in population: x = int(''.join(map(str, chromosome)), 2) fitness_values.append(fitness_function(x)) # 找到最优解 best_fitness = max(fitness_values) best_chromosome = population[fitness_values.index(best_fitness)] # 输出结果 print("Generation:", generation, "Best fitness:", best_fitness, "Best chromosome:", best_chromosome) # 选择 parents = [] for i in range(POPULATION_SIZE): parent1 = population[random.randint(0, POPULATION_SIZE-1)] parent2 = population[random.randint(0, POPULATION_SIZE-1)] if fitness_function(int(''.join(map(str, parent1)), 2)) > fitness_function(int(''.join(map(str, parent2)), 2)): parents.append(parent1) else: parents.append(parent2) # 交叉 offspring = [] for i in range(0, POPULATION_SIZE, 2): parent1 = parents[i] parent2 = parents[i+1] if random.random() < CROSSOVER_RATE: crossover_point = random.randint(1, CHROMOSOME_LENGTH-1) offspring1 = parent1[:crossover_point] + parent2[crossover_point:] offspring2 = parent2[:crossover_point] + parent1[crossover_point:] offspring.append(offspring1) offspring.append(offspring2) else: offspring.append(parent1) offspring.append(parent2) # 变异 for i in range(POPULATION_SIZE): chromosome = offspring[i] for j in range(CHROMOSOME_LENGTH): if random.random() < MUTATION_RATE: chromosome[j] = 1 - chromosome[j] # 更新种群 population = offspring ``` 这个示例实现了一个简单的遗传算法来求解目标函数 $f(x)=x^2$ 的最大值,其中 $x$ 是一个20位的二进制数。在每个迭代中,选择、交叉和变异操作被执行以生成新的种群。最终找到最优解并输出结果。 请注意,这只是一个简单的示例,实际应用中需要根据具体问题进行适当的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值