Python打卡DAY12

超参数调整专题2

  1. 三种启发式算法的示例代码:遗传算法、粒子群算法、退火算法
  2. 学习优化算法的思路(避免浪费无效时间)

作业:今天以自由探索的思路为主,尝试检索资料、视频、文档,用尽可能简短但是清晰的语言看是否能说清楚这三种算法每种算法的实现逻辑,帮助更深入的理解。

1. 遗传算法(Genetic Algorithm)

基本逻辑

  • 遗传算法模仿生物进化的过程,通过选择、交叉、变异操作不断优化解。

  • 包括初始化种群、选择适应度高的个体、交叉、变异和生成新一代种群,直到满足终止条件。

举个例子:想象你是一个赛跑选手,你参加一个比赛,目标是找出最快的跑步者。每个人的表现(适应度)取决于他们的体力、耐力和速度等因素。你和其他选手每次比赛后会根据成绩挑选出最优秀的选手,让他们交换训练方法(交叉),或者偶尔调整一下训练内容(变异),最终选出最强的跑步选手。

步骤

  • 选择:挑选出表现最好的选手(最优解)继续繁衍。

  • 交叉:让两个优秀选手交换训练方法,产生新的训练方式(新的解)。

  • 变异:偶尔随机改变训练方法,创造新的变种。

  • 重复这个过程直到找到最佳选手。

import random

# 适应度函数
def fitness(solution):
    return sum(solution)

# 选择函数(选择适应度最高的个体)
def select(population):
    return max(population, key=fitness)

# 交叉操作
def crossover(parent1, parent2):
    point = random.randint(1, len(parent1)-1)
    return parent1[:point] + parent2[point:]

# 变异操作
def mutate(solution):
    point = random.randint(0, len(solution)-1)
    solution[point] = 1 - solution[point]

# 遗传算法主流程
def genetic_algorithm(population_size, generations, solution_size):
    population = [[random.choice([0, 1]) for _ in range(solution_size)] for _ in range(population_size)]
    for generation in range(generations):
        parents = [select(population) for _ in range(population_size//2)]
        offspring = []
        for i in range(0, len(parents), 2):
            child = crossover(parents[i], parents[i+1])
            mutate(child)
            offspring.append(child)
        population = parents + offspring
    return select(population)

best_solution = genetic_algorithm(10, 50, 6)
print("Best solution:", best_solution)

2. 粒子群算法(Particle Swarm Optimization, PSO)

基本逻辑

  • 粒子群算法模拟鸟群觅食的过程,每个“粒子”代表一个可能的解,每个粒子都有位置和速度,通过个体经验和群体经验来更新位置。

  • 通过个体和全局最优解来引导粒子朝着最优解收敛。

举个例子:就像一群鸟在天空中飞行,每只鸟都知道自己最好的位置(局部最优),而且也知道其他鸟群飞得更高、更远的地方(全局最优)。每只鸟会根据自己飞行的经验和其他鸟的飞行情况来调整自己的飞行方向,最终找到最丰富的食物来源(最优解)

步骤

  • 每只鸟都有一个当前位置(解)和飞行速度(搜索方向)。

  • 根据自己找到的食物(适应度),调整飞行方向(更新位置)。

  • 还会关注其他鸟飞得更远的地方(全局最优),并根据这些信息调整自己的飞行方向。

  • 不断重复这个过程,所有鸟群会一起飞向最丰富的食物来源(最优解)。

import random

# 适应度函数
def fitness(x):
    return sum(x)

# 粒子群算法主流程
def pso(particle_size, dimensions, iterations):
    # 初始化粒子的位置和速度
    particles = [[random.random() for _ in range(dimensions)] for _ in range(particle_size)]
    velocities = [[random.random() for _ in range(dimensions)] for _ in range(particle_size)]
    pbest = particles[:]  # 个体最优
    gbest = max(particles, key=fitness)  # 全局最优

    for _ in range(iterations):
        for i in range(particle_size):
            # 更新速度
            for j in range(dimensions):
                velocities[i][j] = velocities[i][j] + random.random() * (pbest[i][j] - particles[i][j]) + random.random() * (gbest[j] - particles[i][j])
                particles[i][j] = particles[i][j] + velocities[i][j]
            # 更新个体最优
            if fitness(particles[i]) > fitness(pbest[i]):
                pbest[i] = particles[i]
        # 更新全局最优
        gbest = max(pbest, key=fitness)
    return gbest

best_solution = pso(10, 5, 50)
print("Best solution:", best_solution)

3. 退火算法(Simulated Annealing, SA)

基本逻辑

  • 退火算法模拟物理退火过程,通过控制温度逐步降低,允许在初期接受较差的解,随着温度降低,逐渐收敛到全局最优解。

  • 每次迭代时,算法通过接受新的解(无论好坏)来避免陷入局部最优。

举个例子:你正在做一个精细的雕刻工作,开始时,你可以随意改变雕刻的方式,即使不完美的地方也可以接受,因为冰块还很软,可以随时修改。但随着雕刻的进行,冰块逐渐变硬,你不能再随意修改。随着冰块的逐渐硬化,你只能做更精细的雕刻,最终找到最完美的形状。

步骤

  • 开始时:给定一个初始解(雕刻的冰块形状),允许随机修改(接受一些不完美的解),就像冰块刚开始时还比较软,随便雕刻。

  • 逐步降低温度:随着时间推移,逐渐减少修改的“自由度”,即降低温度,允许改变的幅度逐渐减少。

  • 精细雕刻:随着温度降低,逐渐集中在局部区域优化,最终精雕出最完美的解。

import random
import math

# 适应度函数
def fitness(x):
    return sum(x)

# 退火算法主流程
def simulated_annealing(dimensions, iterations, temperature):
    current_solution = [random.choice([0, 1]) for _ in range(dimensions)]
    current_fitness = fitness(current_solution)
    
    for iteration in range(iterations):
        # 降温
        temp = temperature / (iteration + 1)
        # 生成新解
        new_solution = current_solution[:]
        pos = random.randint(0, len(new_solution)-1)
        new_solution[pos] = 1 - new_solution[pos]
        new_fitness = fitness(new_solution)
        
        # 判断是否接受新解
        if new_fitness > current_fitness or random.random() < math.exp((new_fitness - current_fitness) / temp):
            current_solution = new_solution
            current_fitness = new_fitness
            
    return current_solution

best_solution = simulated_annealing(6, 1000, 100)
print("Best solution:", best_solution)

总结:

  1. 遗传算法:模拟自然选择过程,通过选择、交叉和变异来优化解。

  2. 粒子群算法:模拟鸟群觅食过程,粒子通过个体和群体经验不断更新位置来找到最优解。

  3. 退火算法:模拟物理退火过程,随着温度降低逐渐收敛到最优解,通过接受更差的解避免陷入局部最优。

@浙大疏锦行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值