MATLAB算法实战应用案例精讲-【优化算法】樽海鞘群算法(SSA)及其算法变种(附matlab代码实现)

news2024/11/13 11:50:26

目录

前言

 算法原理 

算法思想

数学模型

(1)种群初始化

(2)领导者位置更新

(3)跟随者位置更新

 代码实现

 算法流程图

 算法步骤

伪代码

SSA伪代码

 MSSA伪代码

面向全局搜索的自适应领导者樽海鞘群算法

1.1 改进领导者位置更新公式

1.2 引入领导者-跟随者自适应调整策略

 基于混沌映射的自适应樽海鞘群算法

1.1 混沌映射

1.2 自适应权重变化

1.3 追随者机制变化

1.4伪代码

集成随机惯性权重和差分变异操作的樽海鞘群算法 

1.1 PSO算法随机惯性权重的引入

1.2 集成DE算法的变异操作

 基于疯狂自适应的樽海鞘群算法

1.1 Tent映射的种群初始化

1.2 疯狂算子

1.3自适应惯性权重

基于混合策略改进的樽海鞘群算法

(1)加权重心学习策略

(2)自适应惯性权重

(3)逐维随机差分变异

(4)改进后的算法步骤

基于自适应惯性权重的樽海鞘群算法

(1)惯性权重策略

(2)种群成功率策略

(3)差分变异策略

(4)算法步骤

算法拓展

改进的樽海鞘群算法

(1) 对领导者和追随者的改进

(2) 与其他优化算法相结合

1.引言

2.改进樽海鞘群算法

结合密度峰值聚类和改进樽海鞘群算法的遥感图像分割

1.1 基于超像素密度峰值聚类的图像分割

1.2 基于改进樽海鞘群的密度峰值聚类模型求解 

1.3 实验结果与分析

代码实现

MATLAB


前言

樽海鞘是一种海洋无脊椎动物,身体呈桶状且几乎完全透明,以水中浮游植物为食,通过吸入和喷出海水完成在水中移动。在深海中,樽海鞘以一种链式的群行为进行移动和觅食,这种“奇特”的群行为引起了研究者的兴趣。樽海鞘的链式群行为,通常个体首尾相接,形成一条“链”,依次跟随进行移动。在樽海鞘链中,分为领导者和追随者,领导者朝着食物移动并且指导着紧随其后的追随者的移动,追随者的移动按照严格的“等级”制度,只受前一个樽海鞘影响。这样的运动模式使樽海鞘链有很强的全局探索和局部开发能力。
 

樽海鞘群算法( salp swarm algorithm,SSA)是Seyedali Mirjalili等于2017年提出的一种新型智能优化算法[1]。 该算法模拟了樽海鞘链的群体行为,是一种较新颖的群智能优化算法。每次迭代中,领导者指导追随者,以一种链式行为,向食物移动。移动过程中,领导者进行全局探索,而追随者则充分进行局部探索,大大减少了陷入局部最优的情况。 
 

 算法原理 

SSA 算法是一种基于群体智能的全局优化算法。樽海鞘是一种身体组织和移动方式与
水母高度相似的海洋生物,是一种能够自由漂浮的被囊动物。个体樽海鞘的形状如图 2.8(a)
所示。樽海鞘以一种链式的群行为进行移动和觅食,通常个体首尾相接,形成一条“链”,
依次跟随进行移动,如图 2.8(b) 所示。在樽海鞘链中,分为领导者和追随者,领导者朝着
食物移动并且指导着紧随其后的追随者的移动,追随者的移动按照严格的“等级”制度,
只受前一个樽海鞘影响。
SSA 算法通过模拟樽海鞘链觅食过程,来解决优化问题。在给定优化问题的特征空间
中,樽海鞘链为一组可行解,其中每个樽海鞘位置对应于一个可行解。在迭代过程中,领
导者引导樽海鞘链搜索最优解,追随者探索特征空间并跟随领导者。

算法思想

在空间搜索的过程中,领导者负责搜索食物,引导整个群体的移动,领导者的位置更
新表示为,

牛顿运动定律通常用于更新追随者的位置为, 

为了能够直观地观察 SSA 算法在寻优过程中的移动规律,图 2.9 给出了仿真实验。

在仿真实验中,设置樽海鞘种群大小为 20 ,并绘制樽海鞘链在不同迭代次数下的位置
和状态。在图 2.9 中蓝点表示食物位置,樽海鞘链中首端最黑点表示领导者,其余点表示
追随者。从图 2.9 中可以看到,在初始状态时樽海鞘位置分散且距食物位置都较远,在 6
次迭代时后樽海鞘链中的领导者逐步趋向食物的位置,在 10 次迭代后领导者成功搜索到
食物位置,在之后的迭代中追随者也不断靠近食物位置。

图3和图5显示了经过100次迭代后,在二维和三维空间中,salps在固定和流动食物源附近的位置历史。在固定食物源周围的搜索点表明,樽海鞘能有效地在搜索空间内移动。该模型的点分布合理,表明该模型能够对固定食物源周围的空间进行探索和开发。此外,图3和图5表明,所提出的数学模型要求在樽海鞘链中的樽海鞘追赶移动的食物源。搜索点在起始点附近的分布大于结束点。这是由于控制勘探和开发的c1参数造成的。这些发现证明,樽海鞘链运动模型能够探索和利用固定和流动食物源周围的空间。 

数学模型

樽海鞘群算法(salp swarm algorithm,SSA)是Seyedali Mirjalili等于2017年提出的一种新型智能优化算法。每次迭代中,领导者指导追随者,以一种链式行为,向食物移动。移动过程中,领导者进行全局探索,而追随者则充分进行局部探索,大大减少了陷入局部最优的情况。樽海鞘群算法中有两类个体, 分别是领导者和跟随者。

为了建立樽海鞘链的数学模型,种群首先分为两组:领导者和追随者。领导者是位于食物链前端的樽海鞘,而其余樽海鞘则被视为追随者。正如这些樽海鞘的名字所暗示的,领袖引导种群,追随者互相跟随(直接或间接的领袖)。与其他基于群体的技术类似,在n维搜索空间中定义樽海鞘的位置,其中n是给定问题的变量数。 因此,所有樽海鞘的位置都存储在称为x的二维矩阵中。 还假定在搜索空间中有一个称为F的食物源作为种群的目标。

对应关系

(1)种群初始化

(2)领导者位置更新

在樽海鞘链移动和觅食过程中,领导者的位置更新表示为:

式( 2) 表明,领导者的位置更新仅与食物的位置有关。 c1​是优化算法中的收敛因子,起到平衡全局探索和局部开发的作用,是 SSA 中最重要的控制参数。c1​的表达式为:

其中, l表示当前迭代次数,L表示最大迭代次数。可以发现,c1​是樽海鞘群算法中最重要的参数,负责平衡开发和勘探。收敛因子是一个 2-0 的递减函数。控制参数c2​、c3​是[0,1]的随机数,用来增强 X_{d}^{1}的随机性,提高链群的全局搜索和个体多样性。

(3)跟随者位置更新

在樽海鞘链移动和觅食的过程中,追随者通过前后个体间的彼此影响,呈链状依次前进。它们的位移符合牛顿运动定律,追随者的运动位移为:

 考虑到在优化算法中,t 是迭代的,设迭代过程中t=1,并且 v0​=0。那么式( 4) 可以表示为:

 代码实现

###定义一个樽海鞘类
#樽海鞘个体继承于上次写的个体基类,并多了两个方法,分别是对于不同樽海鞘的位置更新方法。
class Salp(baseIndividual):
    
    def update_head(self, best_position : np.ndarray, c1 : float):
        # c2 = random.random()                        # 同一随机数
        c2 = np.random.random_sample(self.x_dim)    # 每一维度不同随机数
        c3 = random.random()
        second_part = c1 * (self.across * c2 + self.l_bound)
        
        if c3 < 0.5:
            self.position = best_position - second_part
        else:
            self.position = best_position + second_part

    def update_other(self, prev):
        self.position += prev.position
        self.position /= 2

###定义樽海鞘群算法
class SalpSwarm(baseSIOA):
    individual_class_build_up_func = Salp

    def __init__(self, objective_func, salp_num, search_space, constraint_func = None):
        '''
        :param objective_func:  目标函数,参数为 x 向量 \n
        :param salp_num:        樽海鞘个数 \n
        :param search_space:    x 在各维度的取值范围,shape = (2, x_dim) \n
        :param constraint_func: 约束条件函数 bool 值函数\n
        '''

        super(SalpSwarm_test, self).__init__(objective_func, salp_num, search_space, constraint_func = constraint_func)

        self.salp_swarm = self.individual_swarm

    def c1_formula(self, t : int, T : int) -> float:
        return 2 * math.exp(- (4 * t / T) ** 2)

    def iteration(self, iter_num : int) -> IterationResult:
        best_fitness_value = []

        self.get_fitness()
        best_salp_index = np.argmin(self.fitness)
        best_fitness_value.append(self.fitness[best_salp_index])
        best_position = self.salp_swarm[best_salp_index].position
        # print(best_position, self.fitness[best_salp_index])

        for t in tqdm(range(1, iter_num + 1)):
        # for t in range(1, iter_num + 1):
            c_1 = self.c1_formula(t, iter_num)
            
            for i, single_salp in enumerate(self.salp_swarm):
                if i == 0:
                    # 链头产生新解
                    single_salp.update_head(best_position, c_1)
                else:
                    # 其他产生新解
                    single_salp.update_other(self.salp_swarm[i - 1])
            
            if self.constraint_func:
                self.constraint()
            else:
                self.bound_check()
            
            self.get_fitness()
            best_salp_index = np.argmin(self.fitness)
            best_fitness_value.append(self.fitness[best_salp_index])

            best_position = self.salp_swarm[best_salp_index].position.copy()

        
        return IterationResult(
                {
                    'best_position' : best_position,
                    'best_fitness' : self.fitness[best_salp_index],
                    'best_fitness_value_history' : best_fitness_value
                }
            )

###写测试函数
import numpy as np 
from Algorithms.SSA import SalpSwarm

def cost(x : np.ndarray) -> float:
    return (x[0]** 2 - 2) ** 2


if __name__ == '__main__':
    search_space = np.array([
        [0],
        [2]
    ])
    solver = SalpSwarm(cost, 30, search_space)
    solution_dict = solver.iteration(100)
    solution = solution_dict.best_position
    print('solution = ', solution[0])

 算法流程图

  • 1)初始化种群。根据搜索空间每一维的上界与下界,利用式(1)初始化一个规模为N ×D 的樽海鞘 群。
  • 2)计算初始适应度。计算 N 个樽海鞘的适应度值。
  • 3)选定食物。由于实际定位时我们不知道目标(即食物)的位置,因此,将樽海鞘群按照适应度值进行排序,排在首位的适应度最优的樽海鞘的位置设为当前食物位置。
  • 4)选定领导者与追随者。选定食物位置后,群体中剩余N −1 个樽海鞘,按照樽海鞘群体的排序,将排在前一半的樽海鞘视为领导者,其余樽海鞘视为追随者。
  • 5)位置更新。首先根据式(2)更新领导者的位置,再根据式(6)更新追随者的位置。
  • 6)计算适应度。计算更新后的群体的适应度。将更新后的每个樽海鞘个体的适应度值与当前食物的适应度值进行比较,若更新后樽海鞘的适应度值优于食物,则以适应度值更优的樽海鞘位置作为新的食物的位置。
  • 7)重复步骤4)-步骤6),直到达到一定迭代次数或适应度值达到终止门限,满足终止条件后,输出当前的食物位置作为目标的估计位置。

 算法步骤

根据上述 SSA 算法的数学模型,其具体步骤为:
step1 :设置樽海鞘群数量、搜索空间上下界和最大迭代次数;
step2 :按式 (2.20) 初始化樽海鞘群位置;
step3 :计算每个樽海鞘的适应度值;
step4 :将最优适应度的樽海鞘位置作为食物位置;
step5 :按式 (2.21) 更新领导者位置;
step6 :按式 (2.25)更新追随者位置;
step7 :重复步骤 step3~6 ,直至达到最大迭代次数。

伪代码

SSA伪代码

在SSA群模型中,跟随者跟随领头者。领头的樽海鞘也向食物来源移动。因此,如果食物来源被全局最优的替代,樽海鞘食物链就会自动向它移动。但问题是优化问题的全局最优是未知的。在这种情况下,我们假设到目前为止得到的最优解是全局最优解,并假设其为樽海鞘链所追逐的食物来源。

SSA算法的伪代码如下图所示。从图中可以看出,SSA算法通过初始化多个随机位置的樽海鞘来近似全局最优。然后计算每个樽海鞘的适合度,找到适合度最好的樽海鞘,并将最佳的樽海鞘的位置分配给变量F,作为樽海鞘链要追赶的源食物。同时利用公式(3.2)更新系数c1。对于每一个维度,使用Eq.(3.1)更新领先跳跃体的位置,使用Eq.(3.4)更新跟随跳跃体的位置。如果其中任何一个跃出了搜索空间,它将被带回边界。除初始化外,以上所有步骤都将迭代执行,直到满足end标准。

需要注意的是,在优化过程中,食物来源会被更新,因为樽海鞘链很有可能通过探索和开发它周围的空间找到更好的解决方案。
前文中的群模拟表明,所模拟的樽海鞘链能够追赶移动的食物源。因此,樽海鞘链有可能朝着在迭代过程中改变的全局最优方向移动。如何提出樽海鞘链模型和SSA算法在解决优化问题是有效的,下面列出一些批注:

  • SSA算法将目前得到的最优解保存下来,并将其分配给食物源变量,这样即使整个种群恶化也不会丢失。
  • SSA算法只更新了领导者樽海鞘相对于食物源的位置,食物源是迄今为止获得的最佳解,因此领导者总是探索和利用食物源周围的空间。
  • SSA算法更新跟随的樽海鞘之间的相对位置,使他们逐渐向领先的樽海鞘移动。
  • 追随者的渐进运动防止SSA算法容易陷入局部最优。
  • 参数c1在迭代过程中自适应地减少,因此SSA算法首先探索全局搜索空间,然后深入探索局部最优。
  • SSA算法只有一个主控制参数(c1)。
  • SSA算法简单,易于实现。

