在遺傳演算法中
執行交叉變異得到正確的子代結果
是十分重要的一步
為了更好的交叉變異
有人發明了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的矩陣 矩陣的稀疏性可以用乙個分數來量化,即矩陣中零元素的個數除以矩陣中元素的總數 這種儲存格式比較簡單易懂,每乙個元素需要乙個三元組來表示,分別是 行號 列號 數值 對應上圖的右面一列。這種方式簡單,但是記錄單資訊多,每個三元組可以自己定位,不需要解碼,空間...