使用Python实现遗传算法_guofei9987的博客-程序员宅基地

技术标签: TSP  算法  最优化  python  遗传算法  机器学习  最短路径  

我们使用scikit-opt工具箱来实现遗传算法:https://github.com/guofei9987/scikit-opt

下载后,我们只需要其中的ga.py文件

首先,定义一个目标函数

def demo_func2(p):
    x, y, z = p
    return -(x ** 2 + y ** 2 + z ** 2)

我们想用遗传算法找出目标函数的最大值,这样做:

func是你的目标函数
lb是每个变量搜索的最小界
ub是每个变量搜索区域的最大界

general_best,func_general_best,FitV_history=ga.ga(func=demo_func2,  lb=[-1, -10, -5], ub=[2, 10, 2])
print('best_x:',general_best)
print('best_y:',func_general_best)

ga.plot_FitV(FitV_history)

在这里插入图片描述

TSP问题(Travelling Salesman Problem, 旅行商问题)

定义你的目标函数
先读入城市坐标和城市间距离(这里用随机方法生成,以作为demo)

import numpy as np

num_points = 8

points = range(num_points)
points_coordinate = np.random.rand(num_points, 2)
distance_matrix = np.zeros(shape=(num_points, num_points))
for i in range(num_points):
    for j in range(num_points):
        distance_matrix[i][j] = np.linalg.norm(points_coordinate[i] - points_coordinate[j], ord=2)
print('distance_matrix is: \n', distance_matrix)


def cal_total_distance(points):
    num_points, = points.shape
    total_distance = 0
    for i in range(num_points - 1):
        total_distance += distance_matrix[points[i], points[i + 1]]
    total_distance += distance_matrix[points[i + 1], points[0]]
    return total_distance

使用遗传算法

from GA import GA_TSP
ga_tsp = GA_TSP(func=cal_total_distance, points=points, pop=50, max_iter=200, Pm=0.001)
best_points, best_distance = ga_tsp.fit()

画出结果

fig, ax = plt.subplots(1, 1)
best_points_ = np.concatenate([best_points, [best_points[0]]])
best_points_coordinate = points_coordinate[best_points_, :]
ax.plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1],'o-r')
plt.show()

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/guofei9987/article/details/78730896

智能推荐

谈谈并行、并发或多线程_weixin_30879833的博客-程序员宅基地

1.CPU的发展趋势: 核心数目依旧会越来越多,根据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的PC桌面在2018年可能回到24核心。2.并发和并行的区别: 所有的并发处理都有排队等候,唤醒和执行这三个步骤,所以并发是宏观的观念,在微观上他们都是序列被处理的,只不过资源不会在某一个上被阻塞(一般是通过时间片轮转),所以在宏观上多个几乎同时到达的请求同时在被处...

run()方法和start()方法的区别_DCC_的博客-程序员宅基地

run()方法是Runnable接口中定义的,start()方法是Thread类定义的。 所有实现Runnable的接口的类都需要重写run()方法,run()方法是线程默认要执行的方法,有底层源码可知是绑定操作系统的,也是线程执行的入口。 start()方法是Thread类的默认执行入口,Thread又是实现Runnable接口的。要使线程Thread启动起来,需要通过start方...

git 撤回 (git版本回退处理)_小刘先生很努力的博客-程序员宅基地

项目中,我们会遇到 提交的项目代码有问题,需要执行撤回命令,但是发现撤回之后还是会运行失败。下边是一个好方法,亲测比 git reset --hard 版本号 有效。下面我们详细解说一下。当我们本地已经 执行了git commit -m “说明内容”,但还没有 进行 git push,如何回滚呢操作如下:1 执行 git status 命令 查看本地的commit 提交记录。2 在执行 git log 命令 查看commit 提交的版本号然后输入 q 就会退出。3 (3种方法)再去执行 git

Linux 用户(user)和用户组(group)管理概述_hdy007的博客-程序员宅基地

