易语言 手撸改进遗传算法

本文将用易语言编写遗传算法求解TSP旅行商问题,matlab版本的原文链接是这个:matlab遗传算法求解TSP旅行商问题_原本无我的博客-CSDN博客_旅行商matlab

.版本 2
.支持库 TeeChart2011

.程序集 窗口程序集1
.程序集变量 城市位置, 位置, , "0"
.程序集变量 种群大小, 整数型
.程序集变量 最大迭代次数, 整数型
.程序集变量 交叉概率, 小数型
.程序集变量 染色体变异概率, 小数型
.程序集变量 代沟, 小数型
.程序集变量 染色体长度, 整数型, , , 城市位置的个数
.程序集变量 初始种群, 整数型, , "0"
.程序集变量 选择后子种群, 整数型, , "0"
.程序集变量 交叉后子种群, 整数型, , "0"
.程序集变量 变异后子种群, 整数型, , "0"
.程序集变量 该种群距离向量, 双精度小数型, , "0"
.程序集变量 该种群适应度, 双精度小数型, , "0"
.程序集变量 该种群距离向量排序, 双精度小数型, , "0"

.子程序 _按钮1_被单击
.局部变量 计次, 整数型
.局部变量 局部位置, 位置
.局部变量 位置数据, 文本型, , "0"
.局部变量 位置数据数组, 文本型, , "0"
.局部变量 距离数据, 双精度小数型, , "0"
.局部变量 随机路径长度, 双精度小数型
.局部变量 随机路径, 位置, , "0"
.局部变量 计次1, 整数型
.局部变量 迭代计数, 整数型
.局部变量 次代种群, 整数型, , "0"
.局部变量 计次2, 整数型
.局部变量 当前最短路径长度, 双精度小数型
.局部变量 最短路径长, 双精度小数型, , "0"
.局部变量 最佳个体, 整数型, , "0"
.局部变量 最佳个体索引, 整数型

' 随机产生位置
.' 计次循环首 (20, 计次)
    ' 位置.x = 取随机数 (0, 9999) ÷ 100
    ' 位置.y = 取随机数 (0, 9999) ÷ 100
    ' 加入成员 (城市位置, 位置)
.' 计次循环尾 ()