这些说明使得SSA算法在理论上和潜在上能够解决搜索空间未知的单目标优化问题。
SSA的自适应机制使得该算法可以避免局部解,最终找到优化过程中得到的最优解的准确估计。因此,它既适用于单峰问题,又适用于多峰问题。上述优点可能使SSA能够超过最近的算法(MFO、GWO、ABC等)。然而,根据NFL定理,这并不能保证所有的优化问题都是如此。

注意,SSA算法的计算复杂度为O(t(d*n + Cof*n)),其中t为迭代次数,d为变量数(维数),n为解数,Cof为目标函数的代价。

 MSSA伪代码

多目标问题的解决方案是一组称为帕累托最优集的解决方案。SSA算法能够驱动salps向食物来源靠近,并在迭代过程中对其进行更新。但是,该算法不能解决多目标问题,主要有以下两个原因:

  1. SSA只保存一个解决方案作为最佳解决方案,因此它不能存储多个解决方案作为一个多目标问题的最佳解决方案。
  2. SSA在每次迭代中都用迄今为止得到的最优解更新食物源,但对于多目标问题没有单一的最优解。

通过给SSA算法配备一个食物来源库来解决第一个问题。该存储库维护了到目前为止优化过程中获得的最优解,非常类似于多目标粒子群优化(MOPSO)中的存档[78]。存储库有一个最大大小来存储数量有限的最优解决方案。在优化过程中,使用Pareto优势操作符将每个樽海鞘与所有存储库原方案进行比较。

  • 如果一个樽海鞘在存储库中占优,则必须交换它们(把樽海鞘放入存储库,原方案拿出)。如果一个樽海鞘在存储库中优于一组解决方案,那么应该将这一组解决方案全部从存储库中删除,并把该樽海鞘应该添加到存储库中。
  • 如果至少有一个存储库中的原方案比该樽海鞘更优,那么该樽海鞘应被丢弃,不加入存储库。
  • 如果与所有存储库居民相比,该樽海鞘与之互不占优,那么该樽海鞘即是最优解,则必须将其添加到存储库中。

这些规则可以保证存储库得到的始终都是目前为止算法所获得的最优解决方案。但是,有一种特殊情况,即存储库已满,与存储库原方案相比,该樽海鞘也不占优,此时本应该将该樽海鞘加入存储库,但是存储库满了。当然,最简单的方法是随机删除归档中的一个解决方案,并将其替换为这个樽海鞘。

更明智的方法是在存储库中删除一个类似的非主导解决方案:从存档中删除的最佳候选方案是在一个种群稠密的区域。这种方法改进了在迭代过程中存储库中方案的分布。

为求邻域有人口的非支配解,需要计算邻域有一定最大距离的解的个数。这个距离的定义是:

 Max和min分别是存储每个目标函数的最大值和最小值的两个向量。每个段中有一个解决方案的存储库是最好的情况。(我认为是目前存储库里的max和min,因此存储库只有一个d。)在根据相邻解决方案的数量为每个存储库驻留分配级别之后,将使用轮盘赌来选择其中一个删除。一个解决方案的相邻解决方案的数量越多(级别数越大),从存储库中删除它的可能性就越大。图7展示了该存储库更新机制的示例。注意邻域应该为所有的解定义,但是在这个图中只研究了4个非支配解

如上所述,介绍了存储库的更新机制后,使用SSA解决多目标问题的第二个问题是食物来源的选择,因为在多目标搜索空间中有不止一个最佳解。同样,可以从存储库中随机选择食物来源。然而,更合适的方法是从一组最优解决方案中选择最不拥挤的区域。这可以使用存储库维护操作符中使用的相同的排序过程和轮盘赌轮选择来完成。主要的区别是选择最优解决方案的概率。在存储库维护删除中,等级越高(邻里拥挤)的解决方案越容易被选择。相比之下,对于存储库中的最优解决方案而言,人口越少(较低的等级数),被选为食物来源的可能性就越大。(这样就能更多地开发未探索的区域,加强全局搜索能力,如果一直检索密集区域容易陷入局部最优,选择稀疏的区域作为食物能够减少陷入局部最优的可能性。)例如在图7中,中间没有相邻方案的最优解被选择为食物来源的概率最大。 

下图显示,MSSA算法首先根据变量的上界和下界对樽海鞘种群进行初始化。然后,该算法计算出每个樽海鞘的适应值,并通过pareto比较找出最优的樽海鞘。如果存储库未满,则将该樽海鞘添加到存档中。如果存储库已满,则运行存储库维护以删除邻域拥挤的解决方案。在这一步,解决方案首先按照拥挤度排名,然后选择使用轮盘赌轮。在删除足够数量的存储库方案之后,可以最优樽海鞘添加到存储库中。更新存储库后,从存储库中最不拥挤的解决方案中选择食物来源。与存档维护类似,这是通过对解决方案进行排序并使用轮盘赌轮来完成的。下一步是使用Eq.(3.2)更新c1,并使用Eq.(3.1)或(3.4)更新领导者/跟随者樽海鞘的位置。如果在更新位置的过程中,一个樽海鞘超出了边界,它将被带回到边界上。最后,重复上述除初始化外的所有步骤,直到满足结束条件。

为了了解MSSA算法的有效性,以下是一些注释:

  • 到目前为止获得的最优解存储在一个存储库中,因此即使在一次迭代中整个种群恶化,最优解也不会丢失。
  • 每次存储库维护时,都会丢弃最拥挤邻居的解决方案,这将提高其他最优解决方案在所有目标中的覆盖率。
  • 从相邻解个数最少的解列表中选择一个食物源,这将引导搜索获得的帕累托最优前沿的不那么拥挤的区域,并提高找到的解的覆盖范围。(加强全局寻优能力)
  • MSSA继承了SSA的操作符,因为它使用了类似的种群划分(领导者和跟随者)和位置更新过程。
  • MSSA算法只有两个主要控制参数(c1和存储库大小)。
  • MSSA算法简单,易于实现。

这些评论表明MSSA算法在逻辑上能够找到在所有目标中具有高分布的精确帕累托最优解。注意MSSA算法的计算复杂度为O(t(d*n + Cof*n + M*n2)),其中M表示目标数量,t表示迭代次数,d表示变量数量(维数),n表示解的数量,Cof表示目标函数的代价。

面向全局搜索的自适应领导者樽海鞘群算法

为了进一步改善基本樽海鞘群算法容易陷入局部最优,寻优精度有时不高,求解结果不太稳定的不足,提出了一种面向全局搜索的自适应领导者樽海鞘群算法。在领导者位置更新公式中引入上一代樽海鞘群位置,增强了全局搜索的充分性,有效避免算法陷入局部极值。然后在领导者位置更新公式中加入惯性权重,并在全局和局部搜索的选择上引入领导者-跟随者数量自适应调整策略,使算法在迭代前期领导者数目较多且受全局最优解影响较大,能以较大的全局搜索步幅快速收敛到全局最优区域;而在迭代后期领导者步幅较小且跟随者数量较多,可以在最优解附近深度挖掘,提高算法的收敛精度。 

1.1 改进领导者位置更新公式

1.1.1 引入上一代樽海鞘领导者位置

在基本樽海鞘群算法中, 樽海鞘领导者从迭代 开始就奔向全局最优值, 导致全局搜索不充分, 容 易陷入局部极值区域,造成算法有时收敛精度较低。 本文在领导者位置更新公式中引入上一代樽海鞘领 导者位置, 使得领导者在位置更新阶段既受上一代 楢海鞘领导者位置的影响, 同时又受上一代全局最 优解的影响, 有效地避免了基本算法易陷入局部极 值的问题, 提高了算法的寻优精度。改进后的樽海 鞘领导者位置更新公式为:

一代的位置,樽海鞘领导者能够更有效地进行全局搜索, 增强算法 跳出局部极值的能力。

1.1.2 引入惯性权重

本文还在领导者位置更新公式中引入动态惯性权重,随迭代次数自适应递减的惯性权重 w 表示了樽海鞘领导者受全局最优解影响程度的变化。在迭代前期,领导者受全局最优解影响较大,有较大的全局搜索步幅,能够更快速地找到全局最优区域。而在迭代后期,大部分樽海鞘都已达到较优值,领导者受全局最优解影响变小, 领导者可以在最优解附 近深度挖掘, 提高了算法的收敛精度。本文中惯性 权重的计算公式为:

1.2 引入领导者-跟随者自适应调整策略

在基本 SSA 算法中,樽海鞘领导者和跟随者的数目始终是各占种群中个体数的一半,这就使得在迭代前期,执行全局搜索的领导者比例过低,跟随者比例过高,领导者无法有效地进行全局搜索,全局搜索不充分,容易陷入局部最优;而在迭代后期,执行局部搜索的跟随者比例过低,局部搜索不够充分,容易造成寻优精度不高。针对此问题,本文引领导者-跟随者自适应调整策略,樽海鞘领导者的数目随迭代次数的增加自适应减少,跟随者数目自适应增加,在算法前期能够保持很强的全局搜索能力,同时兼顾局部搜索,而在算法运行后期,局部搜索逐渐增强,同时也兼顾全局搜索,从整体上提高了算法的收敛精度。改进后的领导者-跟随者数量计算公式为:其中, t  是当前迭代次数, Max_iter 是最大迭 代次数。 b 为控制领导者-跟随者数量的比例系数, 避 免迭代前期的樽海鞘领导者或迭代后期的樽海鞘跟 随者比例过高, 全局和局部搜索失衡降低寻优性能, 易陷入局部极值的现象, 经大量实验测试, 本文取 值为0.75 。分析式 (8) 可知, r 的值随着算法迭代次数的增加呈非线性递减趋势, 于是领导者数量逐 渐减少, 跟随者数量逐渐增加, 在迭代后期, 更多的 樽海鞘跟随者在全局最优值附近深度挖掘。k 为扰 动偏离因子, 结合 rand 函数对递减的 r  值进行扰动, 经大量实验反复测试, k 等于0.2 时, 寻优效果最佳。

 基于混沌映射的自适应樽海鞘群算法

 针对樽海鞘群算法收敛速度慢、易陷入局部最优等问题,提出了一种基于混沌映射的自适应樽海鞘群算法。在种群初始化阶段引入混沌映射来增强种群的多样性,提高算法的收敛速度;改进领导者的更新方式,同时加入自适应权重,提高算法的探索和开发能力;改进追随者的位置更新方式,减少追随者的盲目性。

1.1 混沌映射

研究表明, 种群初始化作为群能算法的重要环 节, 初始化的位置的好坏可以直接影响算法的收敛 速度和解质量 , 例如, 均匀分布比随机分布解 空间的覆盖率更全, 更容易得到好的初始解。基本 樽海鞘群算法采用随机种群初始化操作, 无法覆盖 整个解空间。混池序列在一定范围内具有遍历性、 随机性及规律性的特点与随机搜索相比, 混池序列 能以更高的概率对搜索空间进行彻底搜索, 可使算 法跳出局部最优, 保持群体的多样性。
基于以上分析, 为了更大几率的得到好的初始 解位置, 加快种群的收玫速度, 本文采用具有较好遍 历均匀性和更快迭代速度的 Tent 混池映射方法, 提 高初始解的覆盖空间, 计算方法如式 (8) 所示。

1.2 自适应权重变化

在基本樽海鞘群算法中, 从领导者的位置更新方 式我们可以看出,领导者的位置更新主要受到食物源 和参数 c1​ 的影响, c1​ 值越大时有利于算法的探索能 力, c1​ 值越小时, 有利于算法的开发能力, 同时领导者 的位置移动还受到缩放因子c2​ 的影响, c2​ 为均匀分 布的随机数, 这样的缩放因子使得领导者的移动具有 很大的斍目性, 且 c2​ 的取值多为无效取值。针对上 述问题, 本文提出了一种新的领导者位置更新方式, 在食物源的位置添加自适应权重, 算法前期权重较 大, 让算法有足够强的探索能力, 随着迭代次数的增 加,权重自适应减小,用于增强算法的局部开发能力, 在算法的中后期, 权重开始增大, 使领导者具备跳出 局部最优的能力, 具体数学描述如式 (10) 所示。

1.3 追随者机制变化

在基本樽海鞘群算法中, 追随者根据式(7) 进 行位置更新, 从式中可以看出,第i 只个体根据第 i− 1 只个体进行位置移动, 而没有考虑上一个体适应 度的好与坏, 即追随者的位置移动具有一定的斍目 性,追随者  i 的位置移动只与个体i−1 有关, 缺乏与 其他个体进行信息交流的能力, 这种移动方式极易 导致算法陷入局部最优。针对上述缺点, 本文提出 了一种新的追随者移动方式, 具体数学描述如式 (12) 所示。

领导者c2 的适应 度, 则在适应度较大的个体位置上添加权重因子, 用 来降低较差位置个体的影响, 进而提升了较优个体 的权重; 否则, 个体i 只在自已周围波动。这种移动 方式, 可以大大的降低斍目追随性,增强了种群间的 信息交流,同时还能保留追随者的自身信息,保证种 群的多样性。

1.4伪代码

本文通过添加混沌映射和自适应权重,同时改变领导者和追随者的位置更新方式,得到了改进的樽海鞘群算法(CASSA) ,平衡了领导者的探索和开发能力,降低了追随者盲目性,更好的保留了个体信息,同时保证种群的多样性,CASSA的具体算法伪代码如下图所示。

