各种状态转移算法的源代码可以在中南大学周晓君教授的个人主页下载:
http://faculty.csu.edu.cn/michael_x_zhou/zh_CN/jxzy/74762/list/index.htm
关于人工智能学派
不同的人从不同的方向研究人工智能理论, 最典型研究方法有三种:
(1) 结构主义
第一个思路是从人类大脑皮层和神经网络入手, 模仿大脑中很多神经元互相联系起来成为神经网络。模拟这个结构组成系统的结构, 试图通过使很多人工神经元组在一起的方式形成智能系统。这是神经网络的研究方法, 也可以叫做结构主义。
结构模拟:神经网络,联结主义(又称为仿生学 派或生理学派)的代表,其原理主要为神经网络及神经网络间的连接机制。即模拟人的生理神经网络结构,并认为功能、 结构和智能行为是密切相关的。原理主要为神经网络及神经网络间的连接机制与学习算法。
(2) 功能主义
第二种研究方法是想用计算机模拟人的智能。系统只要有智能的功能就可以了, 不需要理会结构, 所以也有人给它起名叫做功能主义。这种系统和知识工程密切结合, 需要专门的知识库, 对于知识的研究也最为关心。
功能模拟:符号逻辑系统,符号主义的代表。通 过分析人类认知系统所具备的功能和机能,并用计算机模 拟,实现人工智能。原理主要为物理符号系统假设和有限合 理性原理。符号主义认为人工智能源于数学逻辑,可以应用 计算机研究人的思维过程,模拟人类智能活动。发展了启发式算法、专家系统、知识工程理论与技术,至今仍是人工智能的主流派。
(3) 行为主义
第三种研究方法设计出感知-动作系统,设计动作和不同具体情景匹配, 只关心系统可以做出的动作, 也被人称为行为主义。
行为模拟:感知-动作系统,行为主义的代表。认 为功能、结构和智能行为是不可分割的,同时认为不同的行 为表现出不同的功能和不同的控制结构。行为主义早期模拟 人在控制过程中的智能行为和作用,如对自寻优、自适应、 自校正、自组织、自学习等控制系统的研究。80 年代诞生 了智能控制和智能机器人系统。行为主义者认为智能不需要 知识,不需要表示,不需要推理;人工智能可以像人类智能 一样逐步进化(所以称为进化主义),智能行为只能在现实世 界中与周围环境交互作用而表现出来。
可以看出,仿生算法侧重于过程,模仿一种行为,属于行为主义学习。而状态转移算法重在构建一种通解或者结构,在设计时考虑更普适更凝练的概念,从对解空间进行的可能的基本变换进行设计,使用时能够搭配各种基本的比例和作用顺序,实现智能优化,这当然不是行为主义,更贴近结构主义structuralism。不过目前查询到的这方面资料不够详细,人工智能学界似乎没有统一标准的定义。
目前我的认识:状态转移算法是一种智能优化的普适方法,它从解空间出发,用数学方法构建变换(子结构)代替复杂的过程建模,并通过管理子结构之间的关系来实现智能优化。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
上面为论文理解与理论对比,后面为状态转移算法的MATLAB源码中一些关键部分的理解,关键理解已用中文注释出来。
initialization.m :
function State=initialization(SE,Dim,Range) Pop_Lb = Range(1,:);%Range的第一行,全是-5.12 Pop_Ub = Range(2,:);%Range的第二行,全是5.12 State = rand(SE,Dim).*repmat(Pop_Ub-Pop_Lb,SE,1)+repmat(Pop_Lb,SE,1); %State是状态集,大小等于dim*SE
STA.m :
alpha_min = 1e-4;
alpha = alpha_max;
beta = 1;
gamma = 1;
delta = 1;
fc = 2;
% initialization
State = initialization(SE,Dim,Range);
[Best,fBest] = fitness(funfcn,State);%当前最优的解向量Best和当前最优函数值fBest
counter = 0;
% iterative process
for iter = 1:Iterations
if alpha < alpha_min
alpha = alpha_max;
end
% flag
oldfBest = fBest;%f的best,函数值
[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);
% termination conditions
if norm(oldfBest-fBest) < 1e-8 % 计算矩阵范数表示误差,误差可以修改
counter = counter + 1;
if counter > 10 % can be changed
break;
end
else
counter = 0;
end
fprintf('iter=%d ObjVal=%g\n',iter,fBest);
history(iter) = fBest;
alpha = alpha/fc;
end
rotate.m :
function [Best,fBest] = rotate(funfcn,oldBest,SE,Range,alpha,beta)
Pop_Lb=repmat(Range(1,:),SE,1);
Pop_Ub=repmat(Range(2,:),SE,1);
Best = oldBest;
fBest = feval(funfcn,Best);
flag = 0;
State = op_rotate(Best,SE,alpha); %rotation operator
%Apply for State > Pop_Ub or State < Pop_Lb
changeRows = State > Pop_Ub;
State(find(changeRows)) = Pop_Ub(find(changeRows));
changeRows = State < Pop_Lb;
State(find(changeRows)) = Pop_Lb(find(changeRows));
%Apply for State > Pop_Ub or State < Pop_Lb把state中超过上下界的值自动替换为上下界,这里的作用是用MATLAB控制台写实验程序理解的
[newBest,fGBest] = fitness(funfcn,State);
if fGBest < fBest
fBest = fGBest;
Best = newBest;
flag = 1;
else
flag = 0;
end
if flag ==1
State = op_translate(oldBest,Best,SE,beta);%translation operator
%Apply for State > Pop_Ub or State < Pop_Lb
changeRows = State > Pop_Ub;
State(find(changeRows)) = Pop_Ub(find(changeRows));
changeRows = State < Pop_Lb;
State(find(changeRows)) = Pop_Lb(find(changeRows));
%Apply for State > Pop_Ub or State < Pop_Lb
[newBest,fGBest] = fitness(funfcn,State);
if fGBest < fBest
fBest = fGBest;
Best = newBest;
end
end
fitness.m :
function [Best,fBest] = fitness(funfcn,State)
% calculate fitness
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';%转置,画一下就懂,注意分清行列哪个是SE,哪个是Dim
Test_sta.m :
clear all
clc
currentFolder = pwd;
addpath(genpath(currentFolder))
% parameter setting
warning('off')
SE = 30; % degree of search enforcement
Dim = 30;% dimension
Range = repmat([-5.12;5.12],1,Dim);%range
Iterations = 1e3;% maximum number of iterations
tic
[Best,fBest,history] = STA(@Rastrigin,SE,Dim,Range,Iterations);
toc
history
semilogy(history)
关键数据结构的理解

MATLAB技法总结:
fBest = feval(funfcn,Best); %feval()函数执行指定的函数。也就是说,将想要执行的函数以及相应的参数一起作为feval()的参数,feval()的输出等于想要执行的函数的输出 min(fState); %返回最小值fGBest和其索引g changeRows = State > Pop_Ub; State(find(changeRows)) = Pop_Ub(find(changeRows)); changeRows = State < Pop_Lb; State(find(changeRows)) = Pop_Lb(find(changeRows)); %find(函数)可以返回满足这些要求的索引 y=y' %转置 B = repmat(A,m,n) B = repmat(A,[m n]) %repmat矩阵复制,将A矩阵看作元素,复制组成m行n列,即将A复制m*n个
