数学建模学习(1)遗传算法
一、简介
遗传算法(Genetic Algorithm, GA)是一种用于解决优化和搜索问题的进化算法。它基于自然选择和遗传学原理,通过模拟生物进化过程来寻找最优解。
以下是遗传算法的主要步骤和概念:
初始化种群(Initialization):随机生成一组可能的解(个体),形成初始种群。
适应度评估(Fitness Evaluation):根据适应度函数评估每个个体的质量,即其解问题的效果。
选择(Selection):根据适应度选择较优的个体进行繁殖。常见的选择方法包括轮盘赌选择、锦标赛选择和排序选择。
交叉(Crossover):将两个个体的部分基因组合生成新的个体(子代)。交叉操作模拟生物的基因重组,常见的交叉方法有单点交叉和多点交叉。
变异(Mutation):随机改变个体的部分基因,以增加种群的多样性,防止算法陷入局部最优。变异操作模拟生物的基因突变。
替换(Replacement):将子代个体加入种群中,通常会替换掉适应度较低的个体,以保持种群规模恒定。
终止条件(Termination Condition):当达到预定的终止条件时(如运行一定代数、适应度达到某个阈值),算法停止,输出最优解。
遗传算法通常用于解决以下类型的问题:
- 优化问题,例如函数优化、路径优化(如旅行商问题)。
- 搜索问题,例如求解数独、密码破解。
- 机器学习中的参数优化,例如神经网络权重优化。
优点
- 遗传算法具有全局搜索能力,能够在较大的搜索空间中找到全局最优解。
- 适用于复杂的、多维的、非线性的优化问题。
- 不依赖于问题的具体数学性质,可以处理各种类型的目标函数和约束条件。
缺点
- 计算代价较高,尤其是适应度评估过程可能耗时。
- 需要精心设计适应度函数、选择方法、交叉和变异操作,才能获得好的效果。
- 对于某些问题,可能会收敛到局部最优解,而非全局最优解。
二、算法介绍
(1)适应度函数

(2)轮盘赌选择

(3)锦标赛选择

(4)排序选择

(5)单点交叉


应用场景
单点交叉适用于问题规模较小或基因序列较短的情况。
对于复杂问题或基因序列较长的情况,可以考虑多点交叉或均匀交叉等更复杂的交叉方法,以提高解的多样性和质量。
(6) 多点交叉


(7)均匀交叉


