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

参考资料:《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 = 10pi = np.pix,y=preturn 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.shapereturn 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] += 1result_path = result_cur_bestresult_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.rhkb.cn/news/53751.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python计算BMI——如何快速方便地计算身体质量指数

Python计算BMI —— 如何快速方便地计算身体质量指数 身体质量指数(BMI)是一种常用的计算方法,用于衡量人体体重和身高的比例。这个算法在健康行业中非常受欢迎,因为它简单而且可以快速得出结果。在Python中,我们可以…

干货第一弹!多组学联合分析之代谢组FAQ

代谢组是对生物体内代谢产物全谱分析的一种研究手段,代谢产物包括核酸、蛋白质、脂类生物大分子以及其他小分子物质,目前主要是检测1000Da以下的物质。代谢组研究具有高通量的检测能力、高灵敏度和准确度、非侵入性、非破坏性、全面性、数据资源整合等特…

组学数据上传(五):代谢组学数据

继扩增子、转录组、蛋白组、基因组数据上传教程发布后,组学数据上传教程最后一弹--代谢组数据上传教程来罗,有需要的一定要点赞加收藏!后续上传数据遇到问题可以私聊小编!接下来我们来了解下代谢组学常用数据库MetaboLights以及如…

Python案例3—计算基础代谢率V_2.0

大家好,我是白菜胡萝丸子 人生苦短,Python当歌 项目导入 版本2.0:在版本1.0的基础上改造程序,根据用户的输入计算BMR,将BMR计算封装到函数并实现持续运行,让用户选择退出 项目分析—理清思路 分析问题:分…

Python案例3—计算基础代谢率V_3.0

大家好,我是白菜胡萝丸子 人生苦短,Python当歌 项目导入 版本3.0:在版本2.0的基础上改造程序,BMR值的输出要带单位,用户能否将数值在一行输入 项目分析—理清思路 分析问题:分析问题的计算部分明确问题&…

Python案例3—计算基础代谢率V_1.0

大家好,我是白菜胡萝丸子 人生苦短,Python当歌 项目导入 基础代谢率( Basal Metabolic Rate , BMR )是指人体在清醒而又极端安静的状态下,不受肌肉活动、环境温度、食物及精神紧张等影响时的能量代谢率。即基本的生理活动(即血液循环、呼吸及恒定的体温…

计算消耗卡路里C语言程序,人体基础代谢率计算公式,热量表,运动消耗热量值...

原标题:人体基础代谢率计算公式,热量表,运动消耗热量值 基础代谢率大概的计算公式: 女性:655 (9.6 x 体重) (1.7 x 身高) - (4.7X年龄) (体重kg 身高cm) 男性:66 (13.7 x 体重) (5.0 x 身高) - (6.8x年…

C语言底层逻辑剖析函数篇(其三),函数递归与迭代超详解,斐波那契数列递归经典例题,汉诺塔问题,青蛙跳台阶

这里写目录标题 C语言底层逻辑剖析函数篇(其三),函数递归与迭代超详解,递归经典例题斐波那契数列,汉诺塔问题,青蛙跳台阶开篇语函数递归递归的两个必要条件递归案例1递归案例2递归和迭代递归经典例题——斐…

深入理解函数递归(汉诺塔问题详解)

汉诺塔问题 汉诺塔问题描述算法步骤三阶汉诺塔为例 函数递归什么是递归递归的两个必要条件 解决方法代码演示 汉诺塔问题描述 有一种被称为汉诺塔(Hanoi)的游戏,该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺…

浅谈汉诺塔问题,以及对其递归的分析

标题 浅谈汉诺塔问题,以及对其递归的分析 首先谈谈汉诺塔这个问题,这个问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个…

逻辑训练--经典汉诺塔问题(C和JAVA递归实现)

一.汉诺塔问题 1.汉诺塔问题的来源 源自古印度的汉诺塔游戏,具体相传来源,可自行搜索 2.汉诺塔问题的意义 有人觉得,汉诺塔是一个非常无聊的问题,只有一个盘子的时候,直接移动就完成了,两个盘子的时候也…

程序员的数学课15 递归:如何计算汉诺塔问题的移动步数?

递归是重要的程序开发思想,比如程序源代码缩进、树形数据结构、XML 语法、快速排序法等都有递归的影子。 那么,递归思维的本质到底是什么呢?递归的理念看似隐讳,实则非常清晰明了。 为了让你由浅入深地理解它,这一讲…

程序员的底层思维:逻辑思维

更多关于思维能力的内容,尽在我的新书《程序员必备的思维能力》 “你讲话要有逻辑!” “你这逻辑不对!” “你的底层逻辑是什么?” “说说你的逻辑思维能力体现在哪儿?” 在日常交流中,我们会频繁的使用…

《经典递归问题:汉罗塔》

🌠作者:TheMythWS. 🎆专栏:《JavaSE》 🎇座右铭:不走心的努力都是在敷衍自己,让自己所做的选择,熠熠发光。 目录 ✨汉罗塔的介绍 图解游戏​ ✨N层汉罗塔需移动的次数 ✨汉罗塔的…

用类比方式学习编程中函数递归(个人理解仅供参考)(内含汉诺塔问题的求解)

目录 1.前言 2.递归的数学模型 3.相关的c语法 4.将递归的数学模型写成编程语言 5.利用类比方法将实际问题的代码写成函数递归的形式 例1: 例2: 6.汉诺塔问题的求解 1.前言 本人在学习函数递归编程方法的过程中,发现用类比的方式学习递归法可帮助我们在各种编…

我想,有间花房

你带我走进你的花房,我无法逃脱花的清香,我不知不觉忘记了方向,你说我世上最坚强,我说你世上最善良,你不知不觉和花儿一样 也许每一位 爱花的姑娘,都想有一间属于自己 的花 房 ,在悠闲的午后&am…

花房集团CEO于丹内部信:上市即暴富年代已一去不复返

雷递网 乐天 12月12日 花椒母公司花房集团(股票代码为:“03611”)今日在港交所上市,发行价为2.8港元,募资净额为7240万港元。 花房集团开盘价为3.29港元,较发行价上涨17.5%;截至目前&#xff0c…

花房集团上市:市值超30亿港元 周鸿祎连收两个香港IPO

雷递网 雷建平 12月12日 花椒母公司花房集团(股票代码为:“03611”)今日在港交所上市,发行价为2.8港元,募资净额为7240万港元。 花房集团开盘价为3.29港元,较发行价上涨17.5%;截至目前&#xff…

花房集团上市,走向元宇宙新征程

12月12日,花房集团在港交所成功上市,首日便受到追捧,当日最高涨幅达28.75%。 继360、360数科、鲁大师后,这是“红衣教主”周鸿祎收获的第四个IPO。 花房集团作为直播界元老之一,两年内三次申请IPO,终于在…

花房集团:直播老将终赴IPO

寒冬之下,花房集团如何破局? 12月12日,直播界“元老”花房集团(下称“花房”,03611.HK)正式挂牌港交所。 花房此次IPO发行价为2.8港元/股,募资净额为7240万港元,开盘价为3.29港元/…