集成随机惯性权重和差分变异操作的樽海鞘群算法 

 为了提高樽海鞘群算法(Salp Swarm Algorithm,SSA)的收敛速度、计算精度和全局优化能力,在分析总结粒子群优化(Particle Swarm Optimization,PSO)和差分进化(Differential Evolution,DE)算法相关研究成果后,提出了一种集成PSO算法随机惯性权重和DE算法差分变异操作的改进SSA算法——iSSA。首先,将PSO算法的随机惯性权重引入SSA算法的追随者位置更新公式中,用于增强和平衡SSA算法的勘探与开发能力;其次,用DE算法的变异操作替代SSA算法的领导者位置更新操作,以提高SSA算法的收敛速度和计算精度。

1.1 PSO算法随机惯性权重的引入

 

 在 PSO 算法中, 粒子速度更新直接决定着粒子位置更 新。惯性权重是 PSO 算法粒子速度更新公式中的重要参数, 它体现了上一代粒子对当前粒子速度更新的影响力, 用于平 衡 PSO 算法的勘探与开发 。尽管迄今为止已有大量学者 提出了各种 PSO 算法惯性权重控制策略, 但文献 [15] 的研究 表明, 在总计 18 种 PSO 算法惯性权重控制策略中, 除了随机 惯性权重以外, 常数项惯性权重优于其他所有的惯性权重控 制策略。
常数项惯性权重需要繁琐的算法参数调校, 因此本文将PSO 算法的随机惯性权重引入 SSA 算法追随者位置更新操 作中, 从而得到追随者位置更新公式:

其中, Random(0,1) 表示均匀分布于 (0,1) 内的随机数, 故  w 的取值范围为(0.5,1) 。显然, 此处引入的随机惯性权重没有 改变 SSA 算法的时间复杂度。

1.2 集成DE算法的变异操作

根据 SSA 算法的式(1), 在领导者位置更新操作中, 参与 者是食物源且没有追随者, 缺乏樽海鞘之间的协作和信息共 享, 容易导致 SSA算法过早收敛于较差的局部最优解。
变异操作是 DE 算法的重要组成部分, 它一般通过 3 个 不同的个体来为种群内每一个个体生成一个新个体, 通过比 例因子可以调节算法开发和勘探之间的平衡 。目前 DE 算法研究中最典型的变异操作有 5 种, 其中与 SSA 算法的式 (1)一样包含最优解且形式最简单的变异操作一般简称为:“DE/best/1” DE 。
综上所述, 本文提出用DE 算法的上述变异操作来替代 SSA 算法领导者的位置更新操作, 从而得到如式 (6) 所示的 领导者位置更新操作:

 基于疯狂自适应的樽海鞘群算法

 针对樽海鞘群算法求解精度不高和收敛速度慢等缺点,提出一种基于疯狂自适应的樽海鞘群算法. 引入Tent混沌序列生成初始种群,以增加初始个体的多样性;在食物源位置上引入疯狂算子,增强种群的多样性;在追随者位置更新公式中引入自适应惯性权重,使算法的全局搜索和局部搜索能力得到更好的平衡。 

1.1 Tent映射的种群初始化

樽海鞘群体的初始化对SSA算法的收敛速度与寻优精度至关重要. 在樽海鞘群初始时,由于没有任何先验知识可使用,基本上大部分群智能算法的初始位置均采用随机生成.

混沌序列具有随机性、遍历性和规律性等特点,通过其产生的樽海鞘群体有较好的多样性. 基本思路是通过映射关系在[0,1]区间产生混沌序列,将混沌序列转化到个体的搜索空间. 产生混沌序列的模型有许多,Tent映射比Logistic映射能够生成更好的均匀序列 . 本文采用Tent映射生成的混沌序列初始化樽海鞘群算法群体,其数学表达式为:

1.2 疯狂算子

在樽海鞘群算法中,种群的食物源位置有重要作用,引导着群体向最优解移动,但若食物源位置陷入局部最优,则容易导致群体出现搜索停止,即群体内多样性缺失. 樽海鞘在移动的过程中,食物源不可能一直保持其位置不变,它们可能会突然变换位置,以此来增加种群的意外行为. 本文采用“疯狂”因素来描述这种行为,其核心思想是通过疯狂变量对其进行建模. 为了减少SSA算法出现早熟的收敛现象,本文提出在樽海鞘群算法领导者的位置更新公式中引入一个疯狂算子,确保樽海鞘在预先设定的疯狂概率下,对食物源位置产生一定扰动,以此维持个体的多样性. 新的领导者更新公式如下:

在求解测试函数优化问题中,搜索范围变化较大. 为了使樽海鞘群算法前期搜索具有更好的全局性和随机性,本文选取多个领导者进行更新,但领导者太多,算法随机性较强,会导致算法稳定性降低,因此,为了权衡算法的随机性和稳定性,选取一半的樽海鞘个体作为领导者.

1.3自适应惯性权重

惯性权重ω体现的是追随者继承前一个樽海鞘位置的能力. 文献[14]将惯性权重ω 引入PSO算法中,分析指出:当惯性权重值较大时,有助于提升探索能力;当惯性权重较小时,有助于具体开发能力. 由式(5)追随者位置更新公式可知,第i只樽海鞘位置会根据第i和第i − 1只樽海鞘位置进行更新,对先前个体依懒性较强. 若追随者的位置是局部最优解,则会容易陷入局部最优,出现停滞. 为了更好地权衡樽海鞘群算法的探索能力与开发能力,引入线性递减的惯性权重,它决定了先前个体对当前个体的影响程度. 新的追随者位置公式为:

基于混合策略改进的樽海鞘群算法

(1)加权重心学习策略

本文提出了加权重心,根据个体的优劣状况使用不同的权重来计算重心,可以在不忽略较差个体的同时向更多优秀个体学习,合理利用了种群的信息,同时避免了只向最优个体学习陷入早熟。

修改后的公式可以在向最优解逐渐学习的同时没有过多丢失种群多样性。 w w w用来调节个体在搜索过程中对自身位置的依赖,搜索前期较低的 w w w可以降低个体对自身的依赖,从而增大了搜索的范围,算法的全局搜索能力得到增强。搜索后期 w w w逐渐向1靠拢,不影响算法寻优。

(2)自适应惯性权重

自适应惯性权重在很多群体智能优化算法中被使用,搜索前期权重较大,可以增强全局搜索能力,搜索后期自适应权重较小,可以增强局部寻优能力。使用的自适应惯性权重公式为

(3)逐维随机差分变异

使用随机差分变异进行逐维变异,通过该变异得到一个新的个体的维度,具体公式为

在种群位置更新完成后,使用逐维随机差分变异对个体的每个维度进行变异,某一维度进行变异后对其进行评价,如果优秀,则保留变异后的解,如果变异后评价结果变差,则舍弃较差的维度信息,减少了各个维度间的干扰,同时增大了搜索的范围。由于变异操作具有一定的盲目性,将所有个体都进行逐维随机差分变异势必会导致算法的搜索效率下降和计算量大幅的增加,所以仅挑选种群中最优秀和最差个体进行变异,对最优个体变异可以提高搜索效率,对最差个体变异可以提高搜索范围,跳出局部最优解。

(4)改进后的算法步骤

为了算法在迭代的前期能够有较强的全局搜索能力,选取种群中前一半的个体作为领导者,增多领导者可以增强算法的随机性。算法具体步骤如下:

a)初始种群和参数。初始化种群个体数量 N,最大迭代次数T,随机初始化种群位置。
b)计算种群每个个体的适应度,最优的个体作为食物位置。
c)根据位置更新公式更新个体位置。前一半个体为领导者使用式(4)进行更新,后一半个体为追随者使用式(6)进行更新。
d)对更新完的个体选择最优和最差个体,对其通过式(7)进行逐维随机差分变异,将更新的维度与其余维度组成新的个体,比较变异前后个体适应度值的变化,如果好则保留。
e)找出最优个体适应度值更新食物位置。
f)判断是否满足迭代次数要求或精度要求,若是转步骤g),否则返回步骤c)。
g)输出最优个体的适应度值。

基于自适应惯性权重的樽海鞘群算法

 为平衡SSA的全局和局部搜索能力,首先在追随者位置更新时引入基于非线性递减函数的惯性权重因子;然后引入种群成功率作为反馈参数对惯性权重因子自适应调整。此外,为防止陷入局部最优,对非最优个体进行差分变异,增加种群的多样性。

(1)惯性权重策略

本文引入基于非线性递减函数的惯性权重因子来评价樽海鞘链中第i−1只追随者对第 i i i只追随者的影响程度,改进的追随者位置更新公式如下:

(2)种群成功率策略

由公式(2)可以看出,  ω(t)按照关于迭代次数 t的非线性函数递减,因为不监测个体位置、适应度值等情况的变化,忽略了种群所处的实际环境,不能完全体现实际的优化搜索过程,因此,其本质上并不是自适应的。本文在此基础上引入种群成功率,并以此为反馈参数对公式(1)进一步改进,使得 ω(t)根据种群状态进行自适应调整。
以最小化问题为例,樽海鞘链的个体 i 在第 t 次迭代中的成功值 S(i,t)定义为

(3)差分变异策略

对非最优的个体进行变异,可以增加其在下次迭代中成为最优个体的可能性,提高算法跳出局部最优的能力。本文引入差分进化中个体变异的思想,根据变异算子DE/best/1对非最优个体进行变异:

 

(4)算法步骤

为了在随机性与稳定性之间取得权衡,本文选取一半的樽海鞘个体作为领导者。AIWSSA步骤如Algorithm 1所示。

算法拓展

改进的樽海鞘群算法

SSA 算法是一种模拟樽海鞘移动方式的种群优化算法。与 PSO WOA 等常用寻优算
法相比, SSA 算法不仅简单、灵活、易实现,且参数少。然而,同其他优化算法一样,传
统的 SSA 算法在收敛速度和求解精度等方面还存在不足。目前,一些学者针对 SSA 算法
的缺点提出了一系列改进方法,这些改进方法大致可分为两类:一是对领导者和追随者的
改进,二是与其他优化算法相结合。

(1) 对领导者和追随者的改进

Bairathi Gopalani [56] 提出了多领导樽海鞘群算法 (Multi Leader SSA, MLSSA) ,将传统
SSA 算法中樽海鞘链拆分成网状多链结构,有效提高了 SSA 算法的勘探能力。汤安迪等 [57]
在领导者位置更新中食物位置用精英池策略代替,增强领导者的搜索能力,并在追随者位
置更新中引入高斯分布策略,将链式规则改为优势种群,提高算法的寻优能力。白钰和彭
珍瑞 [58] 首先为自适应调整惯性权重因子,在惯性权重公式中引入非线性递减函数,并结合
种群成功率将其引入追随者公式,同时为提高算法的全局搜索能力,在非最优个体中引入
差分变异,使得非最优个体具有变异机制。 Nautiyal [59] 分别从邻域信息传递、全局搜索
能力和随机性三个方面,将高斯变异、柯西变异和 Levy 飞行变异分别与追随者相结合。
周密等 [60] 首先利用 Tent 混沌映射初始化种群位置,然后将种群均分为领导者和追随者,并
将疯狂算子引入领导者公式,将动态惯性权重和精英保留引入追随者公式。刘景森等 [61]
上一代樽海鞘位置和惯性权重引入领导者公式,增强领导者的全局搜索能力,并引入领导
- 跟随者数量自适应调整策略,提高算法的收敛速度。 Shekhawat [62] 将二进制进入 SSA
算法,将传统 SSA 算法中每个追随者适应度值转换为二进制,并将其应用到特征选择。
Ouaar Boudjemaa [63] SSA 算法提出了三种不同的改进方法,第一种方法是将局部信息
引入 SSA 算法以增强局部搜索能力,第二种方法是提出两个追随者樽海鞘,在追随者迭代
中引入差分进化和干扰项,第三种方法是对追随者的位置进行跳跃计算,削弱相邻樽海鞘
之间的相关性。

(2) 与其他优化算法相结合

周鹏等 [64] 首先利用 Tent 混沌映射初始化种群位置,然后将阶梯式惯性权重引入追随者
位置更新公式,最后将模拟退火算法和 SSA 算法相结合,利用 SSA 算法求解出最优解后
根据模拟退火算法进行微调。张铸等 [65] 首先将引力搜索算法中的加速度系数引入领导者位
置更新公式,然后在追随者位置更新公式中引入正态云模型。郑洪清等 [66] 首先将收敛因子
引入蝴蝶算法中以更新全局和局部位置,然后将改进算法与 SSA 算法相结合,提高算法的
全局和局部搜索能力。 Saafan [67] 提出了将 WOA SSA 相结合的算法,首先将 WOA
法中的线性关系替换成指数关系,然后设置特定条件,根据求解结果选择改进 WOA 或者
SSA 算法计算最优值。吴晓燕和刘笃晋 [68] SSA 算法的基础上引入 PSO 算法,在计算个
体樽海鞘适应度值后,根据设定阈值的大小,自适应地选择用 PSO 算法或 SSA 算法更新
樽海鞘的位置,增强空间搜索的多样性和灵活性。
Ibrahim [69] PSO SSA 算法相结合,
将所有个体适应度值相加作为总适应度值,然后计算最优解的适应度值与总适应度值,根
据比值和阈值的大小选择 PSO SSA 算法更新种群的位置,并将其应用于特征选择。
Jaganathan [70] 首先采用蚁群算法对图像进行增强,结合蚁群算法和神经网络识别感兴趣区
域,然后将 SSA 算法和蝗虫优化算法相结合,引入到 VGG-19 迁移学习技术中,从而在感
兴趣区域中提取特征

1.引言

