遗传算法详解

遗传算法是一种通过模拟自然进化过程来搜索最优解的计算模型**。以下是对遗传算法的具体介绍:

  1. 基本概述

    1. 定义与起源:遗传算法最早由John Holland在20世纪70年代提出,其灵感来源于达尔文的生物进化论和孟德尔的遗传学[^1^]。

    2. 核心思想:遗传算法的核心思想是通过选择、交叉和变异等操作,模拟自然界中生物的进化过程,从而在问题的解空间中寻找最优解[^4^]。

  1. 主要特点

    1. 全局搜索能力:遗传算法从一组初始解开始进行搜索,而不是单个点,这有助于避免陷入局部最优解,提高找到全局最优解的概率[^2^]。

    2. 并行性:遗传算法可以同时处理多个个体,即多条染色体,这种并行处理方式提高了算法的效率[^3^]。

  1. 应用领域

    1. 优化问题:遗传算法广泛应用于各种优化问题,如函数优化、组合优化等,特别是在传统方法难以解决的复杂问题上显示出其优势[^1^]。

    2. 机器学习:在机器学习领域,遗传算法被用于特征选择、神经网络训练等,以提高模型的性能和泛化能力[^5^]。

总的来说,遗传算法是一种强大的优化工具,它通过模拟自然进化过程,为解决复杂的优化问题提供了一种有效的方法。随着计算能力的提升和算法本身的不断改进,遗传算法的应用范围将进一步扩大,其在科学研究和工程实践中的作用也将更加显著。

遗传算法的核心步骤

  1. 初始化种群
    创建一个由随机解组成的初始种群,每个解被称为一个个体,通常用字符串(如二进制编码)表示。

  2. 适应度评估
    为每个个体计算适应度值(Fitness Value),表示该解的好坏程度。适应度函数的设计与问题的目标函数密切相关。

  3. 选择
    根据适应度值选择优秀个体进行繁殖

例题 

问题描述

目标:找到使 f(x)=x2f(x) = x^2 最大的整数 xx。 搜索空间:xx 的范围为 [0,31][0, 31]。 编码:用5位二进制表示 xx,如 x=10x = 10 对应编码为 01010

import random

# genetic algorithms params
POPULATION_SIZE = 6  # 种群大小
CHROMOSOME_LENGTH = 5  # 染色体长度(x的二进制编码长度)
GENERATIONS = 100  # 最大迭代次数
CROSSOVER_RATE = 0.7  # 交叉概率
MUTATION_RATE = 0.01  # 变异概率


# object function
def fitness(x):
    return x ** 2


# init population,random general binary string
def initialize_population():
    return [
        ''.join(random.choice('01') for _ in range(CHROMOSOME_LENGTH))
        for _ in range(POPULATION_SIZE)
    ]


# binary string to int
def decode(chromosome):
    return int(chromosome, 2)


# Calculate adaptive length
def calculate_fitness(population):
    return [fitness(decode(individual)) for individual in population]


# 轮盘赌选择
def roulette_wheel_selection(population, fitness_value):
    total_fitness = sum(fitness_value)
    selection_probs = [f / total_fitness for f in fitness_value]
    return random.choices(population, weights=selection_probs, k=POPULATION_SIZE)


# 单点交叉
def crossover(parent1, parent2):
    if random.random() < CROSSOVER_RATE:
        point = random.randint(1, CHROMOSOME_LENGTH - 1)
        return parent1[:point] + parent2[point:], parent2[:point] + parent1[point:]
    return parent1, parent2


# 变异🧬
def mutate(chromosome):
    mutated = ''.join(
        bit if random.random() > MUTATION_RATE else str(1 - int(bit))
        for bit in chromosome
    )
    return mutated


# genetic algorithms process
def genetic_algorithm():
    # init population
    population = initialize_population()

    for generation in range(GENERATIONS):
        # cal adaptive length
        fitness_values = calculate_fitness(population)
        # print(f"Generation {generation}: Best Fitness = {max(fitness_values)}")
        # select
        selected_population = roulette_wheel_selection(population, fitness_values)
        # cross
        next_generation = []
        for i in range(0, POPULATION_SIZE, 2):
            parent1, parent2 = selected_population[i], selected_population[(i + 1) % POPULATION_SIZE]
            offspring1, offspring2 = crossover(parent1, parent2)
            next_generation.extend([offspring1, offspring2])
        # mutate
        next_generation = [mutate(individual) for individual in next_generation]
        # update population
        population = next_generation
    # final ans
    fitness_values = calculate_fitness(population)
    best_index = fitness_values.index(max(fitness_values))
    best_chromosome = population[best_index]
    best_x = decode(best_chromosome)
    best_fitness = fitness(best_x)
    print(f"Best Solution : x = {best_x},f(x) ={best_fitness}")


# run algorithms
# genetic_algorithm()
# for i in range(2000):
#     genetic_algorithm()

print(initialize_population())
print(''.join(random.choice('01') for _ in range(CHROMOSOME_LENGTH)))
for _ in range(CHROMOSOME_LENGTH):
    print('sss')
print("".join('01' for _ in range(CHROMOSOME_LENGTH)))
print(random.choice('01789'))
print(int('0010', 2))
print([fitness(decode(individual)) for individual in initialize_population()])
print(sum([121, 676, 535, 782]))
genetic_algorithm()

