【优化求解】基于matlab禁忌搜索算法求解函数极值问题【含Matlab源码 1204期】

1、禁忌搜索算法简介

1 引言
一个问题的求解过程就是搜索,它是人工智能的一个基本问题,而人工智能在各应用领域中被普遍地使用。如今搜索技术***在各类人工智能系统中,能够说没有哪种人工智能的应用不用搜索方法。
禁忌搜索算法(Tabu Search or Taboo Search, TS) 的思想最先由美国工程院院士Glover教授于1986年提出[] , 并在1989年和1990年对该方法作出了进一步的定义和发展[2-4]。在天然计算的研究领域
中,禁忌搜索算法以其灵活的存储结构和相应的禁忌准则来避免迂回搜索,在智能算法中独树一帜,成为一个研究热点,受到了国内外学者的普遍关注。迄今为止,禁忌搜索算法在组合优化、生产调度、机器学习、电路设计和神经网络等领域取得了很大的成功,近年来又在函数全局优化方面获得较多的研究,并有迅速发展的趋势[5-8].
所谓禁忌,就是禁止重复前面的操做。为了改进局部邻域搜索容易陷入局部最优势的不足,禁忌搜索算法引入一个禁忌表,记录下已经搜索过的局部最优势,在下一次搜索中,对禁忌表中的信息再也不搜索或有选择地搜索,以此来跳出局部最优势,从而最终实现全局优化。禁忌搜索算法是对局部邻域搜索的一种扩展,是一种全局邻域搜索、逐步寻优的算法。
禁忌搜索算法是一种迭代搜索算法,它区别于其余现代启发式算法的显著特色,是利用记忆来引导算法的搜索过程;它是对人类智力过程的一种模拟,是人工智能的一种体现。禁忌搜索算法涉及邻域、
禁忌表、禁忌长度、候选解、藐视准则等概念,在邻域搜索的基础上,经过禁忌准则来避免重复搜索,并经过藐视准则来赦免一些被禁忌的优良状态,进而保证多样化的有效搜索来最终实现全局优化。算法

2禁忌搜索算法理论
2.1局部邻域搜索
局部邻域搜索是基于贪婪准则持续地在当前的邻域中进行搜索,虽然其算法通用,易于实现,且容易理解,但其搜索性能彻底依赖于邻域结构和初始解,尤为容易陷入局部极小值而没法保证全局优化。
局部搜索的算法能够描述为:
在这里插入图片描述
在这里插入图片描述
这种邻域搜索方法易于理解,易于实现,并且具备很好的通用性,可是搜索结果的好坏彻底依赖于初始解和邻域的结构。若邻域结构设置不当,或初始解选择不合适,则搜索结果会不好,可能只会搜
索到局部最优解,即算法在搜索过程当中容易陷入局部极小值。所以,若不在搜索策略上进行改进,要实现全局优化,局部邻域搜索算法采用的邻域函数就必须是“彻底”的,即邻域函数将致使解的彻底枚
举。而这在大多数状况下是没法实现的,并且穷举的方法对于大规模问题在搜索时间上也是不容许的。为了实现全局搜索,禁忌搜索采用容许接受劣质解的策略来避免局部最优解。
2.2禁忌搜索
禁忌搜索算法是模拟人的思惟的一种智能搜索算法,即人们对已搜索的地方不会再当即去搜索,而是去对其余地方进行搜索,若没有找到,可再搜索已去过的地方。禁忌搜索算法从一个初始可行解出
发,选择一系列的特定搜索方向(或称为“移动”)做为试探,选择使目标函数值减少最多的移动。为了不陷入局部最优解,禁忌搜索中采用了一种灵活的“记忆”技术,即对已经进行的优化过程进行记录,指导下一步的搜索方向,这就是禁忌表的创建。禁忌表中保存了最近若干次迭代过程当中所实现的移动,凡是处于禁忌表中的移动,在当前迭代过程当中是禁忌进行的,这样能够避免算法从新访问在最近若
干次迭代过程当中已经访问过的解,从而防止了循环,帮助算法摆脱局部最优解。另外,为了尽量不错过产生最优解的“移动”,禁忌搜索还采用“特赦准则”的策略。
对一个初始解,在一种邻域范围内对其进行一系列变化,从而获得许多候选解。从这些候选解中选出最优候选解,将候选解对应的目标值与“best so far”状态进行比较。若其目标值优于“best sofar”状态, 就将该候选解解禁, 用来替代当前最优解及其“best sofar”状态, 而后将其加入禁忌表, 再将禁忌表中相应对象的禁忌长度改变:若是全部的候选解中所对应的目标值都不存在优于“best sofar”状态, 就从这些候选解中选出不属于禁忌对象的最佳状态, 并将其做为新的当前解,不用与当前最优解进行比较,直接将其所对应的对象做为禁忌对象,并将禁忌表中相应对象的禁忌长度进行修改。
2.3禁忌搜索算法的特色
禁忌搜索算法是在邻域搜索的基础上,经过设置禁忌表来禁忌一些已经进行过的操做,并利用藐视准则来奖励一些优良状态,其中邻域结构、候选解、禁忌长度、禁忌对象、藐视准则、终止准则等是影
响禁忌搜索算法性能的关键。邻域函数沿用局部邻域搜索的思想,用于实现邻域搜索;禁忌表和禁忌对象的设置,体现了算法避免迂回搜索的特色:藐视准则,则是对优良状态的奖励,它是对禁忌策略的一种放松。
与传统的优化算法相比,禁忌搜索算法的主要特色是:
(1)禁忌搜索算法的新解不是在当前解的邻域中随机产生,它要么是优于“best so far”的解, 要么是非禁忌的最佳解, 所以选取优良解的几率远远大于其余劣质解的几率。
(2)因为禁忌搜索算法具备灵活的记忆功能和藐视准则,而且在搜索过程当中能够接受劣质解,因此具备较强的“登山”能力,搜索时可以跳出局部最优解,转向解空间的其余区域,从而增大得到更好的全局最优解的几率。所以,禁忌搜索算法是一种局部搜索能力很强的全局迭代寻优算法。markdown

