初次學習基本狀態轉移算法的經驗體會


1.引言
   狀態轉移算法一種基於結構主義學習的智能優化算法,它抓住最優化算法的本質、目的和要求,以全局性、最優性、快速性、收斂性、可控性為核心結構要素,需要什么才學習什么。於2012年,周曉君教授正式提出這種新穎的智能型隨機性全局優化方法,它的基本思想是將最優化問題的 一個解看成是一個狀態, 解的迭代更新過程看成是 狀態轉移過程, 利用現代控制理論的狀態空間表達式來作為產生候選解的統一框架, 基於此框架來設計 狀態變換算子。與大多數 基於種群的進化算法不同, 基本的狀態轉移算法是一種 基於個體的進化算法, 它基於給定當前解, 通過采樣方式, 多次獨立運行某種狀態變換算子產生 候選解集, 並與當前解進行比較, 迭代更新當前解,直到滿足某種終止條件。 值得一提的是, 基本狀態轉移算法中的每種狀態變換算子都能夠產生具有 規則形狀、可控大小的幾何鄰域, 它設計了包括旋轉變換、平移變換、伸縮變換、坐標軸搜索等不同的狀態變換算子以滿足 全局搜索、局部搜索以及啟發式搜索等功能需要, 並且以 交替輪換的方式適時地使用各種不同算子, 使得狀態轉移算法能夠以一定概率很快找到全局最優解。
 
  2020年發表在自動化學報的論文《狀態轉移算法原理及應用》,對狀態轉移算法作了廣泛而深入的介紹:
https://kns.cnki.net/kcms/detail/detail.aspx?dbcode=CJFD&dbname=CJFDAUTO&filename=MOTO202011002&v=JCreBvAGjWhrT3giHVgvnnUsFc9itorTptpKcRf1Gpsjp3YJEQri4TxEFx9J0Hw1
各種狀態轉移算法的源代碼可以在中南大學周曉君教授的個人主頁下載:
http://faculty.csu.edu.cn/michael_x_zhou/zh_CN/jxzy/74762/list/index.htm
 
  在初次閱讀論文的過程中,我在理解上主要存在的問題是全局搜索功能的實現。請教老師之后明白了全局功能是由伸縮算子實現的,體會到了設計的精妙之處:
 

 

 

 
伸縮變換實際上是用正態分布來把原來的元素做一個放縮和延伸,這樣就依概率達到了實軸上的每一個點,實現了全局搜索。
 
當然,實際使用中,狀態轉移可根據問題調整各個算子的順序和使用比例,需要什么才學什么。在這個意義上狀態轉移算法是優化問題的通解,而一般的仿生算法往往是根據某個具體過程去建立一個復雜的描述模型,形式比較局限,只能解決一類問題。對於一般的仿生算法,個人有兩點理解:
 
(1)仿生算法實際上是從大自然那里“偷”了一個特殊問題的特殊解。自然選擇最終收斂到的一種生物現象,可能適用於生物的某些生存需要和自然條件。但這種解太復雜,受太多變量影響,而且不一定在因果上有什么必然性,我堅信一個觀點:存在不一定合理,存在一定穩定。畢竟自然選擇不是由特定環境得出特定性狀,而是多種性狀早已由隨機性各自大量存在,適應的生,不適應的就死而已。某種生物在行為上顯示出來的“智慧”,更多是一種針對當前它生存需要的一種特殊表現。而生物主觀上並不具有形成這樣策略的智慧。例如:灰狼知道大致的搜索捕獵,先探索再包圍,跟着頭狼走等等,但這並不是他們后天經過思考和實驗得出的理論。而僅僅是自然選擇遺留下來,保存在灰狼基因里面的一種稟賦。因此,在這個意義上面不算是真正的“智能”。
 
(2)仿生算法可能與生物的實際表現不一致,如灰狼算法中灰狼表現出規則的三頭狼結構,並且三頭狼持續為剩下的狼提供位置信息。這一點雖然形象,但不免想象成分過多,沒有人證明狼群中存在這樣三頭狼確定一個目標范圍(隨機圓)的機制。因此,盡管這策略很像我們腦海中的一般印象里的狼群,但不如說這是作者自己用自己的想象構建了一種虛構的狼群:狼群中每一只狼都能夠能夠評估自己的當前得分,無間斷吸收頭狼信息並更新自己的位置,這顯然是人類智慧的風格。因此灰狼算法可以說是套了個灰狼殼子的一種特殊設計的搜索算法,效果可能是不錯的,但與實際的灰狼的智能可能沒有那么相像,而且灰狼有沒有智能也是一個問題。  

關於人工智能學派
不同的人從不同的方向研究人工智能理論, 最典型研究方法有三種:

(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個

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM