【算法】禁忌算法+TSP问题 python代码

news/2024/5/4 0:35:23/文章来源:https://blog.csdn.net/qq_51669241/article/details/129529728

目录

  • 一、禁忌算法的概念
  • 二、相关名词解释
    • 1、禁忌对象(Tabu Object,TO)
    • 2、禁忌表(Tabu List,TL)
    • 3、禁忌期限(Tabu Tenure,TT)
    • 4、藐视准则(Aspiration Criteria,AC)
    • 5、终止准则
  • 三、算法基本流程
  • 四、TSP问题
  • 主要步骤:
  • python代码

一、禁忌算法的概念

禁忌搜索是属于模拟人类智能的一种优化算法,它模仿了人类的记忆功能,在求解问题的过程中,采用了禁忌技术,对已经搜索过的局部最优解进行标记,并且在迭代中尽量避免重复相同的搜索(但不是完全杜绝),从而获得更广的搜索区间,有利于寻找到全局最优解。
在这里插入图片描述

二、相关名词解释

1、禁忌对象(Tabu Object,TO)

指禁忌表中被禁的那些变化元素。
例如在旅行商问题(TSP)中可以将交换的城市对作为禁忌对象,也可以将总路径长度作为禁忌对象。

2、禁忌表(Tabu List,TL)

用来存放(记忆)禁忌对象的表。它是禁忌搜索得以进行的基本前提。禁忌表本身是有容量限制的,它的大小对存放禁忌对象的个数有影响,会影响算法的性能。

3、禁忌期限(Tabu Tenure,TT)

也叫禁忌长度,指的是禁忌对象不能被选取的周期。
禁忌期限过短容易出现循环,跳不出局部最优。
紧急期限过长会造成计算时间过长。

4、藐视准则(Aspiration Criteria,AC)

也称为特赦规则。当所有的对象都被禁忌之后,可以让其中性能最好的被禁忌对象解禁,或者当某个对象解禁会带来目标值的很大改进时,也可以使用特赦规则。

在这里插入图片描述

5、终止准则

三种方法:

  1. 给定最大迭代步数。

  2. 设定某个对象的最大禁忌频率。

  3. 设定适配值的偏离幅度。

在这里插入图片描述

三、算法基本流程

Created with Raphaël 2.3.0开始初始化,随机生成一个解i,设置代数k=0,禁忌表H为空,最优解s = i满足终止条件?退出构造解i的邻域 A = N(i, H)从邻域A中找出适应值最好的解j,令i=j,并且更新Hf(i)<f(s)?s=ik=k+1yesnoyesno

四、TSP问题

已知一个旅行商问题为四城市(a,b,c,d)问题,城市间的距离如矩阵D所示,为方便起见,假设邻域映射定义为两个城市位置对换,而始点和终点城市都是a。请分析使用禁忌搜索算法求解该问题的前面三代的过程与主要步骤。

在这里插入图片描述

主要步骤:

在这里插入图片描述

python代码

1、导入包。

import time
import numpy as np
import random

2、设置禁忌算法的参数数值。
禁忌长度为2。

# m城市个数  best全局最优  tl初始禁忌长度
# time 迭代次数, spe特赦值
# tabu禁忌表
# best_way 最优解 now_way当前解
# dis两点距离
global m, best, tl
global time, spe
best = 4.0
m= 4
tl = 2
spe= 2
time = 100
tabu = [[0] * (m) for i in range(m)]
best_way =[0] * m
now_way = [0] * m
dis = [[0] * (m) for i in range(m)]

3、生成初始解。

def rand(g):vis = [0]*mfor i in range(m):vis[i] = 0;g[0] = 0  # 必定要从第一个城市a出发vis[0] = 1on = 1while on < m:te = random.randint(1, m - 1) # 随机选择一个城市if(vis[te] == 0):vis[te] = 1g[on] = teon += 1

4、计算解t的路线长度。

def get_value(t):ans = 0.0for i in range(1, m):ans += dis[t[i-1]][t[i]]ans += dis[t[i-1]][t[i]]return ans

5、将当前解复制到最优解数组。

def cop(a,b):for i in range(m):a[i] = b[i]

6、初始化禁忌表,计算初始解的路径值。

def init():global bestfor i in range(m):for j in range(m):tabu[i][j] = 0  #初始化禁忌表rand(now_way)           #生成初始解作为当前解now = get_value(now_way)cop(best_way, now_way)best = now

7、禁忌算法。