2.4禁忌搜索算法的改进方向
禁忌搜索是著名的启发式搜索算法,可是禁忌搜索也有明显的不足,即在如下方面须要改进:
(1)对初始解有较强的依赖性,好的初始解可以使禁忌搜索算法在解空间中搜索到好的解,而较差的初始解则会下降禁忌搜索的收敛速度。所以能够与遗传算法、模拟退火算法等优化算法结合,先产生较好的初始解,再用禁忌搜索算法进行搜索优化。
(2)迭代搜索过程是串行的,仅是单一状态的移动,而非并行搜索。为了进一步改善禁忌搜索的性能,一方面能够对禁忌搜索算法自己的操做和参数选取进行改进,对算法的初始化、参数设置等方面实
施并行策略,获得各类不一样类型的并行禁忌搜索算法[9]:另外一方面则能够与遗传算法、神经网络算法以及基于问题信息的局部搜索相结合。
(3)在集中性与多样性搜索并重的状况下,多样性不足。集中性搜索策略用于增强对当前搜索的优良解的邻域作进一步更为充分的搜索,以期找到全局最优解。多样性搜索策略则用于拓宽搜索区域,尤
其是未知区域,当搜索陷入局部最优时,多样性搜索可改变搜索方向,跳出局部最优,从而实现全局最优。增长多样性策略的简单处理手段是对算法的从新随机初始化,或者根据频率信息对一些已知对象进行惩罚。网络

