模擬退火算法優(yōu)化指派問題

1、引言

之前二狗已經(jīng)分別介紹過了,如何用模擬退火算法和遺傳算法,進(jìn)行背包問題的求解。其實(shí)背包問題是可以看成是一個(gè)可以看成是一個(gè)比較特殊的,有線性約束的,0-1規(guī)劃問題。在數(shù)學(xué)中還有很多其他特殊的問題,比如指派問題。指派問題可以看成是更特殊的多個(gè)背包問題(很多個(gè)背包求優(yōu),每個(gè)背包只能裝一樣物品)?;局概蓡栴}一般可以描述為有n個(gè)任務(wù)n個(gè)人。要求為n個(gè)任務(wù)分配給指定的人來完成。并且在這種基本情況下,人和任務(wù)需要是一一對(duì)應(yīng)的關(guān)系。不能有重復(fù),不能出現(xiàn)兩個(gè)人做同一個(gè)任務(wù),或者一個(gè)人同時(shí)做兩個(gè)任務(wù)的情況。(這些情況也屬于指派問題的范疇,但屬于更加復(fù)雜的情況,今天就不做講解)。指派問題已經(jīng)有了明確可解的算法,也就是我們大家都知道的匈牙利算法。同樣的,這個(gè)問題也可以使用模擬退火來解決。今天我們就使用模擬退火算法來為大家演示,如何在指派問題進(jìn)行優(yōu)化?

2、 數(shù)據(jù)結(jié)構(gòu)及重點(diǎn)講解

指派矩陣如圖

模擬退火算法優(yōu)化指派問題的圖1

每行代表每個(gè)人單獨(dú)做每個(gè)工作的時(shí)間或費(fèi)用(cost),每列代表每個(gè)工作分別由每個(gè)人完成時(shí)的cost。矩陣中位于(i,j)的元素是第i個(gè)人做第j個(gè)工作的cost。將這四個(gè)元素相加即為整個(gè)問題的最優(yōu)解。由于是cost,當(dāng)然越小越好。

 

模擬退火算法這個(gè)名稱的來源大家已經(jīng)知道了,我們就不再贅述。這里要提的是退火算法中的馬爾可夫鏈。如果將每個(gè)特定時(shí)間序列上的解空間狀態(tài)看成離散的,并將這些離散狀態(tài)連成一條鏈的話。那么整個(gè)求解過程就是一條馬爾可夫鏈,這一個(gè)時(shí)刻的狀態(tài),只和上一個(gè)相鄰的時(shí)間點(diǎn)上的狀態(tài)相關(guān),而與之前的時(shí)間點(diǎn)狀態(tài)都無關(guān)。這聽起來有點(diǎn)像還錢。我不管誰欠你的錢,但是我只知道你欠我錢,我只管你要。SA中馬爾可夫鏈的長(zhǎng)度就是模擬退火中溫度的變化。

 

還有一個(gè)屬于模擬退火算法的特色概念,也就是它跳出局部極小值解的方法:將原有的目標(biāo)函數(shù)值和新求出的目標(biāo)函數(shù)值相減,得出一個(gè)delta值。如果這個(gè)值是小于零的,證明解優(yōu)化,否則的話,就以一定的概率去接受它。這個(gè)概率是隨著不同的溫度和不同delta變化而變化的。

3、代碼

% 結(jié)束條件為兩次差小于一個(gè)特定量

% MarkoveLength 馬爾科夫鏈長(zhǎng)度

% DecayScale 溫度衰減參數(shù)

MarkoveLength=1000;

DecayScale=0.9;

Temperature=1000; 

% initial temperaturet = 1;

% final temperature%指派矩陣,每個(gè)人做每件事所需要的費(fèi)用

assingnMatrix=[17,1,9,15,16;8,15,17,9,11;5,8,4,18,12;20,6,14,9,7;17,14,2,10,1];

% 初始解x=[1,2,3,4,5];

totalCost = 0;

for i=1:5   

totalCost=totalCost+assingnMatrix(i,x(i));

end

BestCost=totalCost;

BestAssign=x;while (Temperature > t || abs(deltaCost)<2)    

    for i = 1:MarkoveLength       

       r = randperm(5,2); 

%產(chǎn)生兩個(gè)隨機(jī)數(shù),用來交換x中的任務(wù)分配順序        

        r1=r(1);    

    r2=r(2);    

    temp=x(r1);    

    x(r1)=x(r2);    

    x(r2)=temp;        

        %  計(jì)算        

        totalCost=0;        

        for k=1:4            

            totalCost=totalCost+assingnMatrix(k,x(k));        

        end        % 判斷費(fèi)用是否優(yōu)化       

       deltaCost=totalCost-BestCost;       

        if deltaCost <= 0            

            BestCost = totalCost; 

            % 若費(fèi)用減少則無條件接受           

            BestAssign=x;        

        else            

            if (rand()<exp(-deltaCost/Temperature))               

                BestCost = totalCost;  %否則在一定概率下接受              

                BestAssign=x;           

            end       

        end   

    end  

    Temperature=Temperature*DecayScale;

    

enddisp(BestCost);

disp(assingnMatrix);

disp(BestAssign);

4、直觀理解

說了這么多,初學(xué)的狗子們可能會(huì)有點(diǎn)不知所措。在看完了代碼之后,不如看一下下面的二維曲面搜尋小動(dòng)畫。這里以一個(gè)二維尋優(yōu)函數(shù)為例,不同的顏色代表著不同的溫度。圓圈代表著在搜索范圍內(nèi),計(jì)算和比較鄰居中比當(dāng)前解更好(或接受概率更大)的解。每次跳躍代表著取了更好的解,也就是用新解代替舊解。這個(gè)過程視不同目標(biāo)函數(shù)及約束條件變化而變化,希望狗子們忽略細(xì)節(jié),領(lǐng)會(huì)精神。

來源:MATLAB愛好者

登錄后免費(fèi)查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項(xiàng)目客服
  • 培訓(xùn)客服
  • 平臺(tái)客服

TOP

4
1