遗传算法解决TSP问题

基本原理Holland的模式定理提出,遗传算法的实质是通过选择、交配和变异算子对模式进行搜索,低阶、定义长度较小且平均适应值高于群体平均适应值的模式在群体中的比例将呈指数级增长。即随着进化的不断进行,较优染色体的个数将快速增加。模式定理模式:指群体中编码的某些位置具有相似结构的染色体集合 模式的阶:指模式中具有确定取值的基因个数 模式的定义长度:指模式中第一个具有确定取值的基因到最后一个具有确定
摘要由CSDN通过智能技术生成

基本原理

Holland的模式定理提出,遗传算法的实质是通过选择、交配和变异算子对模式进行搜索,低阶、定义长度较小且平均适应值高于群体平均适应值的模式在群体中的比例将呈指数级增长。即随着进化的不断进行,较优染色体的个数将快速增加。

模式定理

模式:指群体中编码的某些位置具有相似结构的染色体集合
模式的阶:指模式中具有确定取值的基因个数
模式的定义长度:指模式中第一个具有确定取值的基因到最后一个具有确定取值的基因的距离

遗传算法的基本问题

  • 染色体的编码

  • 群体的初始化

  • 适应值评价

  • 选择种群

  • 种群交配

  • 种群变异

1.染色体编码

染色体的编码也就是问题解的表示,染色体编码的确定会对接下来的交配和变异构成影响。目前常用的两种简单的编码方式:二进制编码和浮点数编码。在含有多变量的优化问题或对精度要求较高时寻求浮点数编码方法。

2.群体初始化

一般情况下,遗传算法在群体初始化阶段采用的是随机数初始法,采用生成随机数的方法对染色体每一维变量进行初始化赋值。(如果在初始化阶段已经保证种群是优良群体的话,将有效提高算法找到全局最优解的能力。

3.适应值评价

采用评估函数区分染色体的优劣。在遗传算法中,规定适应值越大的染色体越优。因此对于一些求解最大值的数值优化问题,我们可以直接套用问题定义的函数表达式。但是对于其他优化问题,问题定义的目标函数表达式必须经过一定的变换。

4.选择算子

种群的选择操作使用轮盘赌注算法,其基本思想是概率的随机选择。
1)根据群体中的每个染色体的适应值得到整个群体的适应值总和。
2)分别计算每个染色体的适应值与总适应值之比Pi。
3 )假设一个轮盘有N个扇区,每个染色体对应一个扇区,每个扇区的大小与Pi成正比。
4)每转动一次轮盘,轮盘停止时指向的扇区为被选中进入种群的群体。
5)进行N次选择即可得到同样规模为N的种群。

这里写图片描述
这里写图片描述

从轮盘的赌注机制可以看到,较优染色体的P值较大,被选中的可能性也越大。但由于过程的选择具有随机性,也给予了较差染色体一定的生存空间。

5.交配算子

在染色体交配阶段,每个染色体能否进行交配由交配概率Pc(一般取值为0.4到0.99之间)决定,其具体过程为:对于每个染色体,如果Random(0, 1)小于Pc则表示该染色体可进行交配操作(其中Random(0, 1)为[0, 1]间均匀分布的随机数),否则染色体不参与交配直接复制到新种群中。

每两个按照Pc交配概率选择出来的染色体进行交配,经过交换各自的部分基因,产生两个新的子代染色体。具体操作是随机产生一个有效的交配位置,染色体交换位于该交配位置后的所有基因。
这里写图片描述

6.变异算子

染色体的变异作用于基因之上,对于交配后新种群中染色体的每一位基因,根据变异概率Pm判断该基因是否进行变异。如果Random(0, 1)小于Pm,则改变该基因的取值(其中Random(0, 1)为[0, 1]间均匀分布的随机数)。否则该基因不发生变异,保持不变。
这里写图片描述

遗传算法的流程

这里写图片描述

基于遗传算法的旅行商问题

1.初始群体的设定
定义一个s行t列的pop矩阵来表 示群体, t 为城市个数 ,即 N , s 为样本中个 体数目。在本文探讨了 10 个城市的 TSP 问题,此 时 t 取值 10,该矩阵中每一行的前10 个元素表示 经过的城市编号,并且另设置一维向量代表每个个体的适应度(每个个体所求的距离)。

//初始化种群
    public void init(){

        //该矩阵中每一行的前N个元素表示 经过的城市编号,
        group=new int[gen][N];

        //随机初始化 
        for(int i=0;i<gen;++i){
            boolean[] visit = new boolean[N];
            for(int p=0;p<N;++p){
                visit[p]=false;
            }
            for(int j=0;j<N;++j){
            Random rand = new Random();

            while(true){
            int randInt = rand.nextInt(10);
            if(visit[randInt]==false){
                visit[randInt]=true;
                group[i][j]=randInt;
                break;
            }
            }

            }
        }
    }

2.适应度函数的计算
用距离的总和作为适应度函数,来衡量求解结果是否最优。

//初始化dist[][]
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值