3 禁忌搜索算法流程
简单禁忌搜索算法的基本思想是:给定一个当前解(初始解)和一种邻域,而后在当前解的邻域中肯定若干候选解;若最佳候选解对应的目标值优于“best so far”状态, 则忽视其禁忌特性, 用它替代当前解和“best so far”状态, 并将相应的对象加入禁忌表, 同时修改禁忌表中各对象的任期:若不存在上述候选解,则在候选解中选择非禁忌的最佳状态为新的当前解,而无视它与当前解的优劣,同时将相应的对象加入禁忌表,并修改禁忌表中各对象的任期。如此重复上述迭代搜索过程,直至知足中止准则。其算法步骤可描述以下:
(1)给定禁忌搜索算法参数,随机产生初始解x,置禁忌表为空。
(2)判断算法终止条件是否知足:如果,则结束算法并输出优化结果:不然,继续如下步骤。
(3)利用当前解的邻域函数产生其全部(或若干)邻域解,并从中肯定若干候选解。
(4)对候选解判断藐视准则是否知足:若知足,则用知足藐视准则的最佳状态y替代x成为新的当前解,即x=y,并用与y对应的禁忌对象替换最先进入禁忌表的禁忌对象, 同时用y替换“best so far”状态,而后转步骤(6):不然,继续如下步骤。
(5)判断候选解对应的各对象的禁忌属性,选择候选解集中非禁忌对象对应的最佳状态为新的当前解,同时用与之对应的禁忌对象替换最先进入禁忌表的禁忌对象。
(6)判断算法终止条件是否知足:如果,则结束算法并输出优化结果:不然,转步骤(3)。
禁忌搜索算法的运算流程如图8.1所示。
在这里插入图片描述
4 关键参数说明
通常而言,要设计一个禁忌搜索算法,须要肯定算法的如下环节:初始解、适配值函数、邻域结构、禁忌对象、候选解选择、禁忌表、禁忌长度、藐视准则、搜索策略、终止准则[10,11]。面对如此众
多的参数,针对不一样邻域的具体问题,很难有一套比较完善的或很是严格的步骤来肯定这些参数。
初始解
禁忌搜索算法能够随机给出初始解,也能够事先使用其余启发式算法等给出一个较好的初始解。因为禁忌搜索算法主要是基于邻域搜索的,初始解的好坏对搜索的性能影响很大。尤为是一些带有很复杂
约束的优化问题,若是随机给出的初始解不好,甚至经过多步搜索也很难找到一个可行解,这时应该针对特定的复杂约束,采用启发式方法或其余方法找出一个可行解做为初始解;再用禁忌搜索算法求解,以提升搜索的质量和效率。也能够采用必定的策略来下降禁忌搜索对初始解的敏感性。
适配值函数
禁忌搜索的适配值函数用于对搜索进行评价,进而结合禁忌准则和特赦准则来选取新的当前状态。目标函数值和它的任何变形均可以做为适配值函数。若目标函数的计算比较困难或耗时较长,此时可采
用反映问题目标的某些特征值来做为适配值,进而改善算法的时间性能。选取何种特征值要视具体问题而定,但必须保证特征值的最佳性与目标函数的最优性一致。适配值函数的选择主要考虑提升算法的效率、便于搜索的进行等因素。
邻域结构
所谓邻域结构,是指从一个解(当前解)经过“移动”产生另外一个解(新解)的途径,它是保证搜索产生优良解和影响算法搜索速度的重要因素之一。邻域结构的设计一般与问题相关。邻域结构的设计方法不少,对不一样的问题应采用不一样的设计方法,经常使用设计方法包括互换、插值、逆序等。不一样的“移动”方式将致使邻域解个数及其变化状况的不一样,对搜索质量和效率有必定影响。数据结构

经过移动,目标函数值将产生变化,移动先后的目标函数值之差,称之为移动值。若是移动值是非负的,则称此移动为改进移动:不然,称之为非改进移动。最好的移动不必定是改进移动,也多是
非改进移动,这一点能保证在搜索陷入局部最优时,禁忌搜索算法能自动把它跳出局部最优。机器学习

禁忌对象
所谓禁忌对象,就是被置入禁忌表中的那些变化元素。禁忌的目的则是为了尽可能避免迂回搜索而多搜索一些解空间中的其余地方。概括而言,禁忌对象一般可选取状态自己或状态份量等。ide

候选解选择
候选解一般在当前状态的邻域中择优选取,若选取过多将形成较大的计算量,而选取较少则容易“早熟”收敛,但要作到整个邻域的择优每每须要大量的计算,所以能够肯定性地或随机性地在部分邻域中选取候选解,具体数据大小则可视问题特征和对算法的要求而定。
禁忌表
不容许恢复(即被禁止) 的性质称做禁忌(Tabu) 。禁忌表的主要目的是阻止搜索过程当中出现循环和避免陷入局部最优,它一般记录前若干次的移动,禁止这些移动在近期内返回。在迭代固定次数后,
禁忌表释放这些移动,从新参加运算,所以它是一个循环表,每迭代一次,就将最近的一次移动放在禁忌表的末端,而它的最先的一个移动就从禁忌表中释放出来。
从数据结构上讲,禁忌表是具备必定长度的先进先出的队列。禁忌搜索算法使用禁忌表禁止搜索曾经访问过的解,从而禁止搜索中的局部循环。禁忌表可使用两种记忆方式:明晰记忆和属性记忆。明
晰记忆是指禁忌表中的元素是一个完整的解,消耗较多的内存和时间:属性记忆是指禁忌表中的元素记录当前解移动的信息,如当前解移动的方向等。函数

