【遗传算法】Genetic algorithms (GAs) 遗传算法原理入门与应用代码

news2024/11/27 0:17:52

目录

1 遗传算法        

2 遗传算法的基本步骤

3 Python示例

4 遗传算法解决TSP(旅行商问题) 


1 遗传算法        

        遗传算法是一种优化搜索算法,模拟自然选择和遗传机制来寻找问题的最优解。这种算法的设计灵感来自于达尔文的进化论和遗传学的基本原理。遗传算法通常用于解决优化问题,其中需要找到某个问题的最优解或近似最优解。

2 遗传算法的基本步骤

  1. 初始化种群(Population Initialization): 随机生成一组个体(解决方案)组成的初始群体。每个个体通常由染色体表示,染色体上的基因表示问题的解。

  2. 适应度评估(Fitness Evaluation): 对每个个体计算适应度,即解决方案的优劣程度。适应度函数根据问题的性质而定,它用于量化个体的质量。

  3. 选择(Selection): 选择适应度较高的个体,作为下一代种群的父代。通常,适应度较高的个体被选中的概率较大,模拟了自然选择的过程。

  4. 交叉(Crossover): 通过交叉操作,从父代中生成新的个体。这模拟了基因的交叉过程,将两个父代的染色体组合生成新的染色体。

  5. 变异(Mutation): 对新生成的个体进行变异操作,以引入一些随机性。变异有助于维持种群的多样性,避免陷入局部最优解。

  6. 替换(Replacement): 用新生成的个体替代原始种群中适应度较低的个体。这是为了确保种群中的优质个体得以保留。

  7. 重复迭代(Iteration): 重复执行上述步骤,直到满足停止条件。停止条件可以是达到预定的迭代次数,找到满意的解,或者适应度已经足够高。

3 Python示例

下面是一个简单的Python示例,演示了如何实现一个基本的遗传算法来解决一个简单的优化问题:

import random

# 1. 初始化种群
def initialize_population(population_size, chromosome_length):
    return [[random.randint(0, 1) for _ in range(chromosome_length)] for _ in range(population_size)]

# 2. 适应度评估
def fitness(individual):
    return sum(individual)

# 3. 选择
def selection(population):
    population_size = len(population)
    fitness_scores = [fitness(individual) for individual in population]
    total_fitness = sum(fitness_scores)
    probabilities = [score / total_fitness for score in fitness_scores]
    selected_indices = random.choices(range(population_size), weights=probabilities, k=population_size)
    return [population[i] for i in selected_indices]

# 4. 交叉
def crossover(parent1, parent2):
    crossover_point = random.randint(1, len(parent1) - 1)
    child1 = parent1[:crossover_point] + parent2[crossover_point:]
    child2 = parent2[:crossover_point] + parent1[crossover_point:]
    return child1, child2

# 5. 变异
def mutation(individual, mutation_rate):
    mutated_individual = individual[:]
    for i in range(len(mutated_individual)):
        if random.random() < mutation_rate:
            mutated_individual[i] = 1 - mutated_individual[i]
    return mutated_individual

# 6. 替换
def replacement(population, offspring):
    return population + offspring