' 随机产生位置
位置数据 = 分割文本 (到文本 (读入文件 (取运行目录 () + “\位置.txt”)), #换行符, )
.计次循环首 (取数组成员数 (位置数据), 计次)
    位置数据数组 = 分割文本 (位置数据 [计次], 字符 (9), )
    .如果真 (取数组成员数 (位置数据数组) = 2)
        局部位置.x = 到小数 (位置数据数组 [1])
        局部位置.y = 到小数 (位置数据数组 [2])
    .如果真结束
    加入成员 (城市位置, 局部位置)

.计次循环尾 ()
绘点 (城市位置)
计算距离 (城市位置, 距离数据)  ' 城市位置数据(x,y)变成距离矩阵
' 遗传算法相关参数设置:
种群大小 = 100
最大迭代次数 = 500
交叉概率 = 0.9  ' %交叉概率,相当于基因遗传的时候染色体交叉
染色体变异概率 = 0.05  ' %染色体变异
代沟 = 0.9  ' 通过遗传方式得到的子代数为父代数*代沟,就是选择概率
染色体长度 = 取数组成员数 (城市位置)
初始化种群 (种群大小, 染色体长度, 初始种群)
重定义数组 (初始种群, 真, 种群大小, 染色体长度)  ' 至此种群初始化成功,放在变量 初始种群里面
画路径 (初始种群, 城市位置)  ' 画出随机解得路线图,其实就是第一个随机解
' 输出调试文本 (“初始种群中的一个随机值:  ” + 路径打印 (初始种群))  ' 打印路线函数,以1->2->3的形式在命令行打印路线,其实就是打印第一个随机解
.计次循环首 (染色体长度, 计次1)  ' 用于计算第一个随机路径的长度
    加入成员 (随机路径, 城市位置 [初始种群 [计次1]])
.计次循环尾 ()
随机路径长度 = 计算路径距离 (随机路径)

.计次循环首 (最大迭代次数, 迭代计数)
    初始化变量 ()
    计算最优秀个体 (初始种群, 城市位置, 该种群距离向量)
    该种群距离向量排序 = 该种群距离向量
    数组排序 (该种群距离向量排序, 真)
    当前最短路径长度 = 该种群距离向量排序 [1]
    TChart1.Series (0).AddXY (迭代计数, 当前最短路径长度, “”, 0)
    加入成员 (最短路径长, 当前最短路径长度)
    适应度 (该种群距离向量, 该种群适应度)
    种群选择 (初始种群, 该种群适应度, 代沟, 选择后子种群)
    种群交叉 (选择后子种群, 交叉概率, 交叉后子种群)
    种群变异 (交叉后子种群, 染色体变异概率, 变异后子种群)
    种群重插入 (初始种群, 变异后子种群, 该种群适应度)
    重定义数组 (初始种群, 假, 0)
    加入成员 (初始种群, 变异后子种群)
    重定义数组 (初始种群, 真, 取数组成员数 (初始种群) ÷ 染色体长度, 染色体长度)
.计次循环尾 ()
寻找最优个体 (初始种群, 该种群距离向量, 最佳个体, 最佳个体索引)
画最终路径 (最佳个体, 城市位置)
' 输出调试文本 (路径打印 (最佳个体))


.子程序 寻找最优个体
.参数 参数种群, 整数型, 数组
.参数 参数距离向量, 双精度小数型, 数组
.参数 参数最佳个体, 整数型, 数组
.参数 参数最佳索引, 整数型
.局部变量 数据字段, 字段信息, , "2"
.局部变量 计次, 整数型
.局部变量 最优个体索引, 整数型
.局部变量 计次1, 整数型


数据字段 [1].名称 = “索引”
数据字段 [1].类型 = #整数型
数据字段 [2].名称 = “距离”
数据字段 [2].类型 = #双精度小数型
输出调试文本 (创建 (取运行目录 () + “\寻找最优个体”, 数据字段))
打开 (取运行目录 () + “\寻找最优个体”, “最优个体库”, , , , , )
删除 (真)
彻底删除 ()
删除文件 (取运行目录 () + “\最优个体库排序库.EDB”)
.计次循环首 (取数组成员数 (参数距离向量), 计次)
    加记录 (计次, 参数距离向量 [计次])
.计次循环尾 ()
排序 (“最优个体库排序库”, “距离”, , , )
关闭 (“最优个体库”)
打开 (取运行目录 () + “\最优个体库排序库”, “最优个体库排序库”, , , , , )
最优个体索引 = 读字段 (“索引”, “最优个体库排序库”)
.计次循环首 (染色体长度, 计次1)
    加入成员 (参数最佳个体, 参数种群 [最优个体索引] [计次1])
.计次循环尾 ()
参数最佳索引 = 最优个体索引





.子程序 初始化变量

重定义数组 (该种群距离向量, 假, 0)
重定义数组 (该种群距离向量排序, 假, 0)
重定义数组 (该种群适应度, 假, 0)
重定义数组 (选择后子种群, 假, 0)
重定义数组 (交叉后子种群, 假, 0)
重定义数组 (变异后子种群, 假, 0)


.子程序 种群重插入, , , 重插入子代的种群,组合父代与子代后得到的新种群
.参数 参数父代种群, 整数型, 数组, 返回值
.参数 参数变异后种群, 整数型, 数组
.参数 父代适应度, 双精度小数型, 数组
.局部变量 父代规模, 整数型
.局部变量 子代规模, 整数型
.局部变量 计次, 整数型
.局部变量 适应度键值对, 适应度键值对, , "0"
.局部变量 适应度键值对个体, 适应度键值对
.局部变量 保留的父本规模, 整数型
.局部变量 a, 整数型, , "3"
.局部变量 b, 整数型, , "3"
.局部变量 c, 整数型, , "6"
.局部变量 计次1, 整数型
.局部变量 计次2, 整数型
.局部变量 保留的父本, 整数型, , "0"
.局部变量 数据字段, 字段信息, , "2"
.局部变量 计次3, 整数型
.局部变量 计次4, 整数型
.局部变量 优秀父本索引, 整数型

父代规模 = 取数组成员数 (参数父代种群) ÷ 染色体长度  ' 种群大小  ' 保持生物总量总体不变
子代规模 = 取数组成员数 (参数变异后种群) ÷ 染色体长度  ' NSel = size(SelCh,1);
保留的父本规模 = 父代规模 - 子代规模  ' 保留的父本和子代种群进行合并,进行下一轮计算
创建 (取运行目录 () + “\datebase”, 数据字段)
数据字段 [1].名称 = “索引”
数据字段 [1].类型 = #整数型
数据字段 [2].名称 = “适应度”
数据字段 [2].类型 = #双精度小数型
打开 (取运行目录 () + “\datebase”, “适应度库”, , , , , )
删除 (真)
彻底删除 ()
删除文件 (取运行目录 () + “\适应度排序库.EDB”)

.计次循环首 (取数组成员数 (参数父代种群) ÷ 染色体长度, 计次)
    加记录 (计次, 父代适应度 [计次])
.计次循环尾 ()

排序 (“适应度排序库”, “适应度”, 假, , )
关闭 (“适应度库”)
打开 (取运行目录 () + “\适应度排序库”, “适应度排序库”, , , , , )

重定义数组 (保留的父本, 假, 0)
.计次循环首 (保留的父本规模, 计次3)
    跳到 (计次3)

    优秀父本索引 = 读字段 (“索引”, “适应度排序库”)
    ' 输出调试文本 (“挑出的优秀个个体是” + 到文本 (参数父代种群 [读字段 (“索引”, “适应度排序库”)]))
    .计次循环首 (染色体长度, 计次4)
        加入成员 (保留的父本, 参数父代种群 [优秀父本索引] [计次4])
    .计次循环尾 ()
.计次循环尾 ()
关闭 (“适应度排序库”)
加入成员 (参数变异后种群, 保留的父本)







.子程序 _计算最优秀个体_被单击

' 输出调试文本 (计算最优秀个体 (初始种群, 城市位置))

.子程序 计算最优秀个体, , , 最优秀的个体是指这一代中路径最短的个体
.参数 参数种群, 整数型, 数组, 欲被计算的种群
.参数 坐标信息, 位置, 数组
.参数 参数距离数据, 双精度小数型, 数组, 返回距离向量
.局部变量 该种群物种个数, 整数型
.局部变量 计次, 整数型
.局部变量 计次1, 整数型
.局部变量 距离, 双精度小数型
.局部变量 距离数据, 双精度小数型, , "0"
.局部变量 计次2, 整数型
.局部变量 位置数据, 位置, , "0"
.局部变量 一个个体路径长度, 双精度小数型

该种群物种个数 = 取数组成员数 (参数种群) ÷ 染色体长度

.计次循环首 (该种群物种个数, 计次)
    .计次循环首 (染色体长度, 计次2)
        加入成员 (位置数据, 坐标信息 [参数种群 [计次] [计次2]])
    .计次循环尾 ()
    一个个体路径长度 = 计算路径距离 (位置数据)
    重定义数组 (位置数据, 假, 0)
    加入成员 (距离数据, 一个个体路径长度)
    一个个体路径长度 = 0
.计次循环尾 ()
参数距离数据 = 距离数据














.子程序 个体交叉
.参数 交叉个体A, 整数型, 数组
.参数 交叉个体B, 整数型, 数组
.参数 交叉子代a, 整数型, 数组
.参数 交叉子代b, 整数型, 数组
.局部变量 交叉初始位置, 整数型
.局部变量 交叉末了位置, 整数型
.局部变量 计数1, 整数型
.局部变量 交换片段A, 整数型, , "0"
.局部变量 交换片段B, 整数型, , "0"
.局部变量 计数2, 整数型
.局部变量 交换片段AA, 整数型, , "0"
.局部变量 计数3, 整数型
.局部变量 交叉个体A文本, 文本型
.局部变量 交叉个体B文本, 文本型
.局部变量 计数4, 整数型
.局部变量 循环次数, 整数型
.局部变量 交叉个体BB, 整数型, , "0"
.局部变量 交叉子代bb, 整数型, , "0"

' 交叉个体A = { 8, 2, 7, 10, 4, 6, 1, 3, 5, 11, 9 }
' 交叉个体B = { 3, 10, 4, 7, 5, 9, 8, 2, 11, 1, 6 }
交叉初始位置 = 取随机数 (1, 取数组成员数 (交叉个体A))
交叉初始位置 = 取随机数 (1, 取数组成员数 (交叉个体A))
.判断循环首 (交叉初始位置 ≥ 交叉末了位置)  ' 保证交叉初始位置<交叉末了位置
    交叉初始位置 = 取随机数 (1, 取数组成员数 (交叉个体A))
    交叉末了位置 = 取随机数 (1, 取数组成员数 (交叉个体A))
.判断循环尾 ()
' 输出调试文本 (“--------------交叉基因片段------------------”)
' 输出调试文本 (“交叉初始位置:” + 到文本 (交叉初始位置))
' 输出调试文本 (“交叉初始位置:” + 到文本 (交叉末了位置))
' 输出调试文本 (“--------------父代基因------------------”)
' 输出调试文本 (数组到文本 (交叉个体A))
' 输出调试文本 (数组到文本 (交叉个体B))
' 交换基因
.计次循环首 (取数组成员数 (交叉个体A), 计数1)
    .如果真 (计数1 ≥ 交叉初始位置 且 计数1 ≤ 交叉末了位置)
        加入成员 (交换片段A, 交叉个体A [计数1])
        加入成员 (交换片段B, 交叉个体B [计数1])
    .如果真结束

.计次循环尾 ()
' 输出调试文本 (“--------------交换基因------------------”)
' 输出调试文本 (数组到文本 (交换片段A))
' 输出调试文本 (数组到文本 (交换片段B))
数组逆序 (交换片段A, 交换片段AA)
.计次循环首 (取数组成员数 (交换片段A), 计数2)
    加入成员 (交叉个体A, 交换片段B [计数2])
    插入成员 (交叉个体B, 1, 交换片段AA [计数2])
.计次循环尾 ()
' ' 交换基因
' 输出调试文本 (“--------------基因交换完毕------------------”)
' 输出调试文本 (数组到文本 (交叉个体A))
' 输出调试文本 (数组到文本 (交叉个体B))



' 开始删除重复基因
数组去重复 (交叉个体A, 交叉子代a, 真)
数组去重复 (交叉个体B, 交叉子代b, 假)
' 结束删除重复基因
' 输出调试文本 (“--------------基因去重完毕------------------”)
' 输出调试文本 (数组到文本 (交叉子代a))
' 输出调试文本 (数组到文本 (交叉子代b))











.子程序 种群交叉, , , 交叉操作
.参数 被选择的个体, , 数组, 被选择的个体
.参数 参数交叉概率
.参数 交叉后的个体, , 数组
.局部变量 交叉种群规模, 整数型
.局部变量 计次, 整数型
.局部变量 随机数, 双精度小数型
.局部变量 a, 整数型, , "0"
.局部变量 计次1, 整数型
.局部变量 计次2, 整数型
.局部变量 父, 整数型, , "0"
.局部变量 母, 整数型, , "0"
.局部变量 儿, 整数型, , "0"
.局部变量 女, 整数型, , "0"
.局部变量 计次3, 整数型
.局部变量 计次4, 整数型

交叉种群规模 = 取数组成员数 (被选择的个体) ÷ 染色体长度

随机数 = 取随机数 (1, 10000) ÷ 10000

.如果真 (参数交叉概率 < 随机数)

    .变量循环首 (1, 交叉种群规模 - 1, 2, 计次1)
        重定义数组 (父, 假, 0)
        重定义数组 (母, 假, 0)
        重定义数组 (儿, 假, 0)
        重定义数组 (女, 假, 0)
        .计次循环首 (染色体长度, 计次2)
            加入成员 (父, 被选择的个体 [计次1] [计次2])
            加入成员 (母, 被选择的个体 [计次1 + 1] [计次2])
        .计次循环尾 ()
        ' 输出调试文本 (“----------------开始交换基因--------------------”)
        ' 输出调试文本 (“父亲:” + 数组到文本 (父))
        ' 输出调试文本 (“母亲:” + 数组到文本 (母))
        个体交叉 (父, 母, 儿, 女)

        .计次循环首 (染色体长度, 计次3)
            加入成员 (交叉后的个体, 儿 [计次3])
        .计次循环尾 ()
        .计次循环首 (染色体长度, 计次4)
            加入成员 (交叉后的个体, 女 [计次4])
        .计次循环尾 ()

        ' 输出调试文本 (“----------------开始基因交换结束--------------------”)
        ' 输出调试文本 (“儿:” + 数组到文本 (儿))
        ' 输出调试文本 (“女:” + 数组到文本 (女))


    .变量循环尾 ()
    重定义数组 (交叉后的个体, 真, 取数组成员数 (交叉后的个体) ÷ 染色体长度, 染色体长度)

.如果真结束

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值