(8)变异
通常设置较低的变异率(如 0.1% 到 1%)
三、遗传算法解TSP
import copy
import random
import math
import numpy as np
import matplotlib.pyplot as pltN = 20000 # 最大迭代次数
city_num = 31
pop_size = 100 # 种群数量
pc = 0.8 # 交叉概率
pm = 0.05 # 变异概率# 城市坐标
city_position = [(1304, 2312), (3639, 1315), (4177, 2244), (3712, 1399), (3488, 1535),(3326, 1556), (3238, 1229), (4196, 1004), (4312, 790), (4380, 570),(3007, 1970), (2562, 1756), (2788, 1491), (2381, 1676), (1332, 695),(3715, 1678), (3918, 2179), (4061, 2370), (3780, 2212), (3676, 2578),(4029, 2838), (4263, 2931), (3429, 1908), (3507, 2367), (3394, 2643),(3439, 3201), (2935, 3240), (3140, 3550), (2545, 2357), (2778, 2826), (2370, 2975)]# 距离矩阵,城市之间的距离
dis = np.zeros((31, 31))
for i in range(31):for j in range(31):if i != j:dis[i][j] = ((city_position[i][0] - city_position[j][0]) ** 2 + (city_position[i][1] - city_position[j][1]) ** 2) ** 0.5# 初始化种群并去重
def init(pop_size, city_num):population = []while len(population) < pop_size:temp = random.sample(range(city_num), city_num)if temp not in population:population.append((temp))return population# 适应度函数
def fitness(population, dis):fitness = []for i in range(len(population)):distance = 0for j in range(city_num - 1):distance += dis[population[i][j]][population[i][j + 1]]distance += dis[population[i][-1]][population[i][0]]if distance == 0:f = float('inf')else:f = 1 / (distance ** 2)fitness.append(f)return fitness# 选择函数:轮盘赌选择
def select(population, fitness):index = random.randint(0, pop_size - 1)num = 0r = random.uniform(0, sum(fitness))for i in range(len(population)):num += fitness[i]if num >= r:index = ibreakreturn population[index]# 交叉函数
def cross(fa1, fa2):if random.random() < pc:chrom1 = fa1[:]chrom2 = fa2[:]cpoint1 = random.randint(0, city_num - 1)cpoint2 = random.randint(0, city_num - 1)if cpoint1 > cpoint2:temp = cpoint1cpoint1 = cpoint2cpoint2 = temptemp1 = []temp2 = []for i in range(cpoint1, len(chrom1)):temp1.append(chrom1[i])temp2.append(chrom2[i])for i in range(cpoint1, cpoint2 + 1):chrom1[i] = fa2[i]chrom2[i] = fa1[i]new_chrom1 = []new_chrom2 = []for i in range(cpoint2 + 1):new_chrom1.append(chrom1[i])new_chrom2.append(chrom2[i])new_chrom1.extend(temp1)new_chrom2.extend(temp2)ans1 = []ans2 = []for i in range(len(new_chrom1)):if new_chrom1[i] not in ans1:ans1.append(new_chrom1[i])for i in range(len(new_chrom2)):if new_chrom2[i] not in ans2:ans2.append(new_chrom2[i])return ans1, ans2else:return fa1[:], fa2[:]# 变异函数
def mutate(chrom):if random.random() < pm:mpoint1 = random.randint(0, city_num - 1)mpoint2 = random.randint(0, city_num - 1)temp = chrom[mpoint1]chrom[mpoint1] = chrom[mpoint2]chrom[mpoint2] = tempreturn chromdef show(lx, ly, fit_history):# 画出每代最好适应值的图像plt.plot(range(len(fit_history)), fit_history)plt.xlabel("Generation")plt.ylabel("Fitness")plt.show()# 画出最短路径大小的变化图a = []for i in range(len(fit_history)):a.append(math.sqrt(1 / fit_history[i]))plt.plot(range(len(a)), a)plt.xlabel("Generation")plt.ylabel("Best_path_size")plt.show()def best_show(x, y, Best_Fitness):# 定义两个子图fig, ax = plt.subplots(1, 2, figsize=(12, 5), facecolor='#ccddef')# 定义子图1标题ax[0].set_title("Best route")# 定义子图2标题ax[1].set_title("Best_Fitness Change Procession")# 画线ax[0].plot(x, y)# 画点(第一个子图)ax[0].scatter(x, y, color='r')# 画线(第二个子图)ax[1].plot(range(len(Best_Fitness)), [Best_Fitness[i] for i in range(len(Best_Fitness))])plt.show()# 主程序
if __name__ == '__main__':best_fit = 0.0ans = []best_path = []population = init(pop_size, city_num) # 初始化种群,pop_size:种群个数for i in range(N):fit = fitness(population, dis) # 计算适应度列表max_fit = max(fit) # 因为适应度是采用距离和的平方的倒数,故最大的适应度代表距离最小max_index = fit.index(max_fit) # 最大适应度的方案索引lx = []ly = []for j in population[max_index][:]:j = int(j) # 保证整数lx.append(city_position[j][0])ly.append(city_position[j][1])if max_fit > best_fit: # 假如路径更短best_fit = max_fit # 修正了这里的错别字ans = population[max_index][:]x = copy.copy(lx)y = copy.copy(ly)best_path.append(best_fit) # 记录适应度变化,为画图准备# 变异、交叉new_population = []n = 0while n < pop_size:p1 = select(population, fit)p2 = select(population, fit)while p2 == p1:p2 = select(population, fit)# 交叉chrom1, chrom2 = cross(p1, p2)# 变异chrom1 = mutate(chrom1)chrom2 = mutate(chrom2)new_population.append(chrom1)new_population.append(chrom2)n += 2population = new_populationprint("######################################################")print(f"第{i + 1}代的最优路径为:", ans)print("最短路径为:", (1 / best_fit) ** 0.5)show(lx,ly,best_path)x.append(x[0])y.append(y[0])best_show(x,y,best_path)
结果:
对比模拟退火算法的结果:
(以下是模拟退火算法的结果)

