深入解析状态转移算法:一种独特的全局优化思路
在智能优化算法的广阔天地中,绝大多数方法都模仿自然界中的群体行为——鸟群、蚁群、蜂群等,往往一窝蜂地设计新的寻优策略。然而,有一类方法另辟蹊径:它不依赖任何生物隐喻,而是从控制理论中汲取灵感,利用状态空间模型来统一描述寻优过程。这就是本文要详细介绍的状态转移算法(State Transition Algorithm, STA)。
早在2012年,中南大学的周晓君教授就提出了这一框架,并在后续工作中不断加以完善。想要深入了解理论背景的读者,可以参考2020年发表在《自动化学报》上的论文《状态转移算法原理及应用》,该文对算法进行了非常全面的阐述。至于代码实现,周晓君教授的个人主页以及GitHub上都可以找到各版本开源的MATLAB和Python实现,十分方便。
基本状态转移算法
状态转移算法的核心思想非常直接:将优化问题的一个解视为一个“状态”,解的迭代更新则是“状态转移”过程。它利用现代控制理论中的状态空间表达式作为生成候选解的统一框架,并基于此设计了各类状态变换算子。
与那些基于种群的进化算法不同,基本STA是一种基于个体的进化算法。它从当前解出发,通过采样方式多次独立运行某种状态变换算子,产生一组候选解(称为“状态集合”),然后与当前解比较,迭代更新。这套思路的核心优势在于,每种状态变换算子都能产生具有规则形状、可控大小的几何邻域。它设计了旋转变换、平移变换、伸缩变换、坐标轴搜索等不同算子,分别满足全局搜索、局部搜索以及启发式搜索等不同功能需求。而通过交替轮换使用这些算子,算法得以以较高概率快速逼近全局最优解。
状态转移算法的统一框架
借鉴控制理论中的状态空间模型,基本框架可以这样表达:
$$ \left\{\begin{array}{l} s_{k+1}= \boldsymbol{A}_{k} s_{k} + \boldsymbol{B}_{k} \boldsymbol{u}_{k} \\ y_{k+1}=f\left(s_{k+1}\right) \end{array}\right. $$
其中,\(s_k = (s_1, s_2, \ldots, s_n)^\mathrm{T}\) 表示当前状态(一个候选解);\(\boldsymbol{A}_k\) 或 \(\boldsymbol{B}_k\) 是状态转移矩阵,代表算子所产生的变换效果;\(\boldsymbol{u}_k\) 是控制变量,可以是当前状态及历史状态的函数;\(f(\cdot)\) 为目标函数或评价函数。
基本状态转移算法的理论实现
STA中专门设计了三种类型的搜索算子:
- 全局搜索算子:保证有一定概率使候选解集形成的邻域包含全局最优解
- 局部搜索算子:在较小邻域内进行精细搜索
- 启发式搜索算子:产生具有潜在价值的候选解,避免盲目搜索
此外,STA还设计了特定的选择与更新策略,以适应不同优化问题的需要。更重要的是,它内嵌了智能化策略——全局算子与局部算子的交替调用可以大幅缩短寻优时间,同时避免陷入局部最优;而采样机制则从邻域中有代表性地选取候选解,避免穷举,极大缩短搜索时间。
一般地,基本STA的流程如下:
- 从当前最好解出发,通过某个状态变换算子生成具有特定性质的邻域;
- 以某种采样机制从该邻域中采集一定数目的样本;
- 比较当前最好解与样本中最好解的优劣,根据更新策略更新当前最好解;
- 返回第1步,交替使用各种算子,直到满足终止条件。
状态变换算子
(1)旋转变换
$$ s_{k+1}=s_k + \alpha \frac{1}{n \|s_k\|_2} \boldsymbol{R}_r s_k $$
其中 \(\alpha\) 为旋转因子,\(\boldsymbol{R}_r \in \mathbb{R}^{n \times n}\) 是元素取值于 \([-1,1]\) 均匀分布的随机矩阵。旋转变换以当前解 \(s_k\) 为原点,在给定半径 \(\alpha\) 内进行局部搜索。

(2)平移变换
$$ s_{k+1}=x_k + \beta \boldsymbol{R}_t \frac{s_k - s_{k-1}}{\|s_k - s_{k-1}\|_2} $$
其中 \(\beta\) 为平移因子,\(\boldsymbol{R}_t\) 是取值于 \([0,1]\) 均匀分布的随机变量。平移变换沿着当前解 \(s_k\) 与历史解 \(s_{k-1}\) 形成的直线上进行启发式搜索。
(3)伸缩变换
$$ s_{k+1}=s_k + \gamma \boldsymbol{R}_e s_k $$
其中 \(\gamma\) 为伸缩因子,\(\boldsymbol{R}_e \in \mathbb{R}^{n \times n}\) 是一个非零元素服从正态分布的随机对角矩阵。伸缩变换以正态分布的概率将当前解每个维度上的值伸缩到实轴任意位置,具备全局搜索能力。
(4)轴向变换
$$ s_{k+1}=s_k + \delta \boldsymbol{R}_a s_k $$
其中 \(\delta\) 为坐标因子,\(\boldsymbol{R}_a\) 是一个非零元素服从正态分布的稀疏对角矩阵——在基本STA中,\(\boldsymbol{R}_a\) 仅有一个位置非零。轴向变换从当前解出发,随机挑选一个维度搜索,增强单一维度的搜索能力。

邻域、采样、选择与更新
邻域:由当前状态 \(s_k\) 出发,通过状态变换算子反复产生一系列具有同质性的候选状态,这些候选解构成一个邻域。理论上邻域中有无数候选解,但实际中必须通过采样选出有限个。
采样:对邻域中的候选解,以随机策略采样 \(SE\) 个(即“搜索强度”或“样本个数”)候选解,生成一个大小可控的状态集合 State。
选择与更新:在每一代中,比较 State 中的 \(SE\) 个候选解与当前最优解,采用“贪婪策略”选取适应度最好的解来更新当前最优解。
交替轮换
为了实现可控、最优、全局且稳定的搜索,不同功能的状态变换算子被交替轮换调用。这种设计思路从一开始就清晰地规划了优化过程中可能需要的各种搜索形式,并将其抽象封装为功能各异的算子。于是,在解决实际问题时,不同搜索功能可以有选择地被强化或削弱。更进一步地,改进优化算法的思路也就从漫无目的地构思新动物算法,转向了如何为已知算子设计更合理的调用策略。
参数设置
在基本状态转移算法中,参数设置为:\(\alpha_{\max}=1\),\(\alpha_{\min}=10^{-4}\),\(\beta=1\),\(\gamma=1\),\(\delta=1\),\(SE=30\),\(fc=2\)。其中平移、伸缩和坐标因子的大小保持恒定,旋转因子以 \(1/fc\) 为衰减率,在最大值与最小值之间周期变化。
MATLAB源码描述与解析
下面这张图展示了基本状态转移算法的MATLAB源码的所有文件。先对各个M文件给出功能概括,再对核心代码进行逐段解析。

概括性的功能描述
Test_sta.m:算法调用示例STA.m:封装好的基本状态转移算法initialization.m:解的初始化过程fitness.m:适应度计算与比较Get_Test_Functions.m:各类常见优化问题目标函数的汇总封装rotate.m,expand.m,axesion.m:对应状态变换算子的外层逻辑op_rotate.m,op_expand.m,op_axesion.m,op_translate.m:四种状态变换算子的矩阵运算实现
源码解析
由于 rotate.m, expand.m, axesion.m 的写法和功能类似,这里仅以 rotate.m 为例;而 op_rotate.m, op_expand.m, op_axesion.m, op_translate.m 性质相同,也仅以 op_rotate.m 为例。
Test_sta.m
clear all
clc
currentFolder = pwd;
addpath(genpath(currentFolder))
% parameter setting
warning('off')
SE = 30; % 搜索强度
Dim = 30; % 问题维度定义
Range = repmat([-5.12;5.12],1,Dim); % 搜索范围定义
Iterations = 1e3; % 最大迭代次数定义
tic
[Best,fBest,history] = STA(@Rastrigin,SE,Dim,Range,Iterations); % 调用STA
toc
history
semilogy(history)
STA.m
% 参数初始化
alpha_max = 1;
alpha_min = 1e-4;
alpha = alpha_max;
beta = 1;
gamma = 1;
delta = 1;
fc = 2;
% 初始化状态集合State
State = initialization(SE,Dim,Range);
% 计算适应度函数,返回当前最优解Best和最优值fBest
[Best,fBest] = fitness(funfcn,State);
counter = 0;
% 迭代过程
for iter = 1:Iterations
if alpha < alpha_min
alpha = alpha_max;
end
oldfBest = fBest;
[Best,fBest] = expand(funfcn,Best,SE,Range,beta,gamma);
[Best,fBest] = rotate(funfcn,Best,SE,Range,alpha,beta);
[Best,fBest] = axesion(funfcn,Best,SE,Range,beta,delta);
% 终止条件判断
if norm(oldfBest-fBest) < 1e-8
counter = counter + 1;
if counter > 10
break;
end
else
counter = 0;
end
fprintf('iter=%d ObjVal=%g\n',iter,fBest);
history(iter) = fBest;
alpha = alpha/fc; % 更新参数alpha的值
end
initialization.m
function State = initialization(SE,Dim,Range)
Pop_Lb = Range(1,:); % Range的第一行,全是-5.12
Pop_Ub = Range(2,:); % Range的第二行,全是5.12
% 生成初始状态集合State,大小为Dim*SE
State = rand(SE,Dim) .* repmat(Pop_Ub-Pop_Lb,SE,1) + repmat(Pop_Lb,SE,1);
fitness.m
function [Best,fBest] = fitness(funfcn,State)
% 计算适应度
SE = size(State,1);
fState = zeros(SE,1);
for i = 1:SE
fState(i) = feval(funfcn,State(i,:));
end
[fGBest, g] = min(fState); % 返回最小值fGBest和其索引g
fBest = fGBest;
Best = State(g,:); % 最值对应那一行的解
op_rotate.m
function y = op_rotate(Best,SE,alpha)
n = length(Best);
y = repmat(Best',1,SE) + alpha*(1/(n*(norm(Best)+eps)))*reshape(unifrnd(-1,1,SE*n,n)*Best',n,SE);
% 旋转算子的矩阵运算实现
y = y'; % 转置
以上就是基本状态转移算法的核心架构与代码实现详解。从统一框架到算子设计,再到交替轮换的调用策略和具体代码,可以说这套方法为智能优化提供了一个结构清晰且可扩展的范式。对于希望进一步改进算法或将其应用于实际问题的研究者而言,这是一个非常值得深挖的起点。