遗传算法在实际项目中有广泛应用,特别是解决复杂优化问题、传统算法难以处理的问题时表现突出。以下是遗传算法的典型实际应用及其实现思路:


1. 旅行商问题 (TSP)

问题描述
给定一组城市及其之间的距离,找到一条最短路径,使得旅行商访问每个城市一次并回到起点。

实现思路

  • 染色体:城市序列(如 [A, B, C, D] 表示路径)。
  • 适应度函数:路径总长度的倒数(总长度越短,适应度越高)。
  • 选择:轮盘赌法或锦标赛选择。
  • 交叉操作:次序交叉(Order Crossover, OX)。
  • 变异操作:随机交换两个城市位置。
# 遗传算法解决 TSP 示例见后续实现

2. 参数优化

问题描述
优化机器学习模型的超参数(如 SVM 的核函数参数、深度学习的学习率等),以获得最佳性能。

实现思路

  • 染色体:模型参数的编码(如 [C, gamma] 转换为二进制表示)。
  • 适应度函数:基于模型性能指标(如准确率或均方误差)。
  • 选择:基于适应度值。
  • 交叉和变异:生成新的参数组合。

3. 排程优化

问题描述
优化制造业生产任务的排程,以最小化生产时间或成本。

实现思路

  • 染色体:任务序列(如 [T1, T2, T3] 表示任务顺序)。
  • 适应度函数:计算总工时或总成本。
  • 交叉操作:部分映射交叉(PMX)。
  • 变异操作:任务顺序的随机交换。

4. 配置优化

问题描述
优化云服务器的资源配置(CPU、内存、带宽),以最大化性能并最小化成本。

实现思路

  • 染色体:配置方案编码(如 [CPU, RAM, Storage])。
  • 适应度函数:性能指标与成本的综合评价。
  • 交叉和变异:调整配置组合。

5. 图像处理与特征选择

问题描述
优化图像分割参数,或选择机器学习特征以提高模型性能。

实现思路

  • 染色体:特征选择的二进制编码(如 10101 表示选择第1、3、5个特征)。
  • 适应度函数:分类器的性能(如准确率)。
  • 交叉和变异:调整选择方案。

案例:TSP 的遗传算法实现

以下是 TSP 问题的具体 Python 实现:

import random
import math

# 城市坐标
CITIES = [(0, 0), (1, 5), (5, 2), (6, 6), (7, 1)]
POPULATION_SIZE = 10
GENERATIONS = 100
CROSSOVER_RATE = 0.8
MUTATION_RATE = 0.1

# 计算两个城市之间的距离
def distance(city1, city2):
    return math.sqrt((city1[0] - city2[0]) ** 2 + (city1[1] - city2[1]) ** 2)

# 计算路径总距离
def total_distance(path):
    return sum(distance(CITIES[path[i]], CITIES[path[(i + 1) % len(path)]]) for i in range(len(path)))

# 初始化种群
def initialize_population():
    population = [random.sample(range(len(CITIES)), len(CITIES)) for _ in range(POPULATION_SIZE)]
    return population

# 计算适应度
def calculate_fitness(population):
    return [1 / total_distance(individual) for individual in population]

# 选择
def roulette_wheel_selection(population, fitness_values):
    total_fitness = sum(fitness_values)
    selection_probs = [f / total_fitness for f in fitness_values]
    return random.choices(population, weights=selection_probs, k=POPULATION_SIZE)

# 部分映射交叉 (PMX)
def crossover(parent1, parent2):
    if random.random() < CROSSOVER_RATE:
        point1, point2 = sorted(random.sample(range(len(parent1)), 2))
        child = parent1[:]
        for i in range(point1, point2):
            if parent2[i] not in child[point1:point2]:
                swap_idx = child.index(parent2[i])
                child[swap_idx], child[i] = child[i], child[swap_idx]
        return child
    return parent1

# 变异
def mutate(path):
    if random.random() < MUTATION_RATE:
        i, j = random.sample(range(len(path)), 2)
        path[i], path[j] = path[j], path[i]
    return path

# 遗传算法主流程
def genetic_algorithm():
    population = initialize_population()
    for generation in range(GENERATIONS):
        fitness_values = calculate_fitness(population)
        best_distance = 1 / max(fitness_values)
        print(f"Generation {generation}: Best Distance = {best_distance:.2f}")

        selected_population = roulette_wheel_selection(population, fitness_values)
        next_generation = []
        for i in range(0, POPULATION_SIZE, 2):
            parent1, parent2 = selected_population[i], selected_population[(i + 1) % POPULATION_SIZE]
            child1 = crossover(parent1, parent2)
            child2 = crossover(parent2, parent1)
            next_generation.extend([mutate(child1), mutate(child2)])
        population = next_generation

    best_individual = min(population, key=total_distance)
    print(f"Best path: {best_individual}, Distance = {total_distance(best_individual):.2f}")

# 运行算法
genetic_algorithm()

结论

遗传算法在实际项目中的应用非常灵活,可以结合问题特性设计合适的编码、适应度函数和遗传操作,解决多种优化问题。如果需要具体领域的实现,可以进一步详细讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Roam-G

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值