import numpy as np
import matplotlib.pyplot as plt
import random as rd
"""
禁忌搜索算法步骤:
(1)初始化参数:
产生初始解s,并将禁忌表置为空
(2)根据邻域动作产生邻域解N(s),根据适应度值选出候选解。
(3)判断候选解是否满足特赦准则,
(3.1):如果满足,就将满足特赦准则的解作为当前解,用其对应的对象替换最早进入禁忌表中的对象,更新最优解
(3.2):如果不满足特赦准则,就接着判断候选解是否在禁忌表中:
(3.2.1) 有部分在禁忌表中
(3.2.1.1)在候选解中存在比最优方案还好的方案,那就找到候选集中最最优的那个解:
# 如果优此时的解于当前最好解,那么就不考虑其是否被禁忌,用这个最好的候选解来更新当前最好
# 如果不优于当前最好解,就从所有候选解中选出不在禁忌状态下的最好解作为新的当前解,然后将对应对象加入禁忌表
(3.2.1.2)在候选解中不存在比最优方案好的方案,
记录不在禁忌表中的候选解,从候选解集合中找到最优的那个解,然后与当前最优解比较,看是否更新当前解与最优解
(3.2.2) 候选解都不在禁忌表中,那么就将非禁忌的最佳候选解作为当前解,用该解对应的对象替换最早进入禁忌表中的对象
(4)满足终止准则,就输出最优解,如果不满足重复(2)(3)步
"""
# 自变量约束条件
MIN_VAL = [-5.0, -5.0]
MAX_VAL = [5.0, 5.0]
# Class definition
class TS():
def __init__(self, vcount=2, ccount=20, tabuL=25, iters=200, tabu_objs=10):
self.vcount = vcount # 自变量的个数
self.ccount = ccount # 候选解的个数
self.iters = iters # 最大迭代次数
self.tabu_objs = tabu_objs # 禁忌对象
self.tabu_list = [None] * self.tabu_objs # 禁忌表,存放禁忌对象,禁忌表长度10
self.tabu_len = tabuL # 禁忌长度
self.tabu_len_list = np.array([0] * self.tabu_objs) # 禁忌长度列表,对应于禁忌列表。
self.cur_solu = np.array([0.0] * self.vcount) # 当前解
self.best_solu = np.array([0.0] * self.vcount) # 最优解
self.trace = [] # 记录最优解的路径
def valuate(self, x):
# 目标/评价函数
value = 5 * np.cos(x[0] * x[1]) + x[0] * x[1] + x[1] ** 3
return value
# 更新禁忌表,这一部分是很重要的,对理解代码有着很核心的作用
# 禁忌表有两种操作:添加禁忌元素和删除禁忌元素
def update_Tabu(self, mode, index=None, solu=None):
indices = [] # 存储禁忌对象的禁忌期限为0的对象的索引
# 更新禁忌对象的禁忌期限
for i in range(len(self.tabu_len_list)): # 长度为10,
if self.tabu_len_list[i] != 0: # 每进行一次禁忌表更新操作,对应的禁忌对象的使用期限就-1,一直到0
self.tabu_len_list[i] -= 1
print("tabu_list", self.tabu_list)
print("tabu_len_list", self.tabu_len_list)
# 释放紧急对象
if mode == 'release':
self.sequence_Tabu(index)
# 向禁忌表中添加禁忌对象,添加到禁忌表的
elif mode == 'add':
tabuObj = self.valuate(solu) # 禁忌表对象是解的valuate值,
if self.tabu_list[0] == None:
#print("从后往前插入")
self.sequence_Tabu(0)
self.tabu_list[len(self.tabu_list) - 1] = tabuObj
# print("self.tabu_list[9]", self.tabu_list[9])
self.tabu_len_list[len(self.tabu_list) - 1] = self.tabu_len
for i in range(len(self.tabu_len_list)):
if self.tabu_len_list[i] == 0: # 如果禁忌对象的使用期限为0
# 就将此禁忌对象的索引加到indices中
indices.append(i)
print("禁忌对象的禁忌期限为0的对象的索引:", indices)
if len(indices) == 1: # 如果此时indices中只有一个禁忌对象,直接从禁忌表中删除即可
self.sequence_Tabu(indices[0])
elif len(indices) > 1: # 如果此时indices中有多个禁忌对象
# Part 1
maxindex = max(indices) # 找出索引值最大的
print("索引值最大的", maxindex)
self.sequence_Tabu(maxindex) # 然后从禁忌表中删除maxindex
print("从禁忌表中删除maxindex:", self.tabu_list)
# Part 2
for i in indices: # 遍历indices,里面存放的是禁忌期限为0的索引
if i != max(indices): # 如果禁忌对象不等于最大的那个禁忌对象
self.tabu_list[i] = None # 可以直接设置禁忌表中此禁忌对象为None
self.tabu_len_list[i] = 0 # 同时将此禁忌对象的禁忌期限设置为0
objs = []
objs1 = []
for obj in self.tabu_list[:maxindex]:
if obj != None:
objs.append(obj) # objs里存放的是禁忌表中不为None的禁忌对象
for obj in self.tabu_len_list[:maxindex]:
if obj != 0:
objs1.append(obj) # objs1里面存放的是禁忌表期限表中不为0的禁忌对象的使用期限
if objs != []: # 如果禁忌表中还存在禁忌对象,禁忌对象在禁忌表中往前移动一位
for i in range(len(objs)):
self.tabu_list[maxindex - i - 1] = objs[i]
self.tabu_len_list[maxindex - i - 1] = objs1[i]
for i in range(maxindex - len(objs)):
self.tabu_list[i] = None
self.tabu_len_list[i] = 0
else:
for i in range(maxindex):
self.tabu_list[i] = None
self.tabu_len_list[i] = 0
print("此时禁忌表的样子:", self.tabu_list)
print("此时禁忌表期限表的样子:", self.tabu_len_list)
def sequence_Tabu(self, index):
# 从禁忌表中释放禁忌对象
if index != len(self.tabu_list) - 1:
for i in range(len(self.tabu_list) - 1 - index):
self.tabu_list[index + i] = self.tabu_list[index + i + 1] # 使要删除的元素在禁忌表的最后一位
self.tabu_len_list[index + i] = self.tabu_len_list[index + i + 1]
self.tabu_list[len(self.tabu_list) - 1] = None # 将禁忌表的最后一位置为None,表示删除
self.tabu_len_list[len(self.tabu_list) - 1] = 0
#print("后移:", self.tabu_list)
#print("后移:", self.tabu_len_list)
def run(self):
#(1)初始化参数:产生初始解s --> cur_solu ,并将禁忌表置为空
for i in range(self.vcount):
# 产生初始解
self.cur_solu[i] = rd.uniform(-5, 5)
# 设置最优解
self.best_solu[i] = self.cur_solu[i]
print("初始解:", self.cur_solu) # 初始解: [1.30533424 0.72105434]
# 更新禁忌列表和禁忌对象的使用期限。
self.update_Tabu('add', solu=self.cur_solu)
counter = 0 # 记录迭代次数
while counter < self.iters: # 进入迭代循环
counter += 1 # 当完成一次迭代,就将次数加1
# (2)根据邻域动作产生邻域解N(s) --> candi_solu
candi_solu = np.zeros((self.ccount, self.vcount)) # 候选解集合:用来存放候选解
# 从当前解的邻域内选出一些候选解,加入候选解集合中
for i in range(self.ccount):
for j in
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip基于python的群体智能优化算法智能算法库源码(高分课设).zip 【备注】 项目多为高分毕设,评审平均分达到95分以上,都经过本地验证,运行OK后上传,可直接运行起来。 主要针对计算机相关专业的正在做毕设的学生和需要项目实战的Java、JavaScript、c#、游戏开发、小程序开发学习者、深度学习等专业方向。 也可作为课程设计、期末大作业。包含:项目源码、数据库、项目说明等,该项目可以直接作为毕设、课程设计使用。 也可以用来学习参考借鉴!
资源推荐
资源详情
资源评论
收起资源包目录
基于python的群体智能优化算法智能算法库源码(高分课设).zip (16个子文件)
项目介绍.md 305B
code
B07_AFS.py 11KB
B04_SA.py 4KB
B12_ABC.py 8KB
B06_IA.py 9KB
B03_PSO.py 5KB
B19_BFOA.py 8KB
B02_ACO.py 6KB
B05_TS.py 18KB
nsga-II 10KB
B15_FA.py 5KB
B01_GA.py 9KB
项目介绍.md 305B
ObjFunction.py 504B
B07_AFSIndividual.py 691B
B14_CS.py 4KB
共 16 条
- 1
资源评论
Make程序设计
- 粉丝: 5627
- 资源: 3567
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 技术面试最后反问面试官的话 校招面试非技术问题有哪些 非技术问题如何回答.png
- NB-IOT-BC26全网通模块Altium+ CADENCE +PADS三种格式(原理图SCH+PCB封装库)文件.zip
- 基于微信小程序开发的校园失物招领系统源码毕业设计(优质项目源码).zip
- 词向量是一种将自然语言中的单词转换为数值向量的技术,它能够捕捉词义和上下文信息
- nmap与masscan的简单使用
- MyBatis动态SQL.pdf
- 基于stm32单片机protues仿真的温湿度控制系统设计(仿真图、源代码)
- 词向量:自然语言处理的基石
- mybatis动态sql
- 40G微信小程序开发教程(工具插件+视频教程)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功