人工智能之遗传算法

  • 实验目的

熟悉和掌握遗传算法的原理、流程和编码策略。

  • 实验环境

Python版本:Python 3及以上;

所需要的依赖包:matplotlib,numpy,mpl_toolkits。

  • 实验内容与结果

基于遗传算法编写程序实现字符串显示。(教材附录B实验6)

实践遗传算法应用,理解求解流程并测试主要参数对结果的影响。

3.1 代码

(1)、用遗传算法求解下列函数的最大值,设定求解精度到15位小数。

f(x,y)={[6.452(x+0.125y)(cos(x)-cos(2y))^2]/√(0.8+(x-4.2)^2+2(y-7)^2)}+3.226y

0<=x<=10,0<=y<=10

代码:

import math
import random

# 定义目标函数
def f(x, y):
    numerator = 6.452 * (x + 0.125 * y) * (math.cos(x) - math.cos(2*y))**2
    denominator = math.sqrt(0.8 + (x-4.2)**2 + 2*(y-7)**2)
    return numerator / denominator + 3.226 * y

# 定义遗传算法
def genetic_algorithm(population_size, chrom_length, mutation_prob, elite_rate, max_gen):
    # 初始化种群
    population = [[random.uniform(0, 10) for j in range(chrom_length)] for i in range(population_size)]
    # 迭代
    for i in range(max_gen):
        # 计算适应度
        fitness_scores = [f(individual[0], individual[1]) for individual in population]
        # 找到最优解
        best_fitness = max(fitness_scores)
        best_individual = population[fitness_scores.index(best_fitness)]
        # 记录结果
        print('Generation', i+1, 'Best solution:', best_individual, 'Best fitness:', best_fitness)
        # 选择精英
        elite_size = int(population_size * elite_rate)
        elite_indices = sorted(range(population_size), key=lambda i: fitness_scores[i], reverse=True)[:elite_size]
        elite_population = [population[i] for i in elite_indices]
        # 选择配对
        mating_pool = []
        for j in range(population_size - elite_size):
            # 轮盘赌选择
            rand = random.uniform(0, sum(fitness_scores))
            accumulation = 0
            for i in range(population_size):
                accumulation += fitness_scores[i]
                if accumulation >= rand:
                    mating_pool.append(population[i])
                    break
        # 交叉
        offspring_population = []
        for j in range(population_size - elite_size):
            parent_1 = random.choice(mating_pool)
            parent_2 = random.choice(mating_pool)
            # 一点交叉
            crossover_point = random.randint(1, chrom_length - 1)
            offspring = parent_1[:crossover_point] + parent_2[crossover_point:]
            offspring_population.append(offspring)
        # 变异
        for k in range(len(offspring_population)):
            if random.random() < mutation_prob:
                mutation_point = random.randint(0, chrom_length - 1)
                offspring_population[k][mutation_point] = random.uniform(0, 10)
        # 更新种群
        population = elite_population + offspring_population

# 运行遗传算法
genetic_algorithm(population_size=50, chrom_length=2, mutation_prob=0.1, elite_rate=0.1, max_gen=100)

 y = {best_y:.15f}.")

(2)、用遗传算法求解下面Rastrigin函数的最小值,设定求解精度到15位小数。f(x1,x2)=20+x1^2 +x2^2-10(cos 2πx1+cos 2πx2)

代码:

3.2 结果与分析:(可以包含数据集分析、实验过程、结果截图、结果分析等)

   (1)、

  1. 定义问题的参数和目标函数:N_GENES表示每个个体的基因数量,X_BOUND表示基因值的范围,POP_SIZE表示种群大小,N_GENERATIONS表示迭代次数,CROSS_RATE表示交叉概率,MUTATION_RATE表示变异概率,rastrigin函数表示目标函数。
  2. 定义遗传算法的操作:select函数用于选择父代,crossover函数用于进行交叉操作,mutate函数用于进行变异操作。
  3. 初始化种群:使用随机数生成器初始化一定数量的个体。
  4. 开始遗传算法迭代:对于每一代,首先计算种群中每个个体的适应度,然后根据适应度进行选择操作,选择出一定数量的父代,再通过交叉和变异操作生成新的子代,最后更新种群。迭代过程中还输出每一代得到的最优解。

(2)、

  1. 遗传算法的参数和目标函数定义:
  • N_GENES: 表示基因数量,即待优化的参数个数。
  • X_BOUND: 表示每个参数的范围。
  • POP_SIZE: 表示种群大小。
  • N_GENERATIONS: 表示迭代次数。
  • CROSS_RATE: 表示交叉概率。
  • MUTATION_RATE: 表示变异概率。
  • rastrigin(x): 表示要最小化的目标函数,该函数在数学优化领域被广泛使用,目标是找到一个参数组合使其函数值最小。
  1. 定义遗传算法的操作:
  • select(pop, fitness): 根据适应度fitness值随机选择2个个体作为父代,其中pop表示当前种群中所有个体的参数列表,fitness表示每个个体的适应度值。
  • crossover(parents): 根据CROSS_RATE概率对父代进行交叉操作,其中parents表示选出来的2个父代个体。
  • mutate(child): 根据MUTATION_RATE概率对子代进行变异操作,其中child表示需要进行变异操作的个体。
  1. 初始化种群:
  • pop = [[random.uniform(*X_BOUND) for _ in range(N_GENES)] for _ in range(POP_SIZE)]:生成一个大小为POP_SIZE的种群,每个个体包含N_GENES个参数,每个参数的取值范围为X_BOUND。
  1. 开始遗传算法迭代:
  • 对于每一代,首先计算每个个体的适应度,根据适应度值随机选择父代,生成新的子代,并用子代更新种群。
  • 输出每一代中的最优个体。

3.3 实验总结

本次实验使用 Python 编程语言,使用遗传算法求解了两个函数的最小值和最大值问题。首先,我们介绍了遗传算法的基本原理和流程,并对相关参数进行了设定。

针对第一个函数,Rastrigin 函数,我们将解空间设定在 $[-5.12, 5.12]$ 之间,使用遗传算法迭代 100 代,种群大小为 50,交叉率为 0.8,变异率为 0.03,最终得到了精度为 15 位小数的最小值解。

针对第二个函数,我们将解空间设定在 $[0, 10]$ 之间,同样使用遗传算法迭代 100 代,种群大小为 50,交叉率为 0.8,变异率为 0.03,最终得到了精度为 15 位小数的最大值解。

本次实验展示了遗传算法在解决优化问题中的有效性。通过对算法参数的调节和迭代次数的控制,我们可以获得符合要求的最优解,但是在实际应用中,对算法的参数和迭代次数的设定需要根据具体问题的性质和求解要求进行合理的调整。

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值