[基因遗传算法]进阶之三:sko.GA的实践TSP

news2024/12/23 14:25:41

参考资料:《VRP问题分类》

相关文章:
《[基因遗传算法]原理思想和python代码的结合理解之(一) :单变量》
《[基因遗传算法]进阶之二:最优规划问题–多种编码方式+多变量》


文章目录

    • 一. GA的用法
      • 1.1 help(sko.GA)
      • 1.2 目标函数的书写
        • A. 单变量的书写
        • B. 多变量的书写
        • C. 变量的范围
      • 1.3 (不)等式约束的书写
    • 二、实践TSP
      • A. 读取城市坐标,获得相关信息
      • B.定义目标函数
      • C . 执行`GA_TSP`算法,输出结果

一. GA的用法

1.1 help(sko.GA)

GA(func, n_dim, size_pop=50, max_iter=200, prob_mut=0.001, lb=-1, ub=1, constraint_eq=(), 
constraint_ueq=(), precision=1e-07, early_stop=None)
 |  
 |  genetic algorithm
 |  
 |  Parameters
 |  ----------------
 |  func : function
 |      The func you want to do optimal 优化的目标函数
 |  n_dim : int
 |      number of variables of func目标函数的变量
 |  lb : array_like
 |      The lower bound of every variables of func每个变量的下限
 |  ub : array_like
 |      The upper bound of every variables of func每个变量的上限
 |  constraint_eq : tuple,
 |      equal constraint 等式约束
 |  constraint_ueq : tuple,
 |      unequal constraint不等式约束
 |  precision : array_like
 |      The precision of every variables of func 函数每个变量的精度
 |  size_pop : int
 |      Size of population种群数量
 |  max_iter : int
 |      Max of iter迭代次数
 |  prob_mut : float between 0 and 1
 |      Probability of mutation 突变概率

1.2 目标函数的书写

A. 单变量的书写

目标函数 y = 10 ⋅ s i n ( 5 x ) + 7 ⋅ c o s ( 4 x ) y=10 \cdot sin(5x)+7\cdot cos(4x) y=10sin(5x)+7cos(4x)

def aim(p):
    x= p[0]
    return -(10*np.sin(5*x)+7*np.cos(4*x))

B. 多变量的书写

目标函数 Z = 2 a + x 2 − a c o s 2 π x + y 2 − a c o s 2 π y Z=2a+x^2-acos2πx+y^2-acos2πy Z=2a+x2acos2πx+y2acos2πy求最小值为例. x ∈ [ 0 , 5 ] , y ∈ [ − 5 , 5 ] , a = 10 x \in [0,5], y\in [-5,5],a=10 x[0,5],y[5,5],a=10.

def aim(p):
    a = 10
    pi = np.pi
    x,y=p
    return 2 * a + x ** 2 - a * np.cos(2 * pi * x) + y ** 2 - a * np.cos(2 * 3.14 * y)

C. 变量的范围

x ∈ [ 0 , 5 ] , y ∈ [ − 5 , 10 ] x \in [0,5], y\in [-5,10] x[0,5],y[5,10]
lb:low lb=[0,-5]
ub: upub=[5,10]

1.3 (不)等式约束的书写

在这里插入图片描述

二、实践TSP

这里应用的是GA_TSP算法.与GA算法不同.主要区分在目标函数的意义.

  • GA的目标函数的变量是:(多个)自变量
  • GA_TSP的目标函数的变量:是某个路径(环)

参考资料:《Python调用scikit-opt工具箱中的遗传算法求解TSP问题》
本案例以31个城市为例,假定31个城市的位置坐标如表1所列。寻找出一条最短的遍历31个城市的路径.城市列表见参考链接.
在这里插入图片描述

# 导入常用库
import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
from scipy import spatial #计算空间的
from sko.GA import GA 
from sko.GA import GA_TSP
from time import perf_counter
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

参考《scipy.spatial 距离计算模块》

A. 读取城市坐标,获得相关信息

读取.xlsx数据

file_name = 'cities.xlsx'#31座城市坐标数据文件
df = pd.read_excel(file_name)
points_coordinate=df.values 

读取.csv.txt数据

file_name = 'data.csv'    #31座城市坐标数据文件
points_coordinate = np.loadtxt(file_name, delimiter=',')

在这里插入图片描述
计算城市间的欧式距离

num_points = points_coordinate.shape[0]
distance_matrix = spatial.distance.cdist(points_coordinate, points_coordinate, metric='euclidean')

