1. 程式人生 > >遺傳演算法的matlab實現(續 )

遺傳演算法的matlab實現(續 )

       上一篇部落格中程式碼部分有人應該會有疑惑,在這裡我先做一些介紹:

  • 自然選擇部分使用了排名法,適應度越高越難被淘汰,但是適應度最高的不會被淘汰;
  • 裡面出現了很多個個體,其中父代是一個種群N,交叉之後有了兩種子代2N,變異之後也會出現子代N,共4N,因此自然選擇需要淘汰到只剩N個個體,作為下一代的父代。 
       不過關於多維函式極值的遺傳演算法寫法,很多人直接將每一個變數單獨作為一個種群,以此並行遺傳,雖然這樣可行,但是從程式碼編寫上很不美觀,而且當變數很多時,這種策略顯然不可行。下面我也給出了一種多維函式極值的遺傳演算法程式:

        問題背景是求z=2-exp(-x^2-y^2)的極值(最大值和最小值)。

clc;clear;close all;
%% 引數設定
N = 50;                    %種群數量
ger = 100;                 %迭代次數
L = [5 5];                 %基因長度
pc = 0.8;                  %交叉概率
pm = 0.1;                  %變異概率
R = [-5 5;-5 5];           %變數範圍
%% 初始化
%初始化解碼器
decode = cell(length(L),1);
for k = 1 : length(L)
    decode{k}= zeros(L(k),1);
    for i = 1 : L(k)
        decode{k}(i) = 10^(L(k)-i);
    end
end
%初始化種群
x = randi([0 9],[N,sum(L)]);     %初始化父代種群
x1 = x;                          %初始化交叉子代種群1
x2 = x;                          %初始化交叉子代種群2
x3 = x;                          %初始化變異子代種群
a = zeros(4*N,length(L));        %中間種群
%% 開始遺傳
for i = 1 : ger
    for j = 1 : N
        if rand < pc
            p = randi(N);        %確定交叉物件
            start = 1;
            for k = 1 : length(L)
                q = randi(L(k)-1);%確定交叉節點
                x1(j,start:sum(L(1:k))) = [x(j,start:sum(L(1:k-1))+q),x(p,start+q:sum(L(1:k)))];
                x2(j,start:sum(L(1:k))) = [x(p,start:sum(L(1:k-1))+q),x(j,start+q:sum(L(1:k)))];
                start = start + L(k);
            end
        end
        if rand < pm
            start = 0;
            q = randi(L(k));%確定變異節點
            for k = 1 : length(L)
                x3(j,start+q) = randi([0 9]);
                start = start + L(k);
            end
        end
    end
    x = [x;x1;x2;x3];%合併父代子代
    start = 1;
    for k = 1 : length(L)
        a(:,k) = x(:,start:sum(L(1:k)))*decode{k}*(R(k,2)-R(k,1))/(10^L(k)-1)+R(k,1);%解碼
        start = start + L(k);
    end
    y = -f(a);%計算適應度
    z = [x,y];
    z = sortrows(z,sum(L)+1);%對適應度排序
    while size(z,1) > N
        n = randi(size(z,1));
        if rand > n/size(z,1)%自然選擇,排名法
            z(n,:) = [];
        end
    end
    z(:,sum(L)+1) = [];%去除最後一列(適應度)
    x = z;
    t(i)=-max(y);
end
start = 1;
xm = zeros(1,length(L));
for k = 1 : length(L)
      xm(k) = x(end,start:sum(L(1:k)))*decode{k}*(R(k,2)-R(k,1))/(10^L(k)-1)+R(k,1);%取最後一代適應度最高的個體
      start = start + L(k);
end
xm(abs(xm)<1e-3)=0;
ym =f(xm);
disp(['最優解為:',num2str(xm)]);
disp(['最優值為:',num2str(ym)]);
plot(t);title('適應度曲線')
子函式:
function y = f(x)
    y = 2 - exp(-x(:,1).^2-x(:,2).^2);