def slove():global best, nowtemp = [0] * m       # 中间变量记录交换结果a = 0                # 记录交换城市下标b = 0ob_way = [0] * mcop(ob_way, now_way)ob_value = get_value(now_way)    # 暂存邻域最优解for i in range(1, m):            # 搜索所有邻域for j in range(1, m):if(i + j >= m): break;if(i == j): continue;cop(temp, now_way)temp[i], temp[i + j] = temp[i + j], temp[i]value = get_value(temp)if(value <= best and tabu[i][i + j] < spe): # 如果优于全局最优且禁忌长度小于特赦值cop(best_way, temp)best = valuea = ib = i + j         #更新全局最优且接受新解cop(ob_way, temp)ob_value = valueelif(tabu[i][i + j] == 0 and value < ob_value): # 如果优于邻域中的最优解则接受新解cop(ob_way, temp)ob_value = valuea = ib = i + jcop(now_way, ob_way)  # 更新当前解for i in range(m):    # 更新禁忌表for j in range(m):if(tabu[i][j] > 0):tabu[i][j] -= 1tabu[a][b] = tl  #重置a,b两个交换城市的禁忌值

8、主函数:

if __name__ == '__main__':dis = np.array([[0, 1, 0.5, 1],[1, 0, 1, 1],[1.5, 5, 0, 1],[1, 1, 1, 0]])init()                                # 数据初始化for i in range(time):                 # 控制迭代次数slove()print("路线总长度: ", round(best,3))   # 打印最优解距离保留三位小数print("具体路线: ", best_way)

9、运行结果:
在这里插入图片描述

END

在这里插入图片描述

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

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

相关文章

第19届高级数据挖掘与应用国际会议(ADMA‘23)

主页: https://adma2023.uqcloud.net/. 我们非常荣幸地介绍第19届高级数据挖掘与应用国际会议&#xff08;ADMA’23&#xff09;。2023年标志着国际高级数据挖掘与应用会议&#xff08;ADMA’23&#xff09;的19周年&#xff0c;会议将于2023年8月21日至23日在中国沈阳举行。我…

多态(C++)

多态多态的概念概念多态的定义及实现多态的构成条件虚函数虚函数的重写虚函数重写的两个例外C11override和final重载&#xff0c;覆盖&#xff0c;隐藏的对比抽象类概念接口继承和实现继承多态的原理虚函数表多态的原理动态绑定与静态绑定单继承和多继承关系中的虚函数表单继承…

QT完善登录界面Ⅱ

功能添加&#xff1a; 1.弹窗提示 2.页面跳转 信号的发送&#xff0c;槽函数执行 form.hpublic slots:void mySlot(); //槽函数widget.h signals:void mySignal(QString e); //自定义属于自己的信号函数//widget.cpp #include "widget.h" #include "ui_widge…

Java初阶 ( String 类)

文章目录一、String 类的基础概念1.1 Java 中的字符串1.2 字符串的构造二、String 类的进阶概念2.1 求字符串的长度2.2 isEmpty()2.3 字符串的比较2.4 字符串的查找2.5 字符串的转换2.6 字符串的替换2.6 字符串的拆分2.7 字符串的截取2.8 去掉字符串的左右空白字符2.9 StringBu…

Leetcode.226 翻转二叉树

题目链接 Leetcode.226 翻转二叉树 easy 题目描述 给你一棵二叉树的根节点 root&#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;r…

C++对象模型与this指针

一、成员变量与成员函数分开存储 1、在C中&#xff0c;类内的成员变量和成员函数分开存储 首先&#xff0c;对于一个空对象&#xff0c;占用内存空间为1 class person {};void test01() {person p;cout << sizeof(p) << endl; } 因为C编译器给每个空对象分配1个字…

【juc】wait和notify原理

目录一、monitor锁结构图二、说明一、monitor锁结构图 二、说明 1.线程1一开始持有对象A的monitor锁&#xff0c;即monitor中的owner指向线程1 2.线程1在执行的过程中发现条件a不满足执行不下去了&#xff0c;此时线程1可以调用wait方法&#xff0c;那么线程1就进入waitset进行…

【RabbitMQ高级篇】消息可靠性问题(1)

目录 1.消息可靠性 1.1.生产者消息确认 1.1.1.修改配置 1.1.2.定义Return回调 1.1.3.定义ConfirmCallback 1.2.消息持久化 1.2.1.交换机持久化 1.2.2.队列持久化 1.2.3.消息持久化 1.3.消费者消息确认 1.3.1.演示none模式 1.3.2.演示auto模式 1.4.消费失败重试机制…

