1. 程式人生 > 其它 >模擬退火演算法經典圖的程式碼

模擬退火演算法經典圖的程式碼

模擬退火演算法(Simulated Annealing,SA)有一張特別經典的圖,用於說明SA演算法為何能跳出區域性最優解,找到全域性最優解。在寫論文是必須要有原圖和可編輯的原始檔案,網上找了好久都沒找到程式碼,在此記錄一下。

假定初始解為左邊藍色點A,模擬退火演算法會快速搜尋到區域性最優解B,但在搜尋到區域性最優解後,不是就此結束,而是會以一定的概率接受到左邊的移動。經過幾次這樣的不是區域性最優的移動後有可能會到達全域性最優點D,於是就跳出了局部最小值。

MATLAB版實現如下:

x=-8.2:0.05:8.5;
y =(x-2).*(x+2).*(x+5).*(x-4).*(x+7).*(x-8.5);
plot(x,y,'r','LineWidth',2);
axis([-10,10,-60000,60000]);
hold on
//(x1,y1),(x2,y2),(x3,y3)分別是三個極小值點,其中(x3,y3)是最小值點
x1=-6.25;
x2=-0.1;
x3=7.2;
y1=-4970;
y2=-4757;
y3=-34480;
sz=200;
scatter(x1,y1,sz,'p','MarkerEdgeColor','g','MarkerFaceColor','y')
scatter(x2,y2,sz,'p','MarkerEdgeColor','g','MarkerFaceColor','y')
scatter(x3,y3,sz,'p','MarkerEdgeColor','k','MarkerFaceColor','k')
hold on
sz1=80;
x0=-8:0.4:-6.7;
y0=(x0-2).*(x0+2).*(x0+5).*(x0-4).*(x0+7).*(x0-8.5);
scatter(x0,y0,sz1,'filled','b');
hold on
x0=-5.5:0.9:-0.5;
y0=(x0-2).*(x0+2).*(x0+5).*(x0-4).*(x0+7).*(x0-8.5);
scatter(x0,y0,sz1,'filled','b');
hold on
x0=0.8:0.8:6.8;
y0=(x0-2).*(x0+2).*(x0+5).*(x0-4).*(x0+7).*(x0-8.5);
scatter(x0,y0,sz1,'filled','b');

'MarkerEdgeColor' - 標記輪廓顏色,使用方法:'MarkerEdgeColor','某個顏色代號',

'MarkerFaceColor' - 標記填充顏色,使用方法:'MarkerFaceColor','某個顏色代號',

'filled' - 用於填充標記內部的選項,使用方法:'filled','某個顏色代號',

注意:'MarkerEdgeColor' 和 'MarkerFaceColor' 可以結合使用,兩者都不可以與 ‘filled’ 結合使用。

原因是: 'filled' 選項將 Scatter 物件的 MarkerFaceColor 屬性設定為 'flat',並將 MarkerEdgeColor 屬性設定為 'none',這樣便可只填充標記的面,而不繪製邊。

更多Scatter 知識請參見這篇博文 MATLAB中scatter函式的用法(繪製散點圖)

想直接拿無水印圖的點選 csdn上傳圖片無水印