matlab Grefenstette的編碼與解碼

2021-10-06 02:42:37 字數 1693 閱讀 9531

在遺傳演算法中

執行交叉變異得到正確的子代結果

是十分重要的一步

為了更好的交叉變異

有人發明了grefenstette編碼

grefenstette的編碼定義如下:

既是:通過已有的順序(非常重要,編碼解碼都靠它)

產生乙個訪問序列,

且每訪問完乙個點,就需要把點從已有序列刪除,形成新的序列

作為新的訪問前置條件

例如已有順序

1,2,3,4,5

編碼集:4,2,1,2,1

通過編碼集得到的解碼集:

解碼集:4,2,1,5,3

注意編碼集最後一位永遠都是以1結束

以種群數量s 與 生存環境數量m為研究物件,

產生乙個1——m的序列

加上s就是:

產生乙個sxm的原始已有序列矩陣,每一行為乙個種群對於的已有序列

再根據grefenstette的編碼規則:

訪問生成序列下標並刪除對應點

得到編碼程式:

%grefenstette的編碼與主函式

s=3;%種群數量

m=5;%城市數量

pop=zeros(s,m);

for i=1:s

%產生1-t的隨機數列

pop(i,1:m)=randperm(m);

endfprintf('原始資訊(一行為乙個資訊)');

pop% 編碼

grepop=zeros(s,m); %原始種群grefenstette編碼的結果

%grefenstette的編碼

for i=1:s

%一行代表乙個生存環境

temp=[1:1:m];

for j=1:m

loc=find(pop(i,j)==temp);

grepop(i,j)=loc(1);

temp(loc(1))=;

endend

fprintf('編碼結果:');

grepop

又根據編碼結果來計算解碼集:

得到編碼程式:

grepop是已知的編碼集矩陣

s,m對應於編碼程式的s,m

%grefenstette的解碼

function grefenstettedecode(grepop,s,m)

%解碼 for i=1:s

%初始資料1--m

temp=[1:1:m];

for j=1:m

%解碼集

%temp(grepop(i,j))

pop(i,j)=temp(grepop(i,j));

%一行代表乙個生存環境

%去掉temp(grepop(i,j))

temp(grepop(i,j))=;

endend

pop

舉例:

2種群,4城市:

可以看到完全將隨機產生的原始資訊還原回來了。

完。加油,奧利給!

譯 微軟官方的 C 編碼風格

對於c 檔案 cpp和 h 我們使用clan格式 版本3.6 來確保 樣式。在更改任何cpp或 件之後,在合併之前,必須執行src native format code.sh。此指令碼將確保所有本機 檔案都遵循編碼樣式準則。對於非 檔案 xml等 我們當前的最佳指導是一致性。編輯檔案時,保持新 和更...

PL SQL開發命名和編碼規範(譯)

引言 對於開發來說制定規範是非常重要的,當你制定出一套標準後,行為就會自然而然的遵循這些規範。就像學開車一樣,起初為了讓汽車正常發動都要費個九牛二虎之力,現在你可能完全不動腦子就能開的很溜。規範也類似,一旦習慣了以後他們就像完全不存在了。乙個規範好不好的唯一評價標準就是對你的工作是否確實有幫助,想達...

稀疏矩陣格式 COO CSR CSC 及其編碼解碼

一般情況下,稀疏矩陣指的是元素大部分是0的矩陣 矩陣的稀疏性可以用乙個分數來量化,即矩陣中零元素的個數除以矩陣中元素的總數 這種儲存格式比較簡單易懂,每乙個元素需要乙個三元組來表示,分別是 行號 列號 數值 對應上圖的右面一列。這種方式簡單,但是記錄單資訊多,每個三元組可以自己定位,不需要解碼,空間...