针对 SSA 算法的不足,研究对领导者和追随者提出改进策略,以提高 SSA 算法寻优
速度和准确性。然后,将改进的 SSA 算法与 DPC 算法相结合,弥补传统聚类算法的不足,
提高遥感图像分割效果。研究内容包含如下:
(1) 改进樽海鞘群算法。首先,为均衡樽海鞘个体的局部开发和全局勘探能力,提出
多领导策略,在搜索过程中自适应调节樽海鞘群中领导者和追随者的数量;其次,为改进
领导者位置的更新策略,引入切比雪夫映射函数,增强领导者樽海鞘移动过程中的多样性,
增强全局搜索能力;最后,改进追随者位置更新,引入线性递减惯性权重,减少追随者对
前一个樽海鞘位置的依赖性,提高局部搜索能力。实验从常用群体优化测试函数中选择 4
个单峰函数和 4 个多峰函数作为实验测试数据,将三个单项改进策略分别与 SSA 算法相比
较,验证改进策略的有效性,最后将改进的 SSA 算法与其他算法相比较,验证改进算法的
收敛速度和收敛精度。
(2) 基于改进樽海鞘群的密度峰值聚类。首先,依据归一化局部密度和相对距离乘积,
以自适应选取聚类中心,从而避免人工选取的主观性;其次,在信息熵函数中引入密度测
度,以提出密度估计信息熵,并以此建立适应度函数;最后,通过最小化适应度函数,利
ISSA 算法求解密度估计信息熵中的最优值,得到最优截断距离参数。实验选取 4 个常
用于测试密度聚类算法的人工合成数据集作为测试数据,并与 DBSCAN DPC 算法相比
较,验证 DPC 结合改进樽海鞘群算法的有效性。
(3) 结合密度峰值聚类和改进樽海鞘群算法的遥感图像分割。首先,利用超像素分割
算法将遥感图像分为若干超像素块,每个超像素块具有包含位置和颜色的五维特征,然后
对所有超像素块的五维特征进行改进 DPC 算法聚类,以合并同质区域,实现遥感图像分割。
实验在 NWPU-RESISC45 数据集上选取 4 个不同场景以及 Worldview2 Quickbird 大尺度
遥感图像,并与不同图像分割算法相比较,验证本文算法的准确性和适用性。

2.改进樽海鞘群算法

SSA 算法中,主要包括两个核心过程:领导者位置更新和追随者位置更新,然而传
SSA 算法存在以下缺点:首先,在迭代过程的初始阶段,单一的领导者樽海鞘对全局搜
索能力具有较大的限制;其次,领导者位置更新公式中的参数为随机数,求解精度低;最
后,追随者位置更新中樽海鞘位置受前一个的影响,易陷入局部最优。
因此,为解决 SSA 算法的不足,提高收敛速度和求解精度,均衡全局和局部搜索能力,
提出了改进樽海鞘群算法 (Improved SSA, ISSA) ,具体改进策略如下:
(1) 自适应调节领导者和追随者数量,均衡樽海鞘个体的局部开发和全局勘探能力;
(2) 引入切比雪夫映射函数改进领导者更新机制,增强种群多样性,提高算法的求解
精度;
(3) 利用线性递减函数改进追随者位置更新机制,增强追随者的随机性,提高收敛速
度。
2.1 基于自适应多领导和混沌映射的领导者位置更新
SSA 算法中,领导者与最优值密切相关,领导者的数量影响算法的效率和准确性。
如果有较少的领导者,算法在迭代开始时就缺少有效的全局搜索能力。如果有较多的领导
者,则算法在迭代后期没有足够的局部搜索能力。因此,适当的领导者和追随者的数量在
兼顾全局和局部搜索中是非常重要的。然而,樽海鞘链中只有一个领导者,这大大限制了
领导者的全局搜索能力,容易陷入局部最优。为了解决这一问题,本文引入了余弦函数,
提出自适应多领导 SSA 算法,通过改变领导者和追随者的数量,提高算法前期全局勘探能
力和后期局部搜索能力。领导者数量为,
其中, n L 为领导者数量, N 为樽海鞘群数量。
因此,追随者数量为 N - n L 。在迭代循环初期, t 值较小,则 cos(∙) 趋近于 1 ,领导者数
n L = 0.5 N ,即樽海鞘群中有一半为领导者另一半为追随者。较多的领导者增强了算法全
局搜索能力,提高算法的收敛速度。在迭代循环后期, t 值较大,则 cos(∙) 趋近于 0 ,领导
者数量 n L = 0.1 N ,即樽海鞘群中有 0.1 N 个樽海鞘为领导者, 0.9 N 个为追随者。较少的领
导者继续进行全局搜索,剩余的追随者进行局部搜索,避免算法陷入局部最优,提高算法
的准确性。因此,自适应领导者的引入能够均衡不同迭代次数时领导者和追随者的数量,
从而兼顾算法的全局勘探能力和局部搜索能力。
由式 (2.21) 可知,领导者的位置更新主要受参数 c 1 c 2 的影响, c 1 为收敛因子,随循
环过程的迭代次数而变化,而 c 2 的取值决定了领导者全局探索的范围,若仅为 [0, 1]之间的
随机数则全局探索的过程存在盲目性,樽海鞘群中领导者的位置准确性较差。混沌映射是
由简单的确定性系统产生的随机性序列,具有遍历性和随机性的优点,因此用混沌映射代
替随机数能得到更好的效果,使得樽海鞘群在移动过程中具有多样性。在混沌映射中,切
比雪夫映射常被用来解决工程和优化问题,与其他映射算法相比,具有参数空间大、数据
分布均匀等特点,可以用来代替 c 2 。因此,参数 c2被重新定义为,
2.2 基于自适应权重的追随者位置更新
混沌映射的引入解决了樽海鞘群算法在前期收敛速度慢的问题,但在樽海鞘搜索后
期,由于追随者只受当前和前一个樽海鞘位置的影响,易陷入局部最优,无法搜索到最优
解,因此本文引入线性递减惯性权重,减少追随者对前一个樽海鞘位置的依赖性,加强 SSA
算法探索和开发的能力。线性递减惯性权重为,
综合上述改进策略, ISSA 算法的具体步骤如下:
step1 :设置樽海鞘群数量、搜索空间上下界和最大迭代次数;
step2 :按式 (2.20) 初始化樽海鞘群位置;
step3 :计算每个樽海鞘的适应度值;
step4 :将最优适应度的樽海鞘位置作为食物位置;
step5 :按式 (3.1) 计算领导者数量和追随者数量;
step6 :按式 (3.3) 更新领导者位置;
step7 :按式 (3.5) 更新追随者位置;
step8 :重复步骤 step3~7 ,直至达到最大迭代次数。
因此, ISSA 算法流程如图 3.1 所示。
1.3 实验结果与分析
所有实验在 Windows 10 系统下的 MATLAB 2015b 上进行的, CPU Intel Core
i7-5500U ,内存 8GB ,主频 2.40GHz
1.3.1 测试函数
为了验证改进算法的有效性,选取了 8 个测试函数进行比较实验,测试函数可分为两
类:单峰函数和多峰函数。表 3.1 列出了测试函数的定义,其中 F 1 ~ F 4 为单峰函数,单峰
函数可以测试算法的求解精度和收敛速度, F 5 ~ F 8 为多峰函数,多峰函数可以测试算法避
免局部最优能力和全局勘探能力。图 3.2 为单峰函数的三维仿真图,图 3.3 为多峰函数的
三维仿真图。

