遗传算法最重要的几个步骤
1.编码。
一般可采用二进制编码。本题使用和tsp相同的符号编码(可使用一个数组保存)
2.选择。根据个体的评分进行选择,涉及到累计概率。
3.交叉。通过互换基因,从而产生新的个体。
4.变异。产生新的个体。
1 #include <stdio.h> 2 #include <vector> 3 #include <time.h> 4 #include <stdlib.h> 5 #include <algorithm> 6 7 using namespace std; 8 9 vector<vector<int>> population; 10 vector<int> best_body; 11 int min_pair = INT_MAX;//最小的逆序对 12 13 int scale;//种群规模 14 int arrNum;//基因个数 15 16 int MAX_ROUND;//循环次数 17 int mutation_times; 18 19 float crossover_p;//交叉概率 20 float mutation_p;//变异概率 21 22 23 //初始化 24 void init() { 25 for (int i = 0; i < arrNum; ++i) { 26 best_body.push_back(0); 27 } 28 srand(time(NULL)); 29 for (int i = 0; i < scale; ++i) { 30 vector<int> temp; 31 for (int j = 0; j < arrNum;) { 32 int p = int(((double) rand() / RAND_MAX) * arrNum); 33 if (find(temp.begin(), temp.end(), p) == temp.end()) { //不存在 34 temp.push_back(p); 35 ++j; 36 } 37 } 38 population.push_back(temp); 39 } 40 41 } 42 43 44 //逆序对 45 int reverse_order_pair(vector<int> &vec) { 46 int sz = vec.size(); 47 int sm = 0