一、理解Linux的单用户多任务,多用户多任务概念; Linux 是一个多用户、多任务的操作系统;我们应该了解单用户多任务和多用户多任务的概念; 1、Linux 的单用户多任务; 单用户多任务;比如我们以beinan 登录系统,进入系统后,我要打开gedit 来写文档,但在写文档的过程中,我感觉少点音乐,所以又打开xmms 来点音乐;当然听点音乐还不行,MSN 还得打开,想知道几个弟兄现

CK-FR08-E02以太网工业读写头带Y型转接头在汽车装配线应用与接线安装说明_华翔天诚科技的博客-程序员宅基地

一、硬件描述 读卡器外部电气图示1 读卡器电缆接头--M12,A-coded,8 PIN公头2 通讯状态指示灯3 RFID状态指示灯4 外壳接地端二、LED指示灯表2-1指示灯状态说明 指示灯 颜色 状态 指示内容 通讯状态指示灯 红灯 常亮 ...

jquery设置video的宽度_jQ效果:jQuery和css自定义video播放控件_weixin_39629352的博客-程序员宅基地

下面介绍一下通过jquery和css自定义video播放控件。Html5 Video是现在html5最流行的功能之一,得到了大多数最新版本的浏览器支持.包括IE9,也是如此.不同的浏览器提供了不同的原生态浏览器视频空间.我们制作自定义视频控件为了在所有的浏览器中有一个相同的Html5视频控件而不受默认视频控件的控制.实际上,自定义视频控件并不困难.本文将告诉你如何用jQuery自定义视频控件,希望...

随便推点

在i3wm中修改默认终端_i3wm修改终端_ielsysa的博客-程序员宅基地

之前遇到了这个问题,在此记录一下在i3wm的配置文件中(一般位于~/.config/i3/)用vim或其他文本编辑器打开定位到#start a terminal那一行将下面的bindsym $mod+Return exec xxxx(这里的xxxx是原有终端)中的xxxx改为想要使用的终端模拟器既可比如:原来是这样:#start a terminalbindsym $mod+Ret...

Li‘s 影像组学视频学习笔记(32)-使用SimpleITK进行N4偏置场校正_有Li的博客-程序员宅基地

作者:北欧森林链接:https://www.jianshu.com/p/ae0f502dc146来源:简书,已获授权转载RadiomicsWorld.com “影像组学世界”论坛:影像组学世界/RadiomicsWorld 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频本节(32)主要介绍: 使用SimpleITK进行N4偏置场校正N4偏置场的定义和产生原因MR scans often display intensity non-uniformities due to va.

链表的基本操作_链表基本操作_Gunner的博客-程序员宅基地

链表的基本操作:内容包括链表的创建,增加、删除节点,链表的逆序、排序和销毁等。

【Python爬虫】利用Python的requests库进行一次比较全面的数据爬取操作)二_在爬取数据当中如何让一次性将数据爬取完成_囧魔王的博客-程序员宅基地

【Python爬虫】利用Python的requests库进行一次比较全面的数据爬取操作)二上篇文章我们已经对抓取某个url的html代码的方法进行了封装,下面我们就要用这个函数进行抓取工作了,首先还是要继续分析下网站通过主路由进入网站后我们可以发现我们先要继续深入的一些url地址,在进入每一个找到的url直到定位到我们需要爬去的位置上在开始解析:这些导航栏分别对应着不同的url的地址我们点...

oracle 数字类型行转列,oracle行转列_weixin_39595621的博客-程序员宅基地

一、PIVOT实例1. 建表建立一个销售情况表,其中,year字段表示年份,quarter字段表示季度,amount字段表示销售额。quarter字段分别用Q1, Q2, Q3, Q4表示一、二、三、四季度。CREATE TABLE SalesByQuarter( year INT, -- 年份quarter CHAR(2), -- 季度amount MONEY -- 总额)2. ...

黑马程序员——Java之IO流(二)_Meteor_Come的博客-程序员宅基地

-------------------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ---------------------一、File类File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前

推荐文章

热门文章

相关标签