遗传算法解决排序问题

该博客介绍了如何使用遗传算法解决排序问题,包括编码、选择、交叉和变异四个关键步骤。通过实施精英策略,算法的稳定性得到显著提高。文中还提供了一个实例代码的执行结果。
摘要由CSDN通过智能技术生成

遗传算法最重要的几个步骤

 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值