1.3.2 评价指标
在群体优化算法中,通常使用平均值、标准差、最优值和最差值来评价结果。平均值
反映了算法的平均性能,标准偏差反映了算法在运行期间的稳定性,最优值和最差值反映
了算法的求解精度。
1.3.3 单项改进有效性实验
为验证 ISSA 算法改进策略的有效性,将 ISSA 算法按改进策略拆分为自适应多领导的
樽海鞘群算法 (Adaptive Multi-leader SSA, AMSSA) 、切比雪夫映射的樽海鞘群算法
(Chebyshev Map SSA, CMSSA) 、 自 适 应 权 重 的 樽 海 鞘 群 算 法 (Adaptive Weight SSA,
AWSSA) ,每次运行单项改进策略的三种算法与标准 SSA 算法作对比实验,分别验证 ISSA
算法各个改进点的可行性。
(1) 自适应多领导策略有效性实验
为验证自适应多领导策略对 SSA 算法的改进是否有效,比较 SSA 算法和 AMSSA
法的求解能力。实验独立运行 30 次,樽海鞘种群规模设置为 20 ,迭代次数设置为 500
函数维度设置为 20 ,对比实验的数据结果见表 3.2。
分析表 3.2 中数据可知,相较于标准 SSA 算法, AMSSA 算法在收敛精度和稳定性方
面均有更好的整体表现。从求解精度角度进行分析, AMSSA 算法相较于 SSA 算法在 F 1
上的寻优精度提高了 1 个数量级;在 F 2 上的寻优精度提高了 1 个数量级;在 F 3 上的寻优
精度提高了 6 个数量级;在 F 4 上的寻优精度提高了 1 个数量级;在 F 5 上的寻优精度提高
1 个数量级;在 F 6 上的寻优精度提高了 2 个数量级;在 F 7 上的寻优精度提高了 1 个数
量级;在 F 8 上的寻优精度提高了 2 个数量级。从稳定性角度进行分析, AMSSA 算法相较
SSA 算法在 F 1 上的标准差降低了 3 个数量级;在 F 2 上的标准差降低了 1 个数量级;在
F 3 上的标准差降低了 4 个数量级;在 F 4 上的标准差降低了 1 个数量级;在 F 5上具有相同
数量级的标准差并略有降低;在 F 6 上的标准差降低了 1 个数量级;在 F 7 上的标准差降低
1 个数量级;在 F 8 上具有相同数量级的标准差并略有降低。从上述实验结果可知,自适
应多领导策略能够帮助 SSA 算法取得更好的求解效果。这是因为 AMSSA 算法在迭代过程
中能够自适应地调节领导者和追随者的数量,在迭代前期较多的领导者可以提高全局搜索
能力,加快搜索速度,在迭代后期较多的追随者可以提高局部勘探能力,从而提高搜索的
准确性。
(2) 切比雪夫映射改进领导者位置策略有效性实验
为验证切比雪夫映射改进领导者位置策略对 SSA 算法的改进是否有效,比较 SSA
法和 CMSSA 算法的求解能力。实验独立运行 30 次,樽海鞘种群规模设置为 20 ,迭代次
数设置为 500 ,函数维度设置为 20 ,对比实验的数据结果见表 3.3。
分析表 3.3 中数据可知,相较于标准 SSA 算法, CMSSA 算法在收敛精度和稳定性方
面均有更好的整体表现。从求解精度角度进行分析, CMSSA 算法相较于 SSA 算法在 F 1
上的寻优精度提高了 2 个数量级;在 F 2 上具有相同数量级的的寻优精度并略有提高;在
F 3 上的寻优精度提高了 4 个数量级;在 F 4 上的寻优精度提高了 1 个数量级;在 F 5 上具有
相同数量级的寻优精度并略有提高;在 F 6 上的寻优精度提高了 5 个数量级;在 F 7 上的寻
优精度提高了 2 个数量级;在 F 8 上的寻优精度提高了 2 个数量级。从稳定性角度进行分析,
CMSSA 算法相较于 SSA 算法在 F 1 上的标准差降低了 1 个数量级;在 F 2 上的标准差降低
1 个数量级;在 F 3 上的标准差降低了 4 个数量级;在 F 4 F 5 上具有相同数量级的标准
差并略有降低;在 F 6 上的标准差降低了 6 个数量级;在 F 7 上的标准差降低了 2 个数量级;
F 8 上的标准差降低了 1 个数量级。从上述实验结果可知,切比雪夫映射改进领导者位置
策略能够帮助 SSA 算法取得更好的求解效果。这是因为 CMSSA 算法用切比雪夫映射函数
代替 SSA 算法中的随机数,改善了全局搜索的盲目性,使得领导者樽海鞘在搜索空间中具
有良好的遍历性,提高了算法的求解精度。
(3) 线性递减惯性权重改进追随者位置策略有效性实验
为验证线性递减惯性权重改进追随者位置策略对 SSA 算法的改进是否有效,比较 SSA
算法和 AWSSA 算法的求解能力。实验独立运行 30 次,樽海鞘种群规模设置为 20 ,迭代
次数设置为 500 ,函数维度设置为 20 ,对比实验的数据结果见表 3.4。
分析表 3.4 中数据可知,相较于标准 SSA 算法, AWSSA 算法在收敛精度和稳定性方
面均有更好的整体表现。从求解精度角度进行分析, AWSSA 算法相较于 SSA 算法在 F 1
上的寻优精度提高了 50 个数量级;在 F 2 上的寻优精度提高了 26 个数量级;在 F 3 上的寻
优精度提高了 46 个数量级;在 F 4 上的寻优精度提高了 2 个数量级;在 F 5 AWSSA 算法
收敛到了全局最优值;在 F 6 上的寻优精度提高了 8 个数量级;在 F 7 AWSSA 算法收敛
到了全局最优值;在 F 8 上的寻优精度提高了 3 个数量级。从稳定性角度进行分析, AWSSA
算法相较于 SSA 算法在 F 1 上的标准差降低了 50 个数量级;在 F 2 上的标准差降低了 27
数量级;在 F 3 上的标准差降低了 47 个数量级;在 F 4 上的标准差降低了 3 个数量级;在
F 5 F 6 F 7 AWSSA 算法获得了理想状态的标准差值,而 SSA 算法求解精度不稳定;
F 8 上的标准差降低了 2 个数量级。从上述实验结果可知, AWSSA 算法将惯性权重引入
追随者位置更新策略能够大幅度提高标准 SSA 算法的求解效果。这是因为惯性权重的引入
减弱了追随者对上一代前一个追随者的依赖,增强了移动的多样性和遍历性,提高了算法
搜索勘探能力。
综合以上单项改进策略有效性实验,结果表明本文提出的自适应多领导策略、切比雪
夫映射策略、线性递减惯性权重策略均能够在不同程度上提升 SSA 算法的精度和稳定性。
然而,实验将整体改进算法拆分为各个单项改进策略进行独立实验验证,使得各个改进策
略之间失去了协调配合能力,难以达到最大化改进 SSA 算法的寻优效果。因此,这三个改
进策略是息息相关的,在迭代过程中,按照自适应多领导策略计算领导者和追随者数量,
以均衡其全局勘探和局部搜索能力,增强种群的多样性,使算法在迭代过程的不同阶段发
挥有效作用。将切比雪夫映射函数引入领导者位置更新,代替原始算法中的随机数,增强
领导者搜索的有序性和遍历性,提高算法的搜索效率。在追随者位置更新中,引入线性惯
性权重,增强追随者移动的多样性,避免其陷入局部最优,提高搜索精度。综上所述,以
上三种改进策略需要共同协作才能完全发挥 ISSA 算法的寻优能力。
1.3.4 结果分析
为验证 ISSA 算法的有效性,选取 PSO 算法 [23] CS 算法 [25] SSA 算法 [26] MLSSA
[56] CSSA 算法 [74] 作为对比算法。实验设置种群为 50 ,迭代次数为 500 ,函数维度设置
20 。对比算法的参数设置与各算法原文献保持一致。所有算法在 8 个标准测试函数上独
立运行 30 次,记录每次运行结果,通过统计实验数据中 mean std best worst 考察算
法性能。表 3.5 为算法对比的实验结果。
根据表 3.5 分析可知,从收敛精度分析来看, ISSA 算法在函数 F 1 F 2 F 3 F 4 F 6
F 8 的寻优精度相较于对比算法均在不同程度上有所提高,且在函数 F 5 F 7 的寻优中达
到了理想效果。相较于 SSA 算法, ISSA 算法在上 F 1 的寻优精度提高了 55 个数量级;在
F 2 上的寻优精度提高了 31 个数量级;在 F 3 上的寻优精度提高了 57 个数量级;在 F 4 上的
寻优精度提高了 9 个数量级;在 F 6 上的寻优精度提高了 15 个数量级;在 F 8 上的寻优精度
提高了 9 个数量级。总体而言, PSO 算法和 CS 算法在 8 个测试函数上的寻优精度较低,
SSA 算法与 PSO 算法、 CS 算法相比在函数 F 1 F 3 F 4 F 5 F 7 F 8 寻优精度有所提高,
CSSA MLSSA SSA 算法的改进算法,虽在测试函数上寻优精度均有所提高,但与 ISSA
算法相比提高效果不明显。从收敛稳定性分析看来, ISSA 算法在函数 F 1 F 2 F 3 F 4
F 6 的均有较好的标准差,且在函数 F 5 F 7 F 8 的标准差达到了理想效果。相较于 SSA
法,
ISSA 算法在 F 1 上的标准差降低了 55 个数量级;在 F 2 上的标准差降低了 33 个数量级;
F 3 上的标准差降低了 57 个数量级;在 F 4 上的标准差降低了 9 个数量级;在 F 8 上的标
准差降低了 8 个数量级。总体而言, PSO 算法和 CS 算法在测试函数中的标准差较大,寻
优精度不稳定, CSSA 算法和 MLSSA 算法比 SSA 算法标准差更小,稳定性更好,相比之
下,本文提出的 ISSA 算法标准差最小,稳定性优于其他算法。
箱线图常用于反映数据分布一致性和位置,是利用数据中的五个统计量:最小值、第
一四分位数、中位数、第三四分位数与最大值来描述数据的一种方法。一组数据按照从小
到大顺序排列后,把该组数据四等分的数,称为四分位数。下四分位数、中位数和上四分
位数分别等于该样本中所有数值由小到大排列后第 25% 50% 75% 对应位置处的数值。
绘制箱线图的矩形,上限为上四分位数,下限为下四分位数,矩形内部横线为中位数的位
置,矩形的高度反映了数据的波动程度。数据的最大值和最小值分别为上边缘和下边缘。
处于上下边缘以外的数据为异常值。图 3.4 为箱线图的示意图。
在种群优化算法中,箱线图常用于检验算法的稳定性和准确性。因此,本文利用箱线
图展示独立运行实验的最优适应度值的数据特征。图 3.5 为单峰函数箱线图结果,图 3.6
为多峰函数箱线图结果。
根据图 3.5 结果图分析可知,在函数 F 1 上, PSO 算法较稳定,无异常值,但算法的准
确性较差,适应度值的中位数在 0.05 左右; CS 算法中存在一个异常值,适应度值的中位
数在 0.15 附近; SSA 算法和 MLSSA 算法适应度值较为稳定,但各存在一个异常值; CSSA
算法和 ISSA 算法适应度值较稳定,无明显异常值,准确性较好。在函数 F 2 上, PSO 算法
有一个异常值,适应度值中位数在 0.2 附近,准确性相对较差; CS 算法存在 5 个异常值,
算法稳定性较差,适应度值中位数在 0.1 附近; SSA 算法有 4 个异常值,其稳定性较差;
CSSA 算法、 MLSSA 算法和 ISSA 算法的适应度值在 0 附近,准确性较好,且各算法仅存
在一个异常值。在函数 F 3 上, PSO 算法无异常值,稳定性较好,但其适应度值中位数在
0.05 附近,算法的准确性不足; CS 算法存在 4 个异常值,稳定性差,且适应度值中位数在
0.04 附近,准确性也不理想; SSA 算法与 PSO 算法、 CS 算法相比,准确性稍有提高,在
0.03 附近,但在稳定性上存在 2 个异常值; CSSA 算法存在 4 个异常值,稳定性较差,适
应度值中位数在 0.01 附近; MLSSA 算法和 SSA 算法结果相似,分别有一个异常值,准确
性都在 0 附近。在函数 F 4 上, PSO 算法的准确性最差,适应度值中位数在 2.2 附近,且存
在一个异常值; CS SSA CSSA MLSSA ISSA 算法的适应度值中位数均在 0 附近,
准确性较好,但 CS 算法存在一个异常值,稳定性相对较差。综合来看,在单峰函数上,
PSO 算法和 CS 算法的准确性和稳定性较差, SSA 算法次之, CSSA 算法和 MLSSA 算法
随在准确性上有所提高,但仍存在异常值的问题,ISSA 算法在准确性和稳定性上效果最好。
根据图 3.6 结果图分析可知,在函数 F 5 上, PSO 算法和 CS 算法均无异常值,稳定性
较好, PSO 算法适应度值中位数在 15 附近, CS 算法适应度值中位数在 13 附近; SSA
法存在 2 个异常值,稳定性最差,适应度值中位数在 14 附近,准确性较差; CSSA 算法适
应度值中位数在 12 附近,且存在一个异常值; MLSSA 算法虽无异常值,但适应度值中位
数在 8 附近,准确性较差;
ISSA 算法适应度值中位数在 0 附近,准确性较好,且无异常值。
在函数 F 6 上, PSO 算法适应度值中位数在 0.1 附近,存在 2 个异常值; CS 算法适应度值
中位数在 2 附近,准确性最差,但无异常值; SSA 算法适应度值中位数在 1.2 附近,虽无
异常值,但矩形较高,数据分散; CSSA 算法存在一个异常值,适应度值中位数在 0.1
近; MLSSA 算法适应度值中位数在 0 附近,虽有较好的准确性,但存在四个异常值,稳
定性差; ISSA 算法适应度值中位数在 0 附近,准确性较好,且无异常值。在函数 F 7 上,
PSO 算法适应度中位数在 0.15 附近,无异常值; CS 算法适应度中位数在 0.18 附近,存在
一个异常值; SSA 算法和 CSSA 算法均无异常值,适应度中位数分别在 0.18 0.08 附近;
MLSSA 算法和 ISSA 算法适应度中位数均在 0 附近, MLSSA 算法存在一个异常值。在函
F 8 上, PSO 算法和 CS 算法适应度中位数均在 0.01 附近, PSO 算法存在一个异常值,
CS 算法存在两个异常值; SSA 算法适应度中位数在 0.02 附近,且存在一个异常值; CSSA
MLSSA ISSA 算法适应度中位数均在 0 附近, CSSA 算法和 MLSSA 算法各存在两个异
常值, ISSA 算法仅存在一个异常值。综合来看, PSO CS SSA 算法虽然具有良好的稳
定性,但准确性较差, CSSA 算法和 MLSSA 算法虽然具有良好的准确性,但稳定性较差,
而 ISSA 算法兼顾了准确性和稳定性两个方面,效果较好。
除了表 3.5 所用 4 个指标外,统计检验是验证改进算法有效性的另一个特征,因此本
文引入 Wilcoxon 统计检验来分析 ISSA 算法与其他比较算法的结果差异。 p-value H
Wilcoxon 统计检验的结果。如果 p-value 小于 0.05 ,则 H 等于 1 ,表示 ISSA 算法的寻优效
果比其他算法显然不同;相反,若 p-value 大于 0.05 ,则 H 等于 0 ,表示 ISSA 算法的寻优
效果与其他算法的寻优效果无显著差异。表 3.6 ISSA 算法与对比算法的 Wilcoxon 统计
检验结果。
由表 3.6 可知, ISSA 算法在函数 F 1 F 2 F 3 上的 p-value 值均达到了 3.02E-11 ,在函
F 4 ISSA 算法与 PSO CS ISSA 算法的 p-value 值为 3.02E-11 ,与 CSSA 算法和 MLSSA
算法的 p-value 值稍有降低,在多峰函数 F 5 F 6 F 7 F 8 上的 p-value 值达到了 1.21E-12。综上所述,与其他算法相比,ISSA 算法的求解效果更好,显著性更强。
此外,测试函数的收敛曲线可以更直观地展示算法的收敛速度和跳出局部极值的能
力,因此本文具体分析了 ISSA 算法和比较算法在 8 个测试函数上的收敛曲线,图 3.7 为单
峰函数迭代曲线结果图,图 3.8 为多峰函数迭代曲线结果图。
根据图 3.7 结果图分析可知,在函数 F 1 上, PSO 算法和 SSA 算法收敛曲线平缓,收
敛效果最慢; CS 算法的收敛速度虽然略有提高,但收敛精度较差; CSSA 算法和 MLSSA
算法在迭代至 200 次时收敛曲线平缓,在此之后收敛曲线稍微陡峭,收敛速度变快,但最
终的收敛精度仍不理想;
ISSA 算法在迭代至 50 次时收敛曲线最陡峭,之后收敛曲线略缓,
但较其他算法仍最为陡峭。在函数 F 2 上, PSO 算法、 SSA 算法和 CSSA 算法收敛曲线均
较为平缓,收敛速度较慢,收敛精度也较差; CS 算法和 MLSSA 算法虽在收敛速度和收敛
精度均有所提高,但仍达不到理想效果; ISSA 算法收敛曲线最陡峭,收敛速度最快,且在
迭代至 500 次时达到了最优值。在函数 F 3 上, PSO CS SSA 算法收敛速度较慢,收敛
精度较差; CSSA 算法和 MLSSA 算法均略有提高; ISSA 算法收敛曲线最陡峭,收敛精度
最优。在函数 F 4 上, PSO 算法在迭代前期收敛曲线较为陡峭,在迭代至 50 次时,收敛速
度变慢,收敛曲线平缓; CS 算法在迭代至 280 次时,收敛曲线逐渐平缓; SSA 算法在迭
代至 90 次时收敛速度最快,但在后期迭代停滞,未能达到理想的收敛精度; CSSA 算法在
迭代初期出现停滞现象,在迭代至 160 次时跳出局部极值,收敛曲线开始下降,在迭代后
期又出现停滞; MLSSA 算法在迭代至 200 次时停滞迭代,最终未能达到理想值; ISSA
法在迭代前期收敛曲线较为陡峭,虽在迭代过程中同对比算法一样出现停滞现象,但收敛
精度高,在迭代至 300 次时达到了最优值。综合来看,在单峰函数上,相较于对比算法,
ISSA 算法收敛曲线最为陡峭,收敛速度最快,且收敛精度最好,收敛能力最优。
根据图 3.8 结果图分析可知,在函数 F 5 上,五个对比算法在收敛速度和收敛精度上效
果均较差;
ISSA 算法收敛曲线非常陡峭,在迭代至 180 次时便达到了最优值,收敛速度快。
在函数 F 6 上, PSO 算法收敛曲线最为平缓,且收敛精度最差; CS 算法在迭代前期收敛速
度较慢,虽在迭代后期收敛曲线有所下降,但在迭代至 500 次时仍未达到较好的收敛精度;
SSA 算法在迭代至 150 次时收敛曲线趋于平缓,呈现出收敛早熟的现象; CSSA 算法和
MLSSA 算法在迭代前期收敛速度最慢,在迭代至 250 次时收敛速度加快,最终收敛轻度
略有提高; ISSA 算法收敛速度最快,在迭代至 370 次时达到了理想的收敛精度。在函数
F 7 上, PSO CS SSA CSSA 算法收敛速度和收敛精度相似,均未达到理想效果; MLSSA
算法虽在收敛精度上略有提高,但在收敛速度上仍有不足;
ISSA 算法在迭代至 240 次时达
到了最优值,且收敛曲线最为陡峭,收敛速度最快。在函数 F 8 上, PSO 算法、 CS 算法和
SSA 算法在不同程度上出现迭代停滞、收敛早熟的现象,后期迭代效果较差; CSSA 算法
在迭代前期收敛速度较快,但在迭代后期收敛速度略有下降,整体收敛效果较差; MLSSA
算法在迭代前期出现停滞,在迭代中期收敛曲线下降,在迭代后期迭代曲线趋于平缓,最
终收敛精度较差; ISSA 算法虽在迭代中期出现了停滞迭代,陷入局部最优的情况,但迭代
350 次时达到了最优值,收敛精度优于对比算法。综合来看,在多峰函数上, ISSA 算法
收敛速度和收敛精度远优于对比算法,收敛能力更强。