.net C#反编译及脱壳常用工具--小结

1、Reflector --微软自家工具--推荐 Reflector是最为流行的.Net反编译工具。Reflector是由微软员工Lutz Roeder编写的免费程序。Reflector的出现使NET程序员眼前豁然开朗&#xff0c;因为这个免费工具可以将NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转…

五、页面切割技术,实现工作台

页面切割技术 1.<frameset>和<frame> <frameset>:用来切割页面 <frameset cols"20%,60%,20%"> 竖着把窗口切三部分 <frameset rows"20%,60%,20%"> 横着把窗口切三部分 <frame>&#xff1a;用来显示页面 <frame …

三星公司因ChatGPT造成数据泄露?

作者丨黑蛋 ChatGPT大家最近应该都听过很多&#xff0c;关于各种ChatGPT消息铺天盖地&#xff0c;将会取代大部分人工&#xff0c;ChatGPT代替创作&#xff0c;绘画&#xff0c;很多公司因此裁员等消息多不胜数&#xff0c;甚至短短几个月&#xff0c;ChatGPT升级版ChatGPT4就…

无需服务器免费上线你的静态网页

无需服务器免费上线你的静态网页:https://s.qiniu.com/bmaYJf

Keil 5 安装教程及简单使用【嵌入式系统】

Keil 5 安装教程【嵌入式系统】前言推荐说明keil5安装教程第一阶段&#xff1a;安装mdk第二阶段&#xff1a;激活mdk第三阶段&#xff1a;安装STM32芯片包第四阶段&#xff1a;安装C51单片机第五阶段&#xff1a;激活C51单片机keil 5的简单使用1建立新工程2创建新文件3.生成HEX…

华硕 ASUS-PRIME-B560M-A Intel Core i5-11400黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板ASUS-PRIME-B560M-A 处理器Intel Core i5-11400已驱动 内存16GB DDR4 3200 Mhz已驱动 硬盘Western Digital Black SN750 500GB已驱动 显卡SAPPH…

社区团购是什么?打破传统消费模式的新选择

社区团购作为一种新兴的消费模式&#xff0c;已经成为了越来越多人的选择。在社区团购中&#xff0c;商家可以通过团购的方式向消费者提供优惠的价格和服务&#xff0c;同时也可以借助社区团购来扩大销售渠道和提高品牌知名度。本文将以一家小型便利店的社区团购为例&#xff0…

艾瑞巴蒂看过来!OSSChat 上线:融合 CVP,试用通道已开放

还在纠结于反复查找开源项目的技术文档&#xff1f; 团队常因频繁搜索开源项目主页导致效率低下&#xff1f; 每天都要问一遍【开源项目中那些“小白问题”究竟有没有更快的解决方法&#xff1f;】 对此&#xff0c;只想对你说&#xff1a;赶紧试试 OSSChat&#xff01;赶紧试…

灵动MM32 MindSPIN系列MCU —— 无刷电机驱动的得力伙伴

无论是在工业应用&#xff0c;还是智能家居和物联网应用上&#xff0c;提高效率和节能减碳一直为其主轴诉求&#xff0c;而有着兼顾于高效与节能特色的直流无刷电机&#xff0c;正是符合此应用的主流。 灵动微电子MindSPIN系列MCU产品就是针对直流无刷电机驱动所量身打造的。由…

Leetcode.112 路径总和

题目链接 Leetcode.112 路径总和 easy 题目描述 给你二叉树的根节点 root和一个表示目标和的整数 targetSum。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum。如果存在&#xff0c;返回 true&#xff1b;否则&#xf…

自学编程的5大误区,早知道早避坑,过来人的宝贵经验

前言 有的人自学很快&#xff0c;几乎一个多月就能掌握一门技术&#xff0c;而有的人苦苦坚持&#xff0c;最后还是半途而废&#xff0c;很大的原因就在于在学习的时候掉进了一些误区没能走出来。 今天我们就来讲讲自学编程常见的5大误区&#xff0c;避开这些误区我们定能在自…

美团全国各配送站机房配备深圳钡铼技术工业物联网监测终端S270,实现远程数据监测

美团集团与钡铼技术&#xff0c;日前签约美团旗下全国各配送站机房监测项目。深圳钡铼技术为美团每家配送站机房配备工业物联网数据监测终端S270&#xff0c;接入美团系统&#xff0c;助力美团集团实现物联网升级。实现远程采集仓库机房水浸、温湿度、烟感、停电报警等数据&…