遺傳演算法解決八數碼難題

2021-08-02 05:00:04 字數 3340 閱讀 1646

八數碼難題是將乙個陣列序列通過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...