禁忌搜索算法(TS)求函数最大值python实现

该代码实现了一个基于Python的禁忌搜索算法,用于寻找二维函数的最小值。算法首先生成随机初始值,然后通过迭代过程在邻域中寻找更好的解,同时应用禁忌表策略防止陷入局部最优。过程中考虑了自适应权重和蔑视准则,以提高搜索效率。
摘要由CSDN通过智能技术生成

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from numpy.random import rand,randint
from math import cos,sqrt,pow

def func(x):
    y = (cos(x[0]*x[0]+x[1]*x[1])-0.1)/(1+0.3*pow(x[0]*x[0]+x[1]*x[1],2))+3
    return y

path       = []
xu         = 5          # 上界         
xl         = -5         # 下界 
tb_len = randint(5,11)  # 5-11之间的随机数,禁忌表长度
nerb_count = 20         # 邻域解个数  
max_iter   = 200        # 最大迭代次数
w          = 1          # 自适应权重
tabu       = []         # 禁忌表
xnow       = rand(2)*(xu-xl+xl)  #随机产生初始值
xnow_value = 0
bestsofar  = np.zeros(2) 
bestsofar_value = 0

# 准备开始迭代过程
bestsofar  = xnow
bestsofar_value = func(xnow)
xnow_value = bestsofar_value
g = 0
while g<max_iter:
    x_nears = []
    w = w*0.998
    for i in range(nerb_count):        # 产生邻域解
        x_near  = []
        x_temp = xnow
        x1 = x_temp[0]
        x2 = x_temp[1]

        x_near.append(x1+(2*rand()-1)*w*(xu-xl))  # 产生第一维
        if x_near[0]<xl:
            x_near[0] = xl
        if x_near[0]>xu:
            x_near[0] = xu

        x_near.append(x2+(2*rand()-1)*w*(xu-xl))  # 产生第二维
        if x_near[1]<xl:
            x_near[1] = xl
        if x_near[1]>xu:
            x_near[1] = xu

        x_nears.append(x_near)

    fitvalues = []                                # 计算邻域函数值
    for key in x_nears:
        fitvalues.append(func(key))
    
    indx = np.argmax(fitvalues)                # 判断最大值的索引
    candidate = x_nears[indx]
    candidate_value = fitvalues[indx]
    
    delta1 = candidate_value - xnow_value         # 当前值和最好值比较
    delta2 = candidate_value - bestsofar_value

    if delta1 <= 0:                               # 策略:比当前劣势直接接受,利于跳出局部;比最优更优也直接接受;比当前优但比最优劣势,考虑是否在禁忌表内,避免局部循环。
        xnow_value = candidate_value              
        xnow = candidate
        
        tabu.append(xnow_value)                   # 更新禁忌表
        if len(tabu)>tb_len:
            tabu.pop(0)
    else:
        if delta2 > 0:                            
            xnow_value = candidate_value              
            xnow = candidate

            tabu.append(xnow_value)              # 更新禁忌表
            if len(tabu)>tb_len:
                tabu.pop(0)

            bestsofar_value = candidate_value    # 赋给最优,包含蔑视准则            
            bestsofar = candidate
        else:                                    # 判断是否在禁忌表内
            if candidate not in tabu:
                xnow_value = candidate_value              
                xnow = candidate

                tabu.append(xnow_value)              # 更新禁忌表
                if len(tabu)>tb_len:
                    tabu.pop(0)
            else:
                pass
    path.append(bestsofar_value)
    g = g+1
print(max(path))
plt.plot(path)
plt.pause(10000)

参考:《智能优化算法及MATLAB实例》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值