禁忌长度
所谓禁忌长度,是指禁忌对象在不考虑特赦准则的状况下不容许被选取的最大次数。通俗地讲,禁忌长度可视为禁忌对象在禁忌表中的任期。禁忌对象只有当其任期为0时才能被解禁。在算法的设计和构
造过程当中,通常要求计算量和存储量尽可能小,这就要求禁忌长度尽可能小。可是,禁忌长度太小将形成搜索的循环。禁忌长度的选取与问题特征相关,它在很大程度上决定了算法的计算复杂性。
一方面,禁忌长度能够是一个固定常数(如t=c,c为一常数),或者固定为与问题规模相关的一个量(如t=√n,n为问题维数或规模),如此实现起来方便、简单,也颇有效:另外一方面,禁忌长度也能够是动态变化的,如根据搜索性能和问题特征设定禁忌长度的变化区间,而禁忌长度则可按某种规则或公式在这个区间内变化。性能

藐视准则
在禁忌搜索算法中,可能会出现候选解所有被禁忌,或者存在一个优于“best so far”状态的禁忌候选解, 此时特赦准则将某些状态解禁,以实现更高效的优化性能。特赦准则的经常使用方式有:
(1) 基于适配值的原则:某个禁忌候选解的适配值优于“bestso far”状态, 则解禁此候选解为当前状态和新的“best so far”状态。
(2)基于搜索方向的准则:若禁忌对象上次被禁忌时使得适配值有所改善,而且目前该禁忌对象对应的候选解的适配值优于当前解,则对该禁忌对象解禁。学习

搜索策略
搜索策略分为集中性搜索策略和多样性搜索策略。集中性搜索策略用于增强对优良解的邻域的进一步搜索。其简单的处理手段能够是在必定步数的迭代后基于最佳状态从新进行初始化,并对其邻域进行再次搜索。在大多数状况下,从新初始化后的邻域空间与上一次的邻域空间是不同的,固然也就有一部分邻域空间多是重叠的。多样性搜索策略则用于拓宽搜索区域,尤为是未知区域。其简单的处理手段能够是对算法的从新随机初始化,或者根据频率信息对一些已知对象进行惩罚。优化

终止准则
禁忌搜索算法须要一个终止准则来结束算法的搜索进程,而严格理论意义上的收敛条件,即在禁忌长度充分大的条件下实现状态空间的遍历,这显然是不可能实现的。所以,在实际设计算法时一般采用
近似的收敛准则。经常使用的方法有:
(1)给定最大迭代步数。当禁忌搜索算法运行到指定的迭代步数以后,则终止搜索。
(2)设定某个对象的最大禁忌频率。若某个状态、适配值或对换等对象的禁忌频率超过某一阈值,或最佳适配值连续若干步保持不变,则终止算法。
(3)设定适配值的偏离阈值。首先估计问题的下界,一旦算法中最佳适配值与下界的偏离值小于某规定阈值,则终止搜索。

2、案例及完整源代码

1 案例
在这里插入图片描述

2 完整代码

