各種狀態轉移算法的源代碼可以在中南大學周曉君教授的個人主頁下載:
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個