# 7. 遗传算法主循环
def genetic_algorithm(population_size, chromosome_length, generations, mutation_rate):
    population = initialize_population(population_size, chromosome_length)

    for generation in range(generations):
        # 2. 适应度评估
        fitness_scores = [fitness(individual) for individual in population]
        best_individual = population[fitness_scores.index(max(fitness_scores))]
        print(f"Generation {generation + 1}, Best Fitness: {fitness(best_individual)}")

        # 3. 选择
        selected_population = selection(population)

        # 4. 交叉
        offspring = []
        for _ in range(population_size // 2):
            parent1, parent2 = random.sample(selected_population, 2)
            child1, child2 = crossover(parent1, parent2)
            offspring.extend([child1, child2])

        # 5. 变异
        offspring = [mutation(individual, mutation_rate) for individual in offspring]

        # 6. 替换
        population = replacement(population, offspring)

    return best_individual

# 运行遗传算法
best_solution = genetic_algorithm(population_size=50, chromosome_length=10, generations=50, mutation_rate=0.1)
print("Best Solution:", best_solution)
print("Best Fitness:", fitness(best_solution))

这个示例是一个简单的二进制优化问题,目标是找到染色体中1的数量最多的个体。在实际应用中,你需要根据具体问题调整适应度函数、交叉、变异等操作。

4 遗传算法解决TSP(旅行商问题) 

        考虑一个实际的遗传算法问题:TSP(旅行商问题)。在TSP中,旅行商要访问一组城市,并找到一条最短路径,使得每个城市都被访问一次,然后返回起始城市。 

下面是一个简单的Python实例,演示如何使用遗传算法解决TSP:

import numpy as np
import random

# 生成城市坐标
def generate_cities(num_cities):
    return np.random.rand(num_cities, 2)

# 计算路径长度
def calculate_distance(path, cities):
    distance = 0
    for i in range(len(path) - 1):
        distance += np.linalg.norm(cities[path[i]] - cities[path[i + 1]])
    distance += np.linalg.norm(cities[path[-1]] - cities[path[0]])  # 回到起始城市
    return distance

# 初始化种群
def initialize_population(population_size, num_cities):
    return [random.sample(range(num_cities), num_cities) for _ in range(population_size)]

# 选择操作
def selection(population, cities):
    fitness_scores = [1 / calculate_distance(individual, cities) for individual in population]
    total_fitness = sum(fitness_scores)
    probabilities = [score / total_fitness for score in fitness_scores]
    selected_indices = random.choices(range(len(population)), weights=probabilities, k=len(population))
    return [population[i] for i in selected_indices]

# 交叉操作
def crossover(parent1, parent2):
    crossover_point = random.randint(1, len(parent1) - 1)
    child1 = parent1[:crossover_point] + [city for city in parent2 if city not in parent1[:crossover_point]]
    child2 = parent2[:crossover_point] + [city for city in parent1 if city not in parent2[:crossover_point]]
    return child1, child2

# 变异操作
def mutation(individual):
    index1, index2 = random.sample(range(len(individual)), 2)
    individual[index1], individual[index2] = individual[index2], individual[index1]
    return individual

# 遗传算法主循环
def genetic_algorithm(num_cities, population_size, generations):
    cities = generate_cities(num_cities)
    population = initialize_population(population_size, num_cities)

    for generation in range(generations):
        # 选择
        selected_population = selection(population, cities)

        # 交叉
        offspring = []
        for _ in range(population_size // 2):
            parent1, parent2 = random.sample(selected_population, 2)
            child1, child2 = crossover(parent1, parent2)
            offspring.extend([child1, child2])

        # 变异
        offspring = [mutation(individual) for individual in offspring]

        # 替换
        population = offspring

        # 打印每一代的最优解
        best_individual = min(population, key=lambda x: calculate_distance(x, cities))
        print(f"Generation {generation + 1}, Best Distance: {calculate_distance(best_individual, cities)}")

    # 返回最终的最优解
    best_individual = min(population, key=lambda x: calculate_distance(x, cities))
    return best_individual, calculate_distance(best_individual, cities)

# 运行遗传算法
num_cities = 10
population_size = 50
generations = 100
best_solution, best_distance = genetic_algorithm(num_cities, population_size, generations)

print("\nBest Solution:")
print(best_solution)
print("Best Distance:", best_distance)

        这个例子中,我们随机生成了一组城市,并使用遗传算法寻找最短路径。在每一代,通过选择、交叉、变异和替换操作,逐步优化种群。最终,我们输出找到的最优路径和对应的路径长度。这个例子可以帮助你理解如何将遗传算法应用于解决实际的优化问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1213269.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android studio配置Flutter开发环境报错问题解决

博主前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住也分享一下给大家 &#x1f449;点击跳转到教程 报错问题截图 报错原因已经给出&#xff1a; You need Java 11 or higher to build your app with this version of G…

一步路难倒英雄汉?app自动化测试,怎么从零搭建appium!

不少软件测试想进阶到自动化测试&#xff0c;没有前人知道&#xff0c;只能像个无头的苍蝇&#xff0c;到处乱转&#xff0c;根本不知道从何处下手 特别是自学路上碰到需要安装什么程序、工具的时候&#xff0c;一个报错就需要在百度上查个半天&#xff0c;这么浪费时间的事情…

FPGA时序约束与分析-简单入门

FPGA时序约束与分析-简单入门 文章目录 FPGA时序约束与分析-简单入门1. 本课程概述2. 时序约束简介2.1 什么是时序约束2.2 合理的时序约束2.3 *基于Vivado的时序约束方法 3. 时序分析的基本概念3.1 时钟与时钟偏差3.2 建立时间和保持时间3.3 时序分析中路径、沿和关系的定义 4.…

立体库堆垛机控制程序故障输出功能块

故障输出块 A "提升变频器故障" // O "提升变频器通讯故障" // ON "提升变频器准备好" "提升变频故障" A "水平变频器故障" // O "水平变频器通讯故障" // ON…

Spring源码—初识IOC

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代码不会敲的小符&#xff0c;双非大四&#xff0c;Java实习中…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有错误的地方&#xff0c;恳请大家指正&a…

水库大坝安全监测预警系统的重要作用

水库大坝建造在地质构造复杂、岩土特性不均匀的地基上&#xff0c;在各种荷载的作用和自然因素的影响下&#xff0c;其工作性态和安全状况随时都在变化。如果出现异常&#xff0c;又不被及时发现&#xff0c;其后果不堪设想。全天候实时监测&#xff0c;实时掌握水库水位、雨情…

基于JuiceFS 的低成本 Elasticsearch 云上备份存储

杭州火石创造是国内专注于产业大数据的数据智能服务商&#xff0c;为了解决数据存储及高效服务客户需求&#xff0c;选择了 Elasticsearch 搜索引擎进行云上存储。基于性能和成本的考虑&#xff0c;在阿里云选择用本地 SSD ECS 机型自建集群。但由于是自建集群&#xff0c;如何…

uniapp Android如何打开常用系统设置页面?

uniapp Android 如何打开常用系统设置页面&#xff1f; 在使用App过程时&#xff0c;有时候会对一些权限获取&#xff0c;比如打开蓝牙、打开通知栏通知等设置&#xff0c;我们如何快速跳转到需要的设置页面&#xff1f; 文章目录 uniapp Android 如何打开常用系统设置页面&…

μC/OS-II---消息队列管理2(os_q.c)

目录 消息队列的主要优点消息队列和消息邮箱消息队列相关操作向消息队列发送消息(FIFO)向消息队列发送消息(LIFO)向消息队列发送消息(扩展&#xff09;消息队列获取/无等待清空消息队列消息队列信息获取消息队列中断等待 消息队列的主要优点 消息队列的主要优点是解耦和异步通…

rocketmq5.X 单机搭建 虚拟机搭建rocketmq5.1.4 搭建最新版本mq rocketmq5.1.4版本单体搭建 rocketmq(一)

1. 官网下载地址&#xff1a; 下载 | RocketMQ 2. 配置环境&#xff1a; 我是在/etc/profile.d 新建了一个rocketmq_env.sh 配置了jdk, maven, 以及mq. mq文件下载的 配置完之后&#xff0c;刷新环境source /etc/profile 3. 配置rocket mq 的jvm配置&#xff0c;就是两个启…

Docker Compose详细教程(从入门到放弃)

对于现代应用来说&#xff0c;大多都是通过很多的微服务互相协同组成的一个完整应用。例如&#xff0c; 订单管理、用户管理、品类管理、缓存服务、数据库服务等&#xff0c;它们构成了一个电商平台的应 用。而部署和管理大量的服务容器是一件非常繁琐的事情。而 Docker Compos…

基于安卓android微信小程序的装修家装小程序

项目介绍 巧匠家装小程序的设计主要是对系统所要实现的功能进行详细考虑&#xff0c;确定所要实现的功能后进行界面的设计&#xff0c;在这中间还要考虑如何可以更好的将功能及页面进行很好的结合&#xff0c;方便用户可以很容易明了的找到自己所需要的信息&#xff0c;还有系…

PLC电力载波通讯,一种新的IoT通讯技术

前言: PLC-IoT 是 PLC 技术应用在物联场景的创新实践,有效解决电力线路信号干扰、衰减问题,支持 IP 化通信能力,使能终端设备智能化,构建智慧边缘联接。PLC让传统IoT有了更多的连接可能: 电力线通信技术适用的场景包括电力配用电网络、城市智慧路灯、交通路口信号灯、园…

Python代码运行速度提升技巧!Python远比你想象中的快~

文章目录 前言一、使用内置函数二、字符串连接 VS join()三、创建列表和字典的方式四、使用 f-Strings五、使用Comprehensions六、附录- Python中的内置函数总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项…

基于SSM的药店药品销售系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

IDEA导入jar包

通过maven导入本地包 mvn install:install-file -DfileD:\WebProject\ERP\zhixing-heyue-erp-server\zxhy-service-api\src\main\java\com\zxhy\service\api\invoice\baiwang\lib\com_baiwang_bop_sdk_outer_3_4_393.jar -DgroupIdcom.baiwang -DartifactIdbaiwang.open -Dver…

C语言每日一题(29)合并两个有序链表

力扣网 21合并两个有序链表 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 思路分析 最基本的一种思路就是&#xff0c;遍历两个链表&#xff0c;将对应结点的值进行比较&#xff0c;题目要求是要升序排…

错误:ERROR:torch.distributed.elastic.multiprocessing.api:failed

在多卡运行时&#xff0c;会出现错误&#xff08;ERROR:torch.distributed.elastic.multiprocessing.api:failed&#xff09;&#xff0c;但是单卡运行并不会报错&#xff0c;通常在反向梯度传播时多卡梯度不同步。但我是在多卡处理数据进行tokenizer阶段报错&#xff0c;这竟然…

ZYNQ实验--Petalinux 安装

一、Petalinux 简介 PetaLinux是一个由Xilinx公司提供的嵌入式Linux开发工具套件&#xff0c;专门用于在Xilinx器件上构建、定制和部署嵌入式Linux系统。这个工具套件旨在简化嵌入式系统的开发过程&#xff0c;特别是针对使用Xilinx的可编程逻辑器件的系统。PetaLinux是Xilinx …

基于SpringBoot的教务管理系统

基于SpringBoot的教务管理系统 教务管理系统开发技术功能模块代码结构运行截图数据库源码获取 教务管理系统 欢迎访问此博客&#xff0c;是否为自己的毕业设计而担忧呢&#xff1f;是否感觉自己的时间不够做毕业设计呢&#xff1f;那你不妨看一下下面的文章&#xff01; 开发…