八數碼難題是將乙個陣列序列通過3x3格式的拼圖方式,經過多次滑動轉換變成序列為「123804765」的序列。目標序列如圖所示:
1 2 3
8 0 4
7 6 5
本部落格使用了基因遺傳演算法,通過基因序列完成變換完成實驗。以下將通過知識表示形式,搜尋策略,搜尋效率和完備性進行說明。
在基因遺傳演算法中,基因是每次變化的方式,由於變換的方式只有上,下,左,右四種方式,所以只需要二進位制表示方式,每兩位表示一種變換方式,即「00」,「01」,「10」,「11」各表示一種變換方式,在基因序列中找到合適的序列就可以獲得完成序列變換的最終結果。
同時在是否是最後的目標序列的判斷上,使用了目標序列和現序列相同位置相同數字的和,當每個位置相同的時候,即為最後的變換結果。
在搜尋過程中,將一代基因隨機產生,通過變換判斷,獲取一條基因是否可以變成目標序列,當無法產生的時候,可以通過突變,交叉遺傳以及選擇遺傳的方式,將基因遺傳演算法傳到下一代再次進行計算,在這種演算法情況下,通過設定基因長度,可以調整最長變換次數,再通過代數調整,可以對演算法次數進行調整。
根據搜尋引數的調整,可以改善八數碼難題遺傳演算法的收斂速度,所以在整個**中,選擇了種群為150,基因規模為140,變異最大長度為10,交叉概率為0.75,變異概率為0.09,最大遺傳代數為1000,交叉最大長度為20,精英遺傳規模為10的引數。
**如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
double eps = 1e-10;
const
int ps = 150;
const
int gs = 200;
const
double pc = 0.75;
const
double pm = 0.09;
const
int deep = 2000;
const
double p_ps = 1.0 / ps;
const
int ds = 10;
const
int cmaxlen = 20;
const
int mmaxlen = 10;
const
int sucessvalue = 440;
char ss[12];
bool findans;
int ansid, anslen;
int r0,c0;
struct node st, ed;
int ed_map[10][2];
int dir_i[4] = ;
int dir_j[4] = ;
///00 01 10 11
char print_op[4] = ;
struct chromsome
};vector
population[2];
double psum[2];
int now;
int next1;
int nextn;
inline
int randomidx(int x)
inline
double random()
inline
int check(int i, int j)
int get_h(node a)
int getfitnessvalue(int id, node a)}}
return ret;
}void calc()
//sort(population[now].begin(), population[now].end());
for (int i = 0; i < ps; i++)
//printf("\n");
}void init()
}}int selection()
}return ps - 1;
}void crossover(int x, int y)
void mutation(int x)
void out(string s, int len)
ans.push_back(x);}}
char ss1[12];
for(int i = 0; i < 12; i ++)
printf("\n原拼圖:\n");
printf("%d %d %d\n",st.tab[0][0],st.tab[0][1],st.tab[0][2]);
printf("%d %d %d\n",st.tab[1][0],st.tab[1][1],st.tab[1][2]);
printf("%d %d %d\n\n",st.tab[2][0],st.tab[2][1],st.tab[2][2]);
for (int i = 0; i < ans.size(); i++)
else
if(print_op[ans[i]] == 'r')
else
if(print_op[ans[i]] == 'u')
else
if(print_op[ans[i]] == 'd')
}puts("");
}void out_table(node a);
void ga()
xx = random();
if (xx < pm)
xx = random();
if (xx < pm)
}next1 = now;
now ^= 1;
dep++;
}if (findans) out(population[now][ansid].gene, anslen);
cout
<< "代數: "
<< dep<< " 代"
<< endl;
}void solve()
void out_table(node a)
}}void in(char s, node &st)
}}void pre()
}int get_preval(node a)
return ret % 2;
}bool pre_solve()
int main()
return
0;}
python遺傳演算法 Python 遺傳演算法實現
關於遺傳演算法 遺傳演算法是仿照自然界中生物進化而產生的一類優化演算法。個人感覺遺傳演算法簡單粗暴,適應性廣。關於遺傳演算法的介紹網上有很多了,這裡按照我自己的理解簡單概括一下。編碼解碼,將待優化的引數編碼為dna序列,最簡單直接的為二進位制編碼 即有兩種鹼基的dna鏈 生成隨機初代 選擇,適應度 ...
tsp問題 遺傳演算法解決
tsp問題最簡單的求解方法是列舉法。它的解是多維的 多區域性極值的 趨於無窮大的複雜解的空間,搜尋空間是n個點的所有排列的集合,大小為 n 1 可以形象地把解空間看成是乙個無窮大的丘陵地帶,各山峰或山谷的高度即是問題的極值。求解tsp,則是在此不能窮盡的丘陵地帶中攀登以達到山頂或谷底的過程。這一篇將...
遺傳演算法解決PlayTennis問題
機器學習課程結束,作為遺傳演算法小白,簡單實現了遺傳演算法解決playtennis問題,參考湯姆.公尺切爾的 機器學習 本人認為這個問題最大的難點在於如何設計適應度函式。首先把天氣狀況表示為二進位制位串 outlook sunny 100overcast 010rain 001humidity hi...