结合密度峰值聚类和改进樽海鞘群算法的遥感图像分割

1.1 基于超像素密度峰值聚类的图像分割

在标准 DPC 算法中,局部密度和相对距离是两个重要参数,而计算两个参数的基础是
距离矩阵。在遥感图像分割算法中,距离矩阵是两两像素点之间的欧式距离,若遥感图像
共有 n 个像素点,则距离矩阵为 n × n 大小的对称阵。然而,遥感图像通常像素点较多,
若直接利用 DPC 算法计算量很大,非常耗时。因此,本文首先利用 SLIC(Simple Linear
Iterative Clustering) 算法对遥感图像进行超像素分割,得到具有五维特征的图像块,然后利
ISSA 算法优化 DPC 算法,最后对图像块进行聚类,实现遥感图像分割。
1.1.1 基于 SLIC 的超像素分割
SLIC 算法 [77] 是超像素分割算法中较为常用的算法,与其他超像素算法相比, SLIC
像素算法对自然彩色图的分割速度更快,得到的超像素更加规整且拥有较高的召回率。同
时, SLIC 算法对于高分辨遥感图像同样具有较好的分割效果。
(1) 颜色空间转换
SLIC 算法的像素点之间的颜色特征相似度是基于 CIELab 颜色空间计算的,而通常
的高分辨率遥感图像是基于 RGB 空间。因此,需要将 RGB 空间转换到 CIELab 颜色空间,
以下是两个颜色空间以及之间的转换关系。
RGB 颜色空间是通过三原色来表示一幅图像,其颜色空间模型如下图 4.1 所示,
在图 4.1 中三个方向轴线表示 R G B 值,取值范围为 [0, 255] ,坐标原点的 R G
B 值均为零,表示为黑色。
国际照明委员会 (CIE) 定义了一种 CIELab 颜色空间,该颜色空间可以完整的描述人眼
视觉对颜色的可见范围。在 CIELab 颜色空间中, l 是亮度,取值范围 [0, 100] a b 是两
个颜色通道,取值范围 [-128, 127]
RGB 颜色空间到 CIELab 颜色空间的转换为,
(2) 聚类中心的确定
(3) 像素点聚类
在确定了初始聚类中心后,则需对整个图像的像素点进行聚类。首先,构建相似性准
则,并对每个超像素块的聚类中心设置一个标签,然后将超像素块中的每个像素分别与聚
类中心相比较,计算其相似性,最后将相似性最大的聚类中心的标签赋予各像素,并将标
签相同的像素划分为同一类别。
在图像聚类过程中,传统 k-means 算法必须对整个图像的每个像素点与所有聚类中心
按照一定的相似性进行比较,而 SLIC 算法则在给定大小的窗口内进行搜索,以实现小范
围内的快速聚类。下图给出了两个算法的搜索策略比较,
如图 4.2 所示, SLIC 算法仅在 2 S 2 S 大小的搜索窗口内计算每个像素与聚类中心的相
似度,因此有效避免了全图搜索,降低了计算上的复杂度,从而提高了图像分割速度。同
时, k-means 算法在计算相似度时,仅依据像素的位置特征,而 SLIC 算法同时根据位置和
颜色特征,并将权重系数引入颜色特征,通过调整权重的大小改变超像素块的紧凑度。
SLIC 算法根据像素点间的空间距离 d s 和颜色距离 d r 构建距离矩阵 D , 然后根据 D 判断
像素间的相似性,其计算公式为,
(4) 聚类中心的更新迭代及优化
首先,将各超像素块的中心作为新的聚类中心,聚类中心的位置特征为超像素块的中
心位置,颜色特征为超像素块的颜色均值,然后不断迭代更新。当连续两次迭代的聚类中
心特征均值差异小于一定误差或达最大迭代次数时,则停止迭代。完成超像素块聚类后,
通常在图像复杂区域会出现孤立像素点情况,因此需设置阈值 r 判断哪些为孤立区域,然
后利用开运算,计算其到周围超像素的特征距离,再并将其合并到距离最近的超像素块内,
实现最终图像分割。
SLIC 超像素对遥感图像分割的步骤如下:
step1 :初始化聚类中心,像素标签矩阵,距离矩阵;
step2 :按式 (4.6) 计算每个超像素块内各像素点到聚类中心的距离,若小于之前的值,则更
新像素标签和距离矩阵;
step3 :计算每个超像素块 5 维特征的均值更新聚类中心;
step4 :重复步骤 step2~3 ,直到达到迭代次数;
step5 :对每个超像素块进行开运算,消除小于阈值 r 的孤立区域。
1.1.2 密度峰值聚类算法

 

对比式 (4.7) (4.9 ) ,式 (4.7) 结果为离散值,不同数据点局部密度相同的可能性较大;
而式 (4.9) 的计算结果为连续值,不同数据点局部密度相同的可能性很小,因此按式 (4.9)
算局部密度更好。
DPC 算法的主要思想是:计算相邻数据点的相对距离 δ i 和局部密度 ρ i ,然后分别将其
作为横轴和纵轴构建决策图,根据决策图人工框选数据点的聚类中心,然后将其它数据点
划分到密度比其大且距离最近的点簇中,最后得到所有数据点的聚类标签。
4.3 为构造决策图的示例图,其中图 4.3(a) 为数据点的分布情况,数据集中包含两个
类簇,分别为蓝色和红色数据,黑色数据表示噪声点。根据 DPC 算法求解后,得到图 4.3(b)
所示决策图,在决策过程中可以发现点 1 和点 10 的局部密度和相对距离都相对较高,因
此被标记为中心点。点 26 27 28 的局部密度相对较低,但相对距离相对较高,因此被
标记为噪声。其他的点将被分配到它的最近邻且密度比其大的数据点所在的簇中去。
DPC 算法中,截断距离 d c 是最重要的参数,直接影响聚类效果,其值过大或过小
均无法达到最优聚类效果。图 4.4 为截断距离取不同值时的聚类结果,当 d c =0.001 时,同
一类数据点明显错分成了三类,当 d c =1.000 2.000 时,不同类别的数据点被划分为同一
类,当 d c =0.010 0.100 时,大部分数据点分类正确,但在每个点簇边界区域的数据点聚
类出现偏差。由此可见,截断距离 d c 选取是 DPC 算法的关键问题。
DPC 算法的具体步骤如下:
step 1 :计算数据集距离矩阵;
step 2 :设置截断距离 d c
step 3 :按式 (4.9) (4.10) 计算局部密度和相对距离;
step 4 :根据局部密度和相对距离生成决策图;
step5 :根据决策图,将局部密度和相对距离都相对较高的点标记为聚类中心点;
step 6 :将其余数据点分配给距离最近且密度比其大的类簇中。

1.2 基于改进樽海鞘群的密度峰值聚类模型求解 

 

当聚类结果混乱时,信息熵较大,当聚类结果稳定时,信息熵较小,因此可以通过最
小化信息熵得到最优聚类结果。然而,式 (4.12) 结构复杂,无法通过常用的求导方式得到最
小值处的 d c ,因此可将式 (4.12) 作为适应度函数,利用 I SSA 算法寻找最小值处的 d c
在传统的密度峰值算法中,根据局部密度和相对距离构建决策图,并据此人工选取聚
类中心,而在聚类中心的选取中不可避免地产生误差。为了自动选取聚类中心,定义参数
γ ,表示局部密度和相对距离的乘积值;对 γ 降序排序,排在前面的数据点对应聚类中心。
同时,为了避免 ρ δ 量级不同对聚类效果造成影响,对两者均进行归一化处理,则参数定
义如下 γ

 

综上所述,本文所提出的遥感图像分割具体步骤如下:
step1 :对遥感图像进行超像素分割;
step2 :计算超像素块的距离矩阵;
step3 :将式 (4.12) 作为适应度函数;
step4 :利用 ISSA 算法求解最优截断距离 d c
step5 :按式 (4.9) (4.10) 计算局部密度和相对距离;
step6 :按式 (4.13) 对降序排序后的结果选取前 k 个点作为聚类中心;
step7 :将其余数据点分配给距离最近且密度比其大的类簇中;
step8 :按照超像素块的标签,实现遥感图像分割。

1.3 实验结果与分析

1.3.1 基于改进樽海鞘群搜索的密度峰值聚类有效验证
为验证结合 DPC 算法和 ISSA 算法 (DPC-ISSA) 的有效性,实验采用常用于测试密度聚
类算法的 4 个人工合成数据集,表 4.1 列出数据集的数据点数和点簇数,包括 Aggregation [79]
Compound [80] D31 [81] Flame [82] 数据集,所有数据集均为 2 维数据。图 4.5 为数据点在其
特征空间的分布及真实标签。

 

实验所用数据集均有真实聚类标签,因此选用聚类精度 (Accuracy, AC) 和标准互信息
(Normalized Mutual Information, NMI) 作为评价指标。两个评价指标值均在 [0, 1] 范围内。评
价指标值越接近于 1 ,说明聚类效果越好,聚类结果越准确,若越接近于 0 ,则反之。

 

其中, p ( x , y ) x y 的联合分布概率, H ( X ) H ( Y ) 分别为 X Y 的信息熵, X 为真实标
签, Y 为聚类标签。
实验将 DBSCAN DPC 作为对比算法,与 DPC-ISSA 4 个数据集上进行实验并比
较其结果。图 4.6 所示为各算法在 4 个数据集的实验结果。
在图 4.6 中, 1-4 对应 DBSCAN DPC DPC-ISSA 算法, a-d 对应 Aggregation
Compound D31 Flame 数据集。从图 4.6 可以看出,对 Aggregation 数据集, 2 个比较算
法对相连数据点均出现错误聚类,而 DPC-ISSA 算法能够有效识别各个不同点簇,聚类效
果较好。对 Compound 数据集, 3 个算法均没有将右侧距离相近的数据点分开,其中
DBSCAN 算法将数据集仅仅分成了 2 个点簇,没有将所有点簇分开; DPC 算法对位于左
下侧的数据点分类结果较好,将数据点分成了两类,而没有将右上侧两簇数据点分开;
DPC-ISSA 算法在数据集不同密度分布处均分类正确。对 D31 数据集, DBSCAN DPC
算法将点簇周围的点识别为噪声点,提出算法对于不同的点簇分类效果均较好。对 Flame
数据集, DBSCAN 没有将 花朵 花叶 形点簇分开,均分为同一个点簇; DPC 算法将部
分“花叶”错分为“花朵”,而 DPC-ISSA 算法则能将其完整地分开,分类效果较好。
4.2 为不同密度算法在人工合成数据集上实验结果的定量评价,分析可知,在
Aggregation 数据集上, DPC-ISSA 算法比 DBSCAN 算法的 AC NMI 分别高 21.5% 0.16
DPC 算法分别高 0.042 0.038 。在 Compound 数据集上, DBSCAN 算法 AC NMI
差, DPC 算法的精度均没有达到 0.8 ,而 DPC-ISSA 算法的精度均在 0.9 以上。在 D31
据集上, DBSCAN 算法精度最差, DPC-ISSA 算法的精度比 DPC 算法略有提高。在 Flame
数据集上, DPC-ISSA 算法达到了最优聚类结果,而 DBSCAN 算法和 DPC 算法精度均较
差。整体而言, DPC-ISSA 算法具有有较好的聚类效果。
1.3.2 遥感图像分割结果
NWPU-RESISC45 是由西北工业大学创建的遥感图像场景分类基准,该数据集中图像
尺度为 256 × 256 像素,共 31500 张图像,涵盖 45 个场景类别,其中每个类别有 700 张图
像。为验证本文算法的有效性和准确性,在 NWPU-RESISC45 数据集上选取 4 幅遥感图像
进行实验,如图 4.7 所示。其中,图 4.7(a) 为草地,地物主要包括草地、林地和道路三类;
4.7(b) 为机场,地物主要包括飞机和停机坪两类;图 4.7(c) 为机场,地物主要包括跑道、
地标和草地;图 4.7(d) 为农场,图像中的地物主要包括房屋、草地、灌木和道路四类。

 

实验将 DPC 算法、结合 SLIC DBSCAN 算法 (SLIC-DBSCAN) [39] 以及结合 SLIC
DPC 算法 (SLIC-DPC) [46] 作为对比算法,分别在遥感图像上进行图像分割。图 4.8-11 为不同
算法在 4 个遥感图像上的分割结果。
从 图 4.8 可 以 看 出 , DPC 算 法 林 地 和 草 地 区 域 分 割 结 果 包 含 较 多 的 噪 声 ;
SLIC-DBSCAN 算法在林地区域的边界部分出现分割错误,在草地区域出现误分现象,且
道路分割效果较差; SLIC-DPC 算法在林地区域出现噪声,道路的连通性较差;本文算法
在林地区域分割效果较好,无噪声,虽在中间道路处出现断开的现象,但相较于对比算法,
本文算法的整体分割效果较好。
从图 4.9 可以看出, DPC 算法分割效果最差,误将图像中的阴影分为一类,没有将飞
机分割出来; SLIC-DBSCAN 算法和 SLIC-DPC 算法虽能从背景中将飞机分割出来,但完整性较差;本文算法分割效果最优,飞机分割的完整性较好。