%%%%%%%%%%%%%%%%禁忌搜索算法求函数极值问题%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;                        %清除全部变量
close all;                        %清图
clc;                              %清屏
xu=5;                             %上界
xl=-5;                            %下界
L=randi([5 11],1,1);            %禁忌长度取5,11之间的随机数
Ca=5;                             %邻域解个数
Gmax=200;                         %禁忌算法的最大迭代次数;
w=1;                              %自适应权重系数
tabu=[];                          %禁忌表
x0=rand(1,2)*(xu-xl)+xl;          %随机产生初始解
bestsofar.key=x0;                 %最优解
xnow(1).key=x0;                   %当前解
%%%%%%%%%%%%%%%%最优解函数值,当前解函数值%%%%%%%%%%%%%%%%%
bestsofar.value=func2(bestsofar.key);  
xnow(1).value=func2(xnow(1).key);
g=1;
while g<Gmax
    x_near=[];                     %邻域解
    w=w*0.998;
    for i=1:Ca
        %%%%%%%%%%%%%%%%%%%%%产生邻域解%%%%%%%%%%%%%%%%%%%%
        x_temp=xnow(g).key;
        x1=x_temp(1);
        x2=x_temp(2);
        x_near(i,1)=x1+(2*rand-1)*w*(xu-xl);
           %%%%%%%%%%%%%%%%%边界条件处理%%%%%%%%%%%%%%%%%%%
           %%%%%%%%%%%%%%%%%%%边界吸取%%%%%%%%%%%%%%%%%%%%%
        if x_near(i,1)<xl
            x_near(i,1)=xl;
        end
        if x_near(i,1)>xu
            x_near(i,1)=xu;
        end
        x_near(i,2)=x2+(2*rand-1)*w*(xu-xl);
           %%%%%%%%%%%%%%%%%边界条件处理%%%%%%%%%%%%%%%%%%%
           %%%%%%%%%%%%%%%%%%%边界吸取%%%%%%%%%%%%%%%%%%%%%
        if x_near(i,2)<xl
            x_near(i,2)=xl;
        end
        if x_near(i,2)>xu
            x_near(i,2)=xu;
        end
        %%%%%%%%%%%%%%计算邻域解点的函数值%%%%%%%%%%%%%%%%%%%
        fitvalue_near(i)=func2(x_near(i,:)); 
    end
    %%%%%%%%%%%%%%%%%%%%最优邻域解为候选解%%%%%%%%%%%%%%%%%%%
    temp=find(fitvalue_near==max(fitvalue_near));
    candidate(g).key=x_near(temp,:);
    candidate(g).value=func2(candidate(g).key);
    %%%%%%%%%%%%%%候选解和当前解的评价函数差%%%%%%%%%%%%%%%%%%
    delta1=candidate(g).value-xnow(g).value; 
    %%%%%%%%%%%%%%候选解和目前最优解的评价函数差%%%%%%%%%%%%%%%
    delta2=candidate(g).value-bestsofar.value;    
    %%%%%候选解并无改进解,把候选解赋给下一次迭代的当前解%%%%%%
    if delta1<=0   
        xnow(g+1).key=candidate(g).key;
        xnow(g+1).value=func2(xnow(g).key);
        %%%%%%%%%%%%%%%%%%%%%更新禁忌表%%%%%%%%%%%%%%%%%%%%%%%
        tabu=[tabu;xnow(g+1).key];
        if size(tabu,1)>L  
            tabu(1,:)=[];
        end
        g=g+1;                 %更新禁忌表后,迭代次数自增1
    %%%%%%%若是相对于当前解有改进,则应与目前最优解比较%%%%%%%%%%
    else
        if delta2>0            %候选解比目前最优解优
            %%%%%%%%%%把改进解赋给下一次迭代的当前解%%%%%%%%%%%%
            xnow(g+1).key=candidate(g).key;
            xnow(g+1).value=func2(xnow(g+1).key);
            %%%%%%%%%%%%%%%%%%%%更新禁忌表%%%%%%%%%%%%%%%%%%%%%
            tabu=[tabu;xnow(g+1).key];
            if size(tabu,1)>L 
                tabu(1,:)=[];
            end 
            %%%%%%%%把改进解赋给下一次迭代的目前最优解%%%%%%%%%%%%
            %%%%%%%%%%%%%%%%%包含藐视准则%%%%%%%%%%%%%%%%%%%%%%%
            bestsofar.key=candidate(g).key;
            bestsofar.value=func2(bestsofar.key);
            g=g+1;                %更新禁忌表后,迭代次数自增1
        else
            %%%%%%%%%%%%%%%判断改进解时候在禁忌表里%%%%%%%%%%%%%%%
            [M,N]=size(tabu);
            r=0;
            for m=1:M
                if candidate(g).key(1)==tabu(m,1)...
                   & candidate(g).key(2) == tabu(m,1)
                    r=1;
                end
            end
            if  r==0
                %%改进解不在禁忌表里,把改进解赋给下一次迭代的当前解
                xnow(g+1).key=candidate(g).key;
                xnow(g+1).value=func2(xnow(g+1).key);
                %%%%%%%%%%%%%%%%%%%%%更新禁忌表%%%%%%%%%%%%%%%%%%
                tabu=[tabu;xnow(g).key];
                if size(tabu,1)>L
                    tabu(1,:)=[];
                end
                g=g+1;               %更新禁忌表后,迭代次数自增1
            else
                %%%若是改进解在禁忌表里,用当前解从新产生邻域解%%%%%
                xnow(g).key=xnow(g).key;
                xnow(g).value=func2(xnow(g).key);
            end
        end
    end
    trace(g)=func2(bestsofar.key);
end
bestsofar;           %最优变量及最优值
figure
plot(trace);
xlabel('迭代次数')
ylabel('目标函数值')
title('搜索过程最优值曲线')
%%%%%%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%%%%%
function result=func1(x)
summ=sum(x.^2);
result=summ;

3、解题过程及运行结果

1 解题过程
在这里插入图片描述
在这里插入图片描述

2 运行结果
在这里插入图片描述

4、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

相关文章
相关标签/搜索