☀️ 注意到,distance_matrix如果没有定义,则GA_TSP则执行的时候会报错.虽然GA_TSP中美有distance_matrix这个参数变量.

B.定义目标函数

即路线距离函数
路线routine举例为: 共31个城市的路线顺序.起点与终点的为同一个city.

def cal_total_distance(routine):
    '''计算总距离:输入路线,返回总距离.
    cal_total_distance(np.arange(num_points))
    '''
    num_points, = routine.shape
    return sum([distance_matrix[routine[i % num_points], routine[(i + 1) % num_points]] for i in range(num_points)])

C . 执行GA_TSP算法,输出结果

路径输出函数

def print_route(best_points):
    result_cur_best=[]
    for i in best_points:
        result_cur_best+=[i]
    for i in range(len(result_cur_best)):
        result_cur_best[i] += 1
    result_path = result_cur_best
    result_path.append(result_path[0])
    return result_path

执行算法

start=perf_counter()       #计时开始
# 执行遗传(GA)算法
ga_tsp = GA_TSP(func=cal_total_distance, n_dim=num_points, size_pop=300, max_iter=1000, prob_mut=1)   #调用工具箱

# 结果输出
best_points, best_distance = ga_tsp.run()
print("运行时间是: {:.5f}s".format(perf_counter()-start))   #计时结束
print("最优距离为:",best_distance)
print("最优路线:", print_route(best_points))

运行结果一:
在这里插入图片描述
缺city: 30
运行结果二:
在这里插入图片描述
缺city:0
运行结果三:
在这里插入图片描述
缺City:30
绘图展示

best_points_ = np.concatenate([best_points, [best_points[0]]])
#列表尾部添加起点城市
best_points_coordinate = points_coordinate[best_points_, :]#升维
fig1, ax1 = plt.subplots(1, 1)
ax1.set_title('Trajectories', loc='center')#轨迹图
line=ax1.plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1], marker='>', mec='r', mfc='w')
for i in range(num_points):
    plt.text(best_points_coordinate[:, 0][i] + 0.05, best_points_coordinate[:, 1][i] + 0.05, str(best_points[i]+1), color='red')
ax1.set_xlabel("横坐标")
ax1.set_ylabel("纵坐标")

fig2, ax2 = plt.subplots(1, 1)
ax2.set_title('Optimization process', loc='center')#优化过程
ax2.plot(ga_tsp.generation_best_Y)
ax2.set_xlabel("代数")
ax2.set_ylabel("最优值")
plt.show()

在这里插入图片描述在这里插入图片描述

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

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

相关文章

mysql中的B+树、索引跳跃扫描

普通索引 B树的叶子节点上记录的是聚簇索引(主键索引)的值。 联合索引 叶子节点中记录的是name,age两个字段以及主键id的值。 MySQL一定是遵循最左前缀匹配的,这句话在mysql8以前是正确的,没有任何毛病。但是在M…

(文章复现)7.计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度(MATLAB程序)

联系方式:2645521500 复现文章: 计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度——孙惠娟(电网技术—2020) 摘要: 为了促进多能源互补及能源低碳化,本文提出了计及电转气协同的含碳捕集与垃圾焚…

有手就会做,保姆级Jmeter分布式压测操作流程(图文并茂)

分布式压测原理 分布式压测操作 保证本机和执行机的JDK和Jmeter版本一致 配置Jmeter环境变量 配置Jmeter配置文件 上传每个执行机服务jmeter chmod -R 755 apache-jmeter-5.1.1/ 执行机配置写自己的ip 控制机配置所有执行机ip,把server.rmi.ssl.disable改成true 将本机也作…

Java-1208

JVM与Java体系结构 JVM整体结构(上图主要针对hotspot虚拟机) 类加载器: 将字节码文件加载进去,并不一定是java字节码文件,很多语言都会编译成字节码文件使用JVM 运行时数据区: 方法区和堆:使用了…

毕业设计 STM32单片机智能WiFi天气助手 - 物联网 单片机

文章目录0 前言1 设计内容2 软件设计3 关键代码4 最后0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不…

Go设计与实现--数组与切片

数组 初始化 Go语言数组的初始化是在编译期就已经执行好了。这个是初始化的代码&#xff1a; // NewArray returns a new fixed-length array Type. func NewArray(elem *Type, bound int64) *Type {if bound < 0 {base.Fatalf("NewArray: invalid bound %v", …

Security实现前后端分离