从图 4.10 可以看出, DPC 算法分割图中存在较多的噪声; SLIC-DBSCAN 算法中部分
地标没有分割出来; SLIC-DPC 算法和本文算法地标完整性相对较好,而且本文算法的边
界准确性和噪声现象最佳。
从图 4.11 可以看出, DPC 算法在草地和灌木区域噪声较多,分割效果差;
SLIC-DBSCAN 算法误会、将建筑物和道路分为一类; SLIC-DPC 算法在灌木区域处出现
误分现象;本文算法整体分割效果较为理想。
为了更直观地评价本文算法对遥感图像分割效果,需要对各算法分割结果进行定量评
价,将图 4.12 所示的人工分割结果作为评价的标准分割图。
因此,本文选择常用于图像分割精度评价的三个指标:概率兰德指数 (Probabilistic Rand
Index, PRI) 、 变 换 信 息 量 (Variation Of Information, VOI) 和 全 局 一 致 性 误 差 (Global
Consistency Error, GCE) 作为评价指标。
(1) PRI 。根据统计实际分割结果与标准分割结果中标签一致的像素对比例实现分割质
量评价,即,
(2) VOI 。度量实际分割结果与标准分割结果之间信息熵的差异以实现分割质量评价,
即,

 

 (3) GCE。基于实际分割图与标准分割图之间区域的重叠程度实现分割质量评价,即,

 

实验在上述三种评价指标上对 DPC 算法、 SLIC-DBSCAN 算法、 SLIC-DPC 算法和本
文算法不同实验结果进行定量评价,各算法在遥感图像分割结果的定量评价如表 4.3 所示。
从表 4.3 实验结果可知, DPC 算法的三个指标精度最差; SLIC-DBSCAN 算法和
SLIC-DPC 算法的精度均有所提升,其中 SLIC-DBSCAN 算法在图 4.8(a) (b) 分割精度整
体而言优于 SLIC-DPC 算法, SLIC-DPC 算法在图 4.8(c) (d) 分割精度相对较好;本文算法
三个指标精度均优于其他对比算法,在图 4.8(a) 中本文算法的 PRI 达到 0.9 ,相较于 DPC
算法提高了 0.2 左右,在图 4.8(b) 中的 VOI GCE 分别达到 0.7918 0.0652 。由此,本文
算法在遥感图像中分割质量较好。
为验证本文算法的适用性,选取 2 幅大小为 1024 × 1024 像素的 Worldview2 Quickbird
彩色图像进行实验,分辨率分别为 0.5 米和 0.6 米,实验图像如图 4.13 所示,图 4.14
Worldview2 遥感图像分割结果,图 4.15 Quickbird 遥感图像分割结果。

 

4.13(a)中地物主要包括耕地、草地、灌木、道路和建筑物五类。从图 4.14 实验结果

可知, DPC 算法仅将图像分为了四类,没有将耕地分割出来,且在草地区域包含较多的噪
声; SLIC-DBSCAN 算法误将深色草地区域和深色耕地区域与灌木分为一类,在建筑物区
域,部分建筑物由于阴影问题出现误分现象,分割效果较差; SLIC-DPC 算法与
SLIC-DBSCAN 算法相比虽在一定程度上解决了阴影带来的误分问题,但在地物复杂区域
存在噪声现象;本文算法虽在耕地区域出现误分现象,但相较于对比算法,本文算法分割
结果噪声较少,建筑物分割较为完整。

 

4.13(b) 中地物主要包括水体、草地、裸地、灌木、道路和建筑物六类。从图 4.14
实验结果可知, DPC 算法将裸地和建筑物误分为一类,且没有将水体有效分割出来,分割
效果最差; SLIC-DBSCAN 算法将道路两旁的灌木误分为道路,部分建筑物没有分割出来;
SLIC-DPC 算法的道路分割结果存在部分不连续的情况,且建筑物分割不完整;本文算法
在水体边缘分割效果较好,道路连续,建筑物较为完整,误分现象较少。

代码实现

MATLAB

initialization.m

function X=initialization(SearchAgents_no,dim,ub,lb)

Boundary_no= size(ub,2); % numnber of boundaries

% If the boundaries of all variables are equal and user enter a signle
% number for both ub and lb
if Boundary_no==1
    ub_new=ones(1,dim)*ub;
    lb_new=ones(1,dim)*lb;
else
    ub_new=ub;
    lb_new=lb;
end

% If each variable has a different lb and ub
for i=1:dim
    ub_i=ub_new(i);
    lb_i=lb_new(i);
    X(:,i)=rand(SearchAgents_no,1).*(ub_i-lb_i)+lb_i;
end

X=X;

func_plot.m

function func_plot(func_name)

[lb,ub,dim,fobj]=Get_Functions_details(func_name);

switch func_name 
    case 'F1' 
        x=-100:2:100; y=x; %[-100,100]
        
    case 'F2' 
        x=-100:2:100; y=x; %[-10,10]
        
    case 'F3' 
        x=-100:2:100; y=x; %[-100,100]
        
    case 'F4' 
        x=-100:2:100; y=x; %[-100,100]
    case 'F5' 
        x=-200:2:200; y=x; %[-5,5]
    case 'F6' 
        x=-100:2:100; y=x; %[-100,100]
    case 'F7' 
        x=-1:0.03:1;  y=x  %[-1,1]
    case 'F8' 
        x=-500:10:500;y=x; %[-500,500]
    case 'F9' 
        x=-5:0.1:5;   y=x; %[-5,5]    
    case 'F10' 
        x=-20:0.5:20; y=x;%[-500,500]
    case 'F11' 
        x=-500:10:500; y=x;%[-0.5,0.5]
    case 'F12' 
        x=-10:0.1:10; y=x;%[-pi,pi]
    case 'F13' 
        x=-5:0.08:5; y=x;%[-3,1]
    case 'F14' 
        x=-100:2:100; y=x;%[-100,100]
    case 'F15' 
        x=-5:0.1:5; y=x;%[-5,5]
    case 'F16' 
        x=-1:0.01:1; y=x;%[-5,5]
    case 'F17' 
        x=-5:0.1:5; y=x;%[-5,5]
    case 'F18' 
        x=-5:0.06:5; y=x;%[-5,5]
    case 'F19' 
        x=-5:0.1:5; y=x;%[-5,5]
    case 'F20' 
        x=-5:0.1:5; y=x;%[-5,5]        
    case 'F21' 
        x=-5:0.1:5; y=x;%[-5,5]
    case 'F22' 
        x=-5:0.1:5; y=x;%[-5,5]     
    case 'F23' 
        x=-5:0.1:5; y=x;%[-5,5]  
end    

    

L=length(x);
f=[];

for i=1:L
    for j=1:L
        if strcmp(func_name,'F15')==0 && strcmp(func_name,'F19')==0 && strcmp(func_name,'F20')==0 && strcmp(func_name,'F21')==0 && strcmp(func_name,'F22')==0 && strcmp(func_name,'F23')==0
            f(i,j)=fobj([x(i),y(j)]);
        end
        if strcmp(func_name,'F15')==1
            f(i,j)=fobj([x(i),y(j),0,0]);
        end
        if strcmp(func_name,'F19')==1
            f(i,j)=fobj([x(i),y(j),0]);
        end
        if strcmp(func_name,'F20')==1
            f(i,j)=fobj([x(i),y(j),0,0,0,0]);
        end       
        if strcmp(func_name,'F21')==1 || strcmp(func_name,'F22')==1 ||strcmp(func_name,'F23')==1
            f(i,j)=fobj([x(i),y(j),0,0]);
        end          
    end
end

surfc(x,y,f,'LineStyle','none');

end

Get_Functions_details.m

function [lb,ub,dim,fobj] = Get_Functions_details(F)


switch F
    case 'F1'
        fobj = @F1;
        lb=-100;
        ub=100;
        dim=30;
        
    case 'F2'
        fobj = @F2;
        lb=-10;
        ub=10;
        dim=10;
        
    case 'F3'
        fobj = @F3;
        lb=-100;
        ub=100;
        dim=10;
        
    case 'F4'
        fobj = @F4;
        lb=-100;
        ub=100;
        dim=10;
        
    case 'F5'
        fobj = @F5;
        lb=-30;
        ub=30;
        dim=10;
        
    case 'F6'
        fobj = @F6;
        lb=-100;
        ub=100;
        dim=10;
        
    case 'F7'
        fobj = @F7;
        lb=-1.28;
        ub=1.28;
        dim=10;
        
    case 'F8'
        fobj = @F8;
        lb=-500;
        ub=500;
        dim=10;
        
    case 'F9'
        fobj = @F9;
        lb=-5.12;
        ub=5.12;
        dim=10;
        
    case 'F10'
        fobj = @F10;
        lb=-32;
        ub=32;
        dim=10;
        
    case 'F11'
        fobj = @F11;
        lb=-600;
        ub=600;
        dim=10;
        
    case 'F12'
        fobj = @F12;
        lb=-50;
        ub=50;
        dim=10;
        
    case 'F13'
        fobj = @F13;
        lb=-50;
        ub=50;
        dim=10;
        
    case 'F14'
        fobj = @F14;
        lb=-65.536;
        ub=65.536;
        dim=2;
        
    case 'F15'
        fobj = @F15;
        lb=-5;
        ub=5;
        dim=4;
        
    case 'F16'
        fobj = @F16;
        lb=-5;
        ub=5;
        dim=2;
        
    case 'F17'
        fobj = @F17;
        lb=[-5,0];
        ub=[10,15];
        dim=2;
        
    case 'F18'
        fobj = @F18;
        lb=-2;
        ub=2;
        dim=2;
        
    case 'F19'
        fobj = @F19;
        lb=0;
        ub=1;
        dim=3;
        
    case 'F20'
        fobj = @F20;
        lb=0;
        ub=1;
        dim=6;     
        
    case 'F21'
        fobj = @F21;
        lb=0;
        ub=10;
        dim=4;    
        
    case 'F22'
        fobj = @F22;
        lb=0;
        ub=10;
        dim=4;    
        
    case 'F23'
        fobj = @F23;
        lb=0;
        ub=10;
        dim=4;            
end

end

% F1

function o = F1(x)
o=sum(x.^2);
end

% F2

function o = F2(x)
o=sum(abs(x))+prod(abs(x));
end

% F3

function o = F3(x)
dim=size(x,2);
o=0;
for i=1:dim
    o=o+sum(x(1:i))^2;
end
end

% F4

function o = F4(x)
o=max(abs(x));
end

% F5

function o = F5(x)
dim=size(x,2);
o=sum(100*(x(2:dim)-(x(1:dim-1).^2)).^2+(x(1:dim-1)-1).^2);
end

% F6

function o = F6(x)
o=sum(abs((x+.5)).^2);
end

% F7

function o = F7(x)
dim=size(x,2);
o=sum([1:dim].*(x.^4))+rand;
end

% F8

function o = F8(x)
o=sum(-x.*sin(sqrt(abs(x))));
end

% F9

function o = F9(x)
dim=size(x,2);
o=sum(x.^2-10*cos(2*pi.*x))+10*dim;
end

% F10

function o = F10(x)
dim=size(x,2);
o=-20*exp(-.2*sqrt(sum(x.^2)/dim))-exp(sum(cos(2*pi.*x))/dim)+20+exp(1);
end

% F11

function o = F11(x)
dim=size(x,2);
o=sum(x.^2)/4000-prod(cos(x./sqrt([1:dim])))+1;
end

% F12

function o = F12(x)
dim=size(x,2);
o=(pi/dim)*(10*((sin(pi*(1+(x(1)+1)/4)))^2)+sum((((x(1:dim-1)+1)./4).^2).*...
(1+10.*((sin(pi.*(1+(x(2:dim)+1)./4)))).^2))+((x(dim)+1)/4)^2)+sum(Ufun(x,10,100,4));
end

% F13

function o = F13(x)
dim=size(x,2);
o=.1*((sin(3*pi*x(1)))^2+sum((x(1:dim-1)-1).^2.*(1+(sin(3.*pi.*x(2:dim))).^2))+...
((x(dim)-1)^2)*(1+(sin(2*pi*x(dim)))^2))+sum(Ufun(x,5,100,4));
end

% F14

function o = F14(x)
aS=[-32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32;,...
-32 -32 -32 -32 -32 -16 -16 -16 -16 -16 0 0 0 0 0 16 16 16 16 16 32 32 32 32 32];