end

      上面的程式碼求的是最小值,因此在求適應度時加上了負號(記錄適應度的地方也加上了負號),如果要求最大值,自然只需要把負號去掉即可,結果如下:


     在這裡我們發現了一個問題,最大值處對應的最優值不穩定,為何呢?我們先來做一個實驗,編一個自定義窮舉函式,大家可以自己試試看:

clc;clear;close all;
x = -5 : 0.01 : 5;
y = -5 : 0.01 : 5;
x1 = repmat(x,length(x),1);
x2 = x1(:);
y1 = repmat(y',1,length(y));
y2 = y1(:);
z = f([x2,y2]);
n = find(z == max(z));
xm = [x2(n),y2(n)];
ym = max(z)
     最後發現,最優值的確為2,但是對應的最優解卻多達4w多種,從函式形式來看,由函式單調性可知當x,y為-5/5時,函式取最大值,這是什麼原因呢?我們先畫出函式的深度圖: 深度圖        可以發現,除了中間部分,絕大部分的值都差不多,這是因為函式中有指數函式,並且matlab預設誤差值為2e-16,二者綜合作用下,很難找到真正的極值點,那麼我們是否沒辦法呢?這類問題可以通過改造適應度函式來實現,當然這隻能在可以明確適應度函式單調性的情況下使用,可以將適應度函式改為z0=x^2+y^2,那麼我們最終就只需要做一下轉換z=2-exp(-z0)即可,再套用上面的程式碼可輕鬆實現。

相關推薦

2.遺傳演算法matlab實現2:再加例項兩個一元二元完整作圖,二維圖形,三維圖形以及進化過程圖

(1)直接在命令視窗輸入以下程式碼: figure(1); hold on; lb=1;ub=2; %函式自變數範圍[1,2] ezplot('sin(10*pi*X)/X',[lb,ub]);

遺傳演算法matlab實現

       上一篇部落格中程式碼部分有人應該會有疑惑,在這裡我先做一些介紹: 自然選擇部分使用了排名法,適應度越高越難被淘汰,但是適應度最高的不會被淘汰;裡面出現了很多個個體,其中父代是一個種群N,交叉之後有了兩種子代2N,變異之後也會出現子代N,共4N,因此自然選擇需

直方圖均衡化matlab實現

彩色影象直方圖均衡化: %彩色影象直方圖均衡化matlab clear I=imread('12.bmp');%讀取影象 R=I(:,:,1); G=I(:,:,2); B=I(:,:,3); J(:

粒子群演算法matlab實現

clc;clear;close all; %% 初始化種群 f= @(x)x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x); % 函式表示式 figure(1);ezplot(f,[0,0.01,20]); N = 50;

粒子群演算法matlab實現

      上一次的部落格中我將粒子群的搜尋過程可視化了,並將其轉存為了gif格式檔案,這個過程我先在這裡給大家講一下: 1.首先pause(),是在每次繪圖之後暫停一段時間,單位是秒,再進行下一次繪圖; 2.而當要轉存為gif檔案時,這其實就是一種無聲的視訊檔案,因此我們

數字圖像處理的Matlab實現3—灰度變換與空間濾波

彩色圖像 equals 相同 tca 彩色 處理工具 off argc ber 第3章 灰度變換與空間濾波(1) 3.1 簡介 空間域指的是圖像平面本身,這類方法是以對圖像像素直接處理為基礎的。本章主要討論兩種空間域處理方法:亮度(灰度)變換與空間濾波。後一種方法有時涉及到

GIS資訊關聯規則挖掘——Apriori演算法實現

上篇說明了原理,這篇就直接上核心程式碼了~ 程式碼比較長,所以理解可能有點麻煩,核心思路就是計算選擇的維度後遍歷資料,逐步進行迴圈計算置信度,並淘汰每次迴圈後的最低值。 這裡有一點要注意的,我一開始想用arraylist構造一個堆疊結構進行資料遍歷的儲存跟計算,因為這樣效率比較高。

GIS資訊關聯規則挖掘——Apriori演算法實現

最近閒著無聊沒啥課,幫讀master的朋友做了一個桌面端的GIS系統,主要功能是景區管理。 其中有個核心功能挺有意思的,就是統計所有景區受損設施的所有致損型別和每個型別具體包含的致損因子後,計算致損因子之間的關聯規則,然後可以根據使用者選定的致損型別組合計算出其景區設施造成損害的概率。(有點

全排列問題演算法實現Permutation

前言 做專案遇到資料採集系統中ADC拼合問題,如果順序不對,波形就是錯誤的(題外話),為了找到正確的順序,涉及到排列問題。 什麼是排列組合 定義 一般地,從n個不同元素中取出m(m≤n)個元素,按照一定的順序排成一列,叫做從n個元素中取出m個元素的一個排列(Arran

邊緣檢測之Canny演算法_Qt實現C++

邊緣檢測之Canny演算法_Qt實現(C++) Canny邊緣檢測演算法的簡單介紹   Canny的目標是找到一個最優的邊緣檢測演算法,最優邊緣檢測的含義是: 好的檢測 - 演算法能夠儘可能多地標識出影象中的實際邊緣。 好的定位 - 標識出的

輕量級分散式RPC框架實現

1、背景 最近在搜尋Netty和Zookeeper方面的文章時,看到了這篇文章《輕量級分散式 RPC 框架》,作者用Zookeeper、Netty和Spring寫了一個輕量級的分散式RPC框架。花了一些時間看了下他的程式碼,寫的乾淨簡單,寫的RPC框架可以算是一個簡易版的

Dijkstra演算法簡單實現C++

圖的最短路徑問題主要包括三種演算法: (1)Dijkstra (沒有負權邊的單源最短路徑) (2)Floyed (多源最短路徑) (3)Bellman (含有負權邊的單源最短路徑) 本文主要講使用C++實現簡單的Dijkstra演算法 Dijkstra演算法簡單實現(C++) 1 #in

自動升級系統OAUS的設計與實現 附最新原始碼

private void button1_Click(object sender, EventArgs e) { int changedCount = 0; int addedCount = 0; List<FileUnit&g

歐幾里得演算法實現Java

package euclidean_algorithm; import java.util.Scanner; /** * @author ALazy_cat * 歐幾里得演算法的自然語言描述:

MATLAB 】兩個序列的卷積和運算的MATLAB實現1

設矩形脈衝  是脈衝響應  的LTI系統的輸入,求輸出 y(n). 下面的指令碼中用到了一個自定義的函式,也就是兩個訊號相加的函式: function [y,n] = sigadd(x1,n1,

三.從零寫雙鏈表到基本演算法實現

一.雙鏈表的引入和基本實現 1.雙鏈表的結構 首先,我們要明白雙鏈表並不是有兩條鏈的連結串列,而是有兩個遍歷方向的連結串列,因此我們所說的雙鏈表其實就是雙向連結串列的簡稱。 2.有效資料+2個指標的節點(雙鏈表) (1)單鏈表的節點 = 有效

python常見排序演算法實現

在Python程式設計的實踐中,我們往往會遇到排序問題,比如在對搜尋引擎搜尋結果的排序(沒有排序就沒有Google、baidu等搜尋引擎的存在),當然,這樣的例子數不勝數。我大學中的必修課程《資料結構》

[PlantSimulation]GAWizard遺傳演算法的應用

在閾值設定問題中,需要給目標值設定合適的變化範圍,換句話說,就是找到一個最大值和最小值,使其在其區間內變化,從而是系統穩定、高效執行。在PlantSimulation中常見的就是優化暫存區的容量。此次案

五子棋AI演算法簡易實現

基礎篇 (1)勝負判定 五子棋的勝負判定的條件是其中一方下棋以後,橫線、豎線、右上斜線或者右下斜線任一方向出現五子相連,即可判定獲勝。此處用遞迴方法即可實現。 var is_win = false; var ModuleWinnerC

K-means和K-means++演算法程式碼實現Python

K-means和K-means++主要區別在於,K-means++演算法選擇初始類中心時,儘可能選擇相距較遠的類中心,而K-means僅僅是隨機初始化類中心。 #K-means演算法 from pylab import * from numpy import * impo