相关文章:
数学建模学习(1)遗传算法
一、简介 遗传算法(Genetic Algorithm, GA)是一种用于解决优化和搜索问题的进化算法。它基于自然选择和遗传学原理,通过模拟生物进化过程来寻找最优解。 以下是遗传算法的主要步骤和概念: 初始化种群(Initialization&a…...
NumPy冷知识66个
NumPy冷知识66个 多维切片: NumPy支持多维切片,可以通过指定多个索引来提取多维数组的子集。 复杂数支持: NumPy可以处理复数,提供了复数的基本运算和函数。 比特运算: NumPy支持比特运算,如与、或、异或等。 数据存储格式: NumPy可以将数…...
Wi-SUN无线通信技术 — 大规模分散式物联网应用首选
引言 在数字化浪潮的推动下,物联网(IoT)正逐渐渗透到我们生活的方方面面。Wi-SUN技术以其卓越的性能和广泛的应用前景,成为了大规模分散式物联网应用的首选。本文将深入探讨Wi-SUN技术的市场现状、核心优势、实际应用中的案例以及…...
在 Ubuntu Server 22.04 上安装 Docker 的详细步骤
在 Ubuntu Server 22.04 上安装 Docker 的详细步骤 本文档详细记录了在 Ubuntu Server 22.04 上安装 Docker 的完整过程,包括解决过程中遇到的问题。希望能对读者有所帮助。 安装过程,重点需要看官方文档。https://docs.docker.com/engine/install/ubu…...
前端使用 Konva 实现可视化设计器(18)- 素材嵌套 - 加载阶段
本章主要实现素材的嵌套(加载阶段)这意味着可以拖入画布的对象,不只是图片素材,还可以是嵌套的图片和图形。 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue 哟~ github源码 g…...
vue3 -layui项目-左侧导航菜单栏
1.创建目录结构 进入cmd,先cd到项目目录(项目vue3-project) cd vue3-project mkdir -p src\\views\\home\\components\\menubar 2.创建组件文件 3.编辑menu-item-content.vue <template><template v-if"item.icon"><lay-ic…...
Spring AOP(1)
目录 一、AOP 概述 什么是Spring AOP? 二、Spring AOP 快速入门 1、引入AOP依赖 2、编写AOP程序 三、Spring AOP 详解 1、Spring AOP的核心概念 (1)切点(Pointcut) (2)连接点ÿ…...
第1关 -- Linux 基础知识
闯关任务 完成SSH连接与端口映射并运行hello_world.py ssh -p 37367 rootssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyCheckingno可选任务 1 将Linux基础命令在开发机上完成一遍 可选任务 2 使用 VSCODE 远程连接开发机并创建一个conda环境 …...
tensorflow keras Model.fit returning: ValueError: Unrecognized data type
题意:TensorFlow Keras 的 Model.fit 方法返回了一个 ValueError,提示数据类型无法识别 问题背景: Im trying to train a keras model with 2 inputs: an image part thats a tf.data.Dataset and a nor mal part represented by a pd.DataF…...
虚拟机固定配置IP
在Hyper-V中,vEthernet (Default Switch) 是Hyper-V自带的默认虚拟交换机,它允许虚拟机直接连接到宿主机网络或外部网络。这个虚拟交换机可以通过Hyper-V管理器或PowerShell等工具进行管理和配置。以下是具体的操作步骤: 一、通过Hyper-V管理…...
【Pytorch实用教程】pytorch中random_split用法的详细介绍
在 PyTorch 中,torch.utils.data.random_split 是一个非常有用的函数,用于将数据集随机分割成多个子集。这在机器学习和深度学习中非常常见,特别是当你需要将数据集分割成训练集和测试集或验证集时。这里是 random_split 的详细用法介绍: 功能 random_split 用于随机地将…...
第二讲:NJ网络配置
Ethernet/IP网络拓扑结构 一. NJ EtherNet/IP 1、网络端口位置 NJ的CPU上面有两个RJ45的网络接口,其中一个是EtherNet/IP网络端口(另一个是EtherCAT的网络端口) 2、网络作用 如图所示,EtherNet/IP网络既可以做控制器与控制器之间的通信,也可以实现与上位机系统的对接通…...
pytorch中常见的模型3种组织方式 nn.Sequential(OrderedDict)
在nn.Sequential中嵌套OrderedDict组织网络,以对层进行命名 import torch import torch.nn as nn from collections import OrderedDictclass OrderedDictCNN(nn.Module):def __init__(self):super(OrderedDictCNN, self).__init__()# 使用 OrderedDict 定义网络层self.model …...
达梦数据库DM8-索引篇
目录 一、前景二、名词三、语法1、命令方式创建索引1.1 创建索引空间1.2.1 创建普通索引并指定索引数据空间1.2.2 另一种没验证,官方写法1.3 复合索引1.4 唯一索引1.5 位图索引1.6 函数索引 2、创建表时候创建索引3、可视化方式创建索引3.1 打开DM管理工具3.2 找到要…...
【中项】系统集成项目管理工程师-第4章 信息系统架构-4.5技术架构
前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…...
随机梯度下降 (Stochastic Gradient Descent, SGD)
SGD 是梯度下降法的一种变体。与批量梯度下降法不同,SGD 在每次迭代中仅使用一个样本(或一个小批量样本)的梯度来更新参数。它能更快地更新参数,并且可以更容易地跳出局部最优解。 原理 SGD 的基本思想是通过在每次迭代中使用不…...
TDengine 3.3.2.0 发布:新增 UDT 及 Oracle、SQL Server 数据接入
经过数月的开发和完善,TDengine 3.3.2.0 版本终于问世了。这一版本中既有针对开源社区的功能优化,也有从企业级用户需求出发做出的功能调整。在开源版本中,我们增强了系统的灵活性和兼容性;而在企业级版本中,新增了关键…...
Ubuntu 24.04 LTS 无法打开Chrome浏览器
解决办法: 删除本地配置文件,再次点击Chrome图标,即可打开。 rm ~/.config/google-chrome/ -rf ref: Google chrome not opening in Ubuntu 22.04 LTS - Ask Ubuntu...
linux中RocketMQ安装(单机版)及springboot中的使用
文章目录 一、安装1.1、下载RocketMQ1.2、将下载包上传到linux中,然后解压1.3、修改runserver.sh的jvm参数大小(根据自己服务器配置来修改)1.4、启动mqnamesrv (类似于注册中心)1.5、修改runbroker.sh的jvm参数大小&am…...
亚信安全终端一体化解决方案入选应用创新典型案例
近日,由工业和信息化部信息中心主办的2024信息技术应用创新发展大会暨解决方案应用推广大会成功落幕,会上集中发布了一系列技术水平先进、应用效果突出、产业带动性强的信息技术创新工作成果。其中,亚信安全“终端一体化安全运营解决方案”在…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