for j=1:25
    bS(j)=sum((x'-aS(:,j)).^6);
end
o=(1/500+sum(1./([1:25]+bS))).^(-1);
end

% F15

function o = F15(x)
aK=[.1957 .1947 .1735 .16 .0844 .0627 .0456 .0342 .0323 .0235 .0246];
bK=[.25 .5 1 2 4 6 8 10 12 14 16];bK=1./bK;
o=sum((aK-((x(1).*(bK.^2+x(2).*bK))./(bK.^2+x(3).*bK+x(4)))).^2);
end

% F16

function o = F16(x)
o=4*(x(1)^2)-2.1*(x(1)^4)+(x(1)^6)/3+x(1)*x(2)-4*(x(2)^2)+4*(x(2)^4);
end

% F17

function o = F17(x)
o=(x(2)-(x(1)^2)*5.1/(4*(pi^2))+5/pi*x(1)-6)^2+10*(1-1/(8*pi))*cos(x(1))+10;
end

% F18

function o = F18(x)
o=(1+(x(1)+x(2)+1)^2*(19-14*x(1)+3*(x(1)^2)-14*x(2)+6*x(1)*x(2)+3*x(2)^2))*...
    (30+(2*x(1)-3*x(2))^2*(18-32*x(1)+12*(x(1)^2)+48*x(2)-36*x(1)*x(2)+27*(x(2)^2)));
end

% F19

function o = F19(x)
aH=[3 10 30;.1 10 35;3 10 30;.1 10 35];cH=[1 1.2 3 3.2];
pH=[.3689 .117 .2673;.4699 .4387 .747;.1091 .8732 .5547;.03815 .5743 .8828];
o=0;
for i=1:4
    o=o-cH(i)*exp(-(sum(aH(i,:).*((x-pH(i,:)).^2))));
end
end

% F20

function o = F20(x)
aH=[10 3 17 3.5 1.7 8;.05 10 17 .1 8 14;3 3.5 1.7 10 17 8;17 8 .05 10 .1 14];
cH=[1 1.2 3 3.2];
pH=[.1312 .1696 .5569 .0124 .8283 .5886;.2329 .4135 .8307 .3736 .1004 .9991;...
.2348 .1415 .3522 .2883 .3047 .6650;.4047 .8828 .8732 .5743 .1091 .0381];
o=0;
for i=1:4
    o=o-cH(i)*exp(-(sum(aH(i,:).*((x-pH(i,:)).^2))));
end
end

% F21

function o = F21(x)
aSH=[4 4 4 4;1 1 1 1;8 8 8 8;6 6 6 6;3 7 3 7;2 9 2 9;5 5 3 3;8 1 8 1;6 2 6 2;7 3.6 7 3.6];
cSH=[.1 .2 .2 .4 .4 .6 .3 .7 .5 .5];

o=0;
for i=1:5
    o=o-((x-aSH(i,:))*(x-aSH(i,:))'+cSH(i))^(-1);
end
end

% F22

function o = F22(x)
aSH=[4 4 4 4;1 1 1 1;8 8 8 8;6 6 6 6;3 7 3 7;2 9 2 9;5 5 3 3;8 1 8 1;6 2 6 2;7 3.6 7 3.6];
cSH=[.1 .2 .2 .4 .4 .6 .3 .7 .5 .5];

o=0;
for i=1:7
    o=o-((x-aSH(i,:))*(x-aSH(i,:))'+cSH(i))^(-1);
end
end

% F23

function o = F23(x)
aSH=[4 4 4 4;1 1 1 1;8 8 8 8;6 6 6 6;3 7 3 7;2 9 2 9;5 5 3 3;8 1 8 1;6 2 6 2;7 3.6 7 3.6];
cSH=[.1 .2 .2 .4 .4 .6 .3 .7 .5 .5];

o=0;
for i=1:10
    o=o-((x-aSH(i,:))*(x-aSH(i,:))'+cSH(i))^(-1);
end
end

function o=Ufun(x,a,k,m)
o=k.*((x-a).^m).*(x>a)+k.*((-x-a).^m).*(x<(-a));
end

initialization.m

function Positions=initialization(SearchAgents_no,dim,ub,lb)

Boundary_no= size(ub,1); % numnber of boundaries

% If the boundaries of all variables are equal and user enter a signle
% number for both ub and lb
if Boundary_no==1
    Positions=rand(SearchAgents_no,dim).*(ub-lb)+lb;
end

% If each variable has a different lb and ub
if Boundary_no>1
    for i=1:dim
        ub_i=ub(i);
        lb_i=lb(i);
        Positions(:,i)=rand(SearchAgents_no,1).*(ub_i-lb_i)+lb_i;
    end
end

SSA.m

function [FoodFitness,FoodPosition,Convergence_curve]=SSA(N,Max_iter,lb,ub,dim,fobj)

if size(ub,1)==1
    ub=ones(dim,1)*ub;
    lb=ones(dim,1)*lb;
end

Convergence_curve = zeros(1,Max_iter);

%Initialize the positions of salps
SalpPositions=initialization(N,dim,ub,lb);


FoodPosition=zeros(1,dim);
FoodFitness=inf;


%calculate the fitness of initial salps

for i=1:size(SalpPositions,1)
    SalpFitness(1,i)=fobj(SalpPositions(i,:));
end

[sorted_salps_fitness,sorted_indexes]=sort(SalpFitness);

for newindex=1:N
    Sorted_salps(newindex,:)=SalpPositions(sorted_indexes(newindex),:);
end

FoodPosition=Sorted_salps(1,:);
FoodFitness=sorted_salps_fitness(1);

%Main loop
l=2; % start from the second iteration since the first iteration was dedicated to calculating the fitness of salps
while l<Max_iter+1
    
    c1 = 2*exp(-(4*l/Max_iter)^2); % Eq. (3.2) in the paper
    
    for i=1:size(SalpPositions,1)
        
        SalpPositions= SalpPositions';
        
        if i<=N/2
            for j=1:1:dim
                c2=rand();
                c3=rand();
                %%%%%%%%%%%%% % Eq. (3.1) in the paper %%%%%%%%%%%%%%
                if c3<0.5 
                    SalpPositions(j,i)=FoodPosition(j)+c1*((ub(j)-lb(j))*c2+lb(j));
                else
                    SalpPositions(j,i)=FoodPosition(j)-c1*((ub(j)-lb(j))*c2+lb(j));
                end
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            end
            
        elseif i>N/2 && i<N+1
            point1=SalpPositions(:,i-1);
            point2=SalpPositions(:,i);
            
            SalpPositions(:,i)=(point2+point1)/2; % % Eq. (3.4) in the paper
        end
        
        SalpPositions= SalpPositions';
    end
    
    for i=1:size(SalpPositions,1)
        
        Tp=SalpPositions(i,:)>ub';Tm=SalpPositions(i,:)<lb';SalpPositions(i,:)=(SalpPositions(i,:).*(~(Tp+Tm)))+ub'.*Tp+lb'.*Tm;
        
        SalpFitness(1,i)=fobj(SalpPositions(i,:));
        
        if SalpFitness(1,i)<FoodFitness
            FoodPosition=SalpPositions(i,:);
            FoodFitness=SalpFitness(1,i);
            
        end
    end
    
    Convergence_curve(l)=FoodFitness;
    l = l + 1;
end



main.m

clc
clear 
close all
SearchAgents_no=30; % Number of search agents
Function_name='F1'; % Name of the test function that can be from F1 to F23 ( 
Max_iteration=1000; % Maximum numbef of iterations
% Load details of the selected benchmark function
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);
[Best_score,Best_pos,SSA_cg_curve]=SSA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
figure('Position',[300 300 660 290])
%Draw search space
subplot(1,2,1);
func_plot(Function_name);
title('Parameter space')
xlabel('x_1');
ylabel('x_2');
zlabel([Function_name,'( x_1 , x_2 )'])
%Draw objective space
subplot(1,2,2);
semilogy(SSA_cg_curve,'Color','r')
title('Objective space')
xlabel('Iteration');
ylabel('Best score obtained so far');
axis tight
grid on
box on
legend('SSA')
display(['The best solution obtained by SSA is  ', num2str(Best_pos)]);
display(['The best optimal value of the objective funciton found by SSA is  ', num2str(Best_score)]);
     

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

同模块设置不同应用主题方案

有时候公司内部会有不同应用但是有部分模块功能一样&#xff0c;只根据应用角色有些细节逻辑区分的场景。这时候往往采用模块化采用以应用至不同的APP。如果APP主题不一致&#xff0c;该如果解决。 方案&#xff1a; 在不同应用的config.gradle 下面根据不同应用定义不同的a…

基于SSM+SpringBoot《CRM客户关系管理系统》实战开发教程(附文档及源码)

1.项目简介 客户关系管理&#xff08;Customer Relationship Management&#xff0c;简称CRM&#xff09;&#xff0c;是指企业为提高核心竞争力&#xff0c;利用相应的信息技术以及互联网技术协调企业与顾客间在销售、营销和服务上的交互&#xff0c;从而提升其管理方式&…

AUTOSAR知识点Com(一):CANIf入门知识

目录 1、概述 2、上下层关系 2.1 上层 2.2 下层 3、链接 4、记录项 1、概述 下面主要是规范方面的描述&#xff1a; 参考文档《AUTOSAR_SWS_CANInterface.pdf》 CAN接口模块&#xff08;下文简“CanIf”&#xff09;位于底层CAN驱动&#xff08;CanDrv&#xff09;、CA…

华为机试题:HJ103 Redraiment的走法(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

【Python笔记20230307】

基础 编码、解码 str.encode(utf-8) # 编码 str.decode(utf-8) # 解码关键字 import keyword keyword.kwlist格式化输出 % 占位符:%s 字符串%d 整数%f 浮点数Hello, %s % world Hi, %s, you have $%d. % (Michael, 1000000) 占位符的修饰符 -左对齐 .小数点后位数 0左边补零…

SpringCloud简介

一、注册中心 1、为什么需要用到注册中心&#xff1f; 让消费者服务及时知道提供者服务的状态。例如&#xff1a;是否宕机、是否增加了集群实例等。 2、dubbo和zookeeper 特点&#xff1a;服务消费端订阅注册中心。服务提供端增加实例会把新实例注册到注册中心&#xff0c;…

HCIP知识点(前三天)

复习HCIA&#xff1a; 一、TCP/IP模型&#xff0c;OSI模型 OSI 开放式系统互联参考模型 应用层 抽象语言—>编码 表示层 编码—>二进制 会话层 应用程序内部的区分地址&#xff08;无标准格式&#xff09; 传输层 TCP/UDP – 分段&#xff08;受MTU限制&#xff09;、端…

C 语言网络编程 — PF_NETLINK sockets

目录 文章目录目录PF_NETLINK socketsPF_NETLINK sockets Linux 提供了 4 种 User Process 和 Kernel 之间进行通信的 IPC&#xff08;Inter-Process Communicate&#xff0c;进程间通信&#xff09;方式&#xff1a; /procioctlsysfsPF_NETLINK sockets&#xff08;Netlink …

vue大型商城系统中遇到的问题(上)

一&#xff1a;创建仓库1.领导创建git仓库&#xff08;参考————这篇文章&#xff09;&#xff0c;新手下载git2.打开cmd终端&#xff0c;将git仓库拉到本地3.进入文件目录&#xff0c;查看分支&#xff08;新手向——为什么需要创建分支&#xff0c;查看---&#xff09;4.创…

HCIP笔记

第一天 ARP协议 正向ARP&#xff1a;通过IP地址获取目的MAC地址 过程&#xff1a; 目的IP到目的MAC再到ARP表中&#xff0c;所需时间是180s 反向ARP&#xff1a;通过目标MAC地址获取目标IP地址 免费ARP&#xff1a;利用正向ARP的原理请求自己的IP地址 1.自我检测 2.检测地址冲…

使用JMeter 录制脚本

使用JMeter 录制脚本&#xff0c;参考的一个博主的&#xff0c;我记录到我这里&#xff0c;留着以后用哈哈哈哈 1&#xff0c;添加 HTTP代理服务器 测试计划右键–》添加–》非测试元件–》http代理服务器 2&#xff0c;添加线程组&#xff0c;用来存放录制脚本的&#xff0c…

C语言设计模式:实现简单工厂模式和工程创建

目录 一&#xff0c;设计模式概念引入 ① 什么是设计模式 ② 什么是类和对象 ③ 什么是工厂模式 二&#xff0c;C语言工厂模式的实现 ① 普通类和对象的代码实现 ② 工厂模式代码实现 ● cat.c ● dog.c ● person.c ● animal.h ● mainpro.c ● 完善mainpro.c …

硕士毕业论文常见的排版小技巧

word排版陆续更新吧&#xff0c;更具我所遇到的一些小问题&#xff0c;总结上来 文章目录1.避免题注&#xff08;图或者表的标题&#xff09;与图或表格分不用页注意点&#xff1a;光标移动到表的题注后面2.设置论文的页眉关键点&#xff1a;需要将每一章节末尾&#xff0c;都要…

Hadoop 运行环境搭建(开发重点)

文章目录Hadoop 运行环境搭建&#xff08;开发重点&#xff09;一、安装JDK二、安装配置 Hadoop1、安装 hadoop2、hadoop 目录结构3、设置免密登录4、完全分布式模式&#xff08;开发重点&#xff09;1&#xff09;分发jdk2&#xff09;集群配置(1) 集群部署规划(2) 配置文件说…

2.3 二分搜索技术

二分搜索算法是运用分治策略的典型例子。给定己排好府的 n个元素a10:n-1]&#xff0c;现要在这n个元素中找出一特定元素3。首先较容易想到的是用顺序搜索方法&#xff0c;逐个比较a10:1-1]中元素&#xff0c;直至找出元素&#xff0c;或搜索遍整个数组后确定&#xff0c;不在其…

现代HYUNDAI EDI需求分析

现代集团(HYUNDAI)是韩国一家以建筑、造船、汽车行业为主&#xff0c;兼营钢铁、机械、贸易、运输、水泥生产、冶金、金融、电子工业等几十个行业的综合性企业集团。本文主要介绍HYUNDAI 的EDI需求&#xff0c;带大家快速理清思路&#xff0c;明确EDI项目的推进流程。 通信标准…

前端——2.HTML标签1

这篇文章我们从0来介绍一下HTML的相关标签内容 目录 1.HTML语法规范 1.1基本语法概述 1.2标签关系 2.HTML的基本结构标签 2.1第一个HTML网页 2.2基本结构标签总结 1.HTML语法规范 下面&#xff0c;我们来看一下HTML的语法规范的内容 1.1基本语法概述 首先&#xff0c…

【0成本搭建个人博客】——Hexo+Node.js+Gitee Pages

目录 1、下载安装Git 2、下载安装Node.js 3、使用Hexo进行博客的搭建 4、更改博客样式 5、将博客上传到Gitee 6、更新博客 首先看一下Hexo的博客的效果。 1、下载安装Git Git 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本…

openpnnp - 载入板子后,要确定板子的放置角度

文章目录openpnnp - 载入板子后,要确定板子的放置角度概述用openpnp提供的功能来确定被夹住的板子的左下角原点位置和板子的角度备注ENDopenpnnp - 载入板子后,要确定板子的放置角度 概述 设备是有夹具的, 用百分表打过, 夹具本身在Z方向的平行度是没问题的. 但是, PCB板子的…

Flink Table Store 0.3 构建流式数仓最佳实践

摘要&#xff1a;本文整理自阿里巴巴高级技术专家&#xff0c;Apache Flink PMC 李劲松&#xff08;之信&#xff09;&#xff0c;在 FFA 2022 实时湖仓的分享。本篇内容主要分为四个部分&#xff1a;挑战&#xff1a;Streaming DW 面临的难题案例&#xff1a;FlinkFTS 典型场景…