Security实现前后端分离 说明 ​ 上一篇和上上一篇我大致介绍了一下security基础使用和oauth2的一些流程&#xff0c;这里在深入了解一些相关的配置项。 ​ 首先我们在梳理一下相关概念&#xff0c;首先基本的security是负责用户认证这这一环节&#xff0c;总而言之就是用户…

PCB入门学习—原理图的绘制1(MCU部分)

目录 2.1 STM32F103VET6 MCU核心电路的绘制 学习目录 2.1 STM32F103VET6 MCU核心电路的绘制 总结&#xff1a;放置元件&#xff0c;连线&#xff0c;放置网络标号&#xff0c;更新序号。 主控放上去之后原理图图纸不太够&#xff1a;双击右边边缘&#xff0c;默认图纸大小是…

【Java小案例】从简到精完美判断年份是闰/平年和该年二月份有几天

目录前言问题描述思路分析解决方案方案一方案二方案三方案四结语前言 1、平年指阳历没有闰日或农历没有闰月的年份&#xff0c;闰年是公历中的名词&#xff0c;是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的&#xff0c;补上时间差的年份为闰年&a…

QA | SWCF2022 笔记:GNSS模拟赋能汽车HIL测试

2022年度SWCF卫星通信与仿真测试研讨会正在进行中&#xff0c;精彩演讲&#xff1a;GNSS模拟赋能汽车HIL测试&#xff0c;感谢大家的观看与支持&#xff01;收到一些粉丝的技术问题&#xff0c;我们汇总了热点问题并请讲师详细解答&#xff0c;在此整理分享给大家&#xff01; …

高通平台开发系列讲解(UART篇)高速串口代码流程

文章目录 一、初始化1.1、Registration with the SPS driver1.2、UART port registration二、Port open三、Port close沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要介绍高通平台高速串口代码流程。 一、初始化 初始化流程: msm_serial_hs_init() ->

数据传送指令MOV、XCHG

学习过程中要重点掌握对标志寄存器的影响 数据传送类指令&#xff08;不影响标志位&#xff09; 一&#xff1a;MOV指令 先要知道图片中这几个英文表示什么 立即数&#xff08;immediaate operand&#xff09; 寄存器&#xff08;register&#xff09; 内存&#xff08;…

WEB前端大作业HTML静态网页设计旅游景点区主题——三亚旅游网页设计

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

基于Java+Swing实现超级玛丽游戏

基于JavaSwing实现超级玛丽游戏一、系统介绍二、功能展示三、其他系统一、系统介绍 超级玛丽小游戏的JAVA程序&#xff0c;进入游戏后首先按空格键开始&#xff0c;利用方向键来控制的马里奥的移动&#xff0c;同时检测马里奥与场景中的障碍物和敌人的碰撞&#xff0c;并判断马…

JVM八股文,面试会被问到什么?都在这里啦 ~

目录 1、JVM内存划分 1.1、程序计数器&#xff08;Program Counter Register&#xff09; 1.2、方法区&#xff08;Method Area&#xff09; 1.3、本地方法栈&#xff08;Native Method Stacks&#xff09; 1.4、虚拟机栈&#xff08;JVM Stacks&#xff09; 1.5、Java堆…

溢出的文字省略号显示

溢出的文字省略号显示 1、单行文本溢出显示省略号 源代码 必须满足三个条件&#xff1a;white-space: nowrap; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; nowrap强制一行内显示文本(默认normal自动换行)&#xff0…

vscode跨语言调试

所谓“工欲善其事&#xff0c;必先利其器”&#xff0c;作为一个程序员&#xff0c;调试在项目开发过程中的重要性自然是不言而喻的。 最近项目中遇到的项目是由python和cpp完成的&#xff0c;python端会调用到cpp的库。由于做二次开发需要进行跨语言联调&#xff0c;所以在这…

QList与QVector遍历方法与性能比较

目录 一、 性能测试 二、 QList与QVector耗时对比分析 三、QList遍历方式对比分析 四、QVector遍历方式对比分析 一、 性能测试 最近使用opengl画点云数据时发现比较卡顿&#xff0c;原因是我使用了QList数据结构&#xff0c;后面改为QVector改善很多&#xff0c;速度提升1倍。…

什么是数学思维

什么是数学 数学 [英语&#xff1a;mathematics&#xff0c;源自古希腊语μάθημα&#xff08;mthēma&#xff09;&#xff1b;经常被缩写为math或maths]&#xff0c;是研究数量、结构、变化、空间以及信息等概念的一门学科。 数学 是人类对事物的抽象结构与模式进行严格…

大学生影视主题网页制作 HTML+CSS+JS仿360影视网站 dreamweaver电影HTML网站制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…