博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
遗传算法求解TSP问题
阅读量:4126 次
发布时间:2019-05-25

本文共 2471 字,大约阅读时间需要 8 分钟。

TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。

由于网上的结果只有路径图,而没有写明distance值,所以没法参照

迭代80000次结果,distance=147.0864047407135

""" @author: zoutai@file: TSP_Solve.py @time: 2018/04/22 @description: 旅行商问题求解"""import mathimport randomimport matplotlib.pyplot as pltdef geneticoptimize(popsize=50, step=1, mutprob=0.2, elite=0.2, mixiter=80000):    # # 生成随机DNA    # list1 = [i for i in range(lengthDNA)]    # random.shuffle(list1)    # print(list1)    # 变异(交换)    def mutate(list1):        index1 = random.randint(0,lengthDNA - 1)        index2 = random.randint(0,lengthDNA - 1)        list1[index1], list1[index2] = list1[index2], list1[index1]        return list1    # 重组    def cross(list1, list2):        index1 = random.randint(0, lengthDNA - 1)        index2 = random.randint(index1, lengthDNA - 1)        tempGene = list2[index1:index2]        newDNA = []        temp = 0        for gene in list1:            if index1==temp:                newDNA.extend(tempGene)                temp+=1            if gene not in tempGene:                newDNA.append(gene)                temp+=1        return newDNA    # 距离    def distance(list1):        distance = 0.0        # i从-1到32,-1是倒数第一个        if not isinstance(list1, list):            print()        index1, index2 = 0,0        for i in range(len(list1)-1):            index1, index2 = list1[i], list1[i + 1]            # print(index1,index2)            # print(i)            distance += math.sqrt((float(cities[index1][4]) - float(cities[index2][5])) ** 2 + (float(cities[index1][6]) - float(cities[index2][7])) ** 2)        # index2 = list1[len(list1)-1]        distance += math.sqrt(            (float(cities[index2][8]) - float(cities[0][9])) ** 2 + (float(cities[index2][10]) - float(cities[0][11])) ** 2)        return distance    cities = []    for line in open('distanceMatrix.txt', 'r', encoding="utf8"):        # 按照tab键分割        cities.append(line.strip().split('\t'))    lengthDNA = len(cities)    # 开始    # 第一步:初始化种群    pop = []    for i in range(popsize):        list1 = [j for j in range(lengthDNA)]        random.shuffle(list1)        pop.append(list1.copy())    # 进化选择数    toplite = int(popsize * elite)    # 进化选择,排序    for i in range(mixiter):        # 排序,进行物种进化选择        distances = [(distance(v),v) for v in pop]        distances.sort()        ranked = [v for (s,v) in distances]        pop = ranked[:toplite]        while len(pop)

转载地址:http://shepi.baihongyu.com/

你可能感兴趣的文章
Linux 汇编语言开发指南
查看>>
马拉松(一)
查看>>
ES TCP客户端方式自动映射mapping写入异常
查看>>
ES自定义Analyzer扩展IK分词
查看>>
记录一次系统计算逻辑优化
查看>>
创建Spring Boot项目
查看>>
Spring Boot 扫描不到Controller
查看>>
MySQL 事务隔离级别相关官方文档翻译
查看>>
Eureka服务发现与注册
查看>>
事务隔离级别与脏读、不可重复读、幻读
查看>>
Landroid/support/v7/internal/widget/ActionBarOverlayLayout;.stopNestedScroll
查看>>
Genymotion首次运行程序出现错误Installation error: INSTALL_FAILED_CPU_ABI_INCOMPATIBLE
查看>>
以太坊不同客户端的定义和用途
查看>>
以太坊客户端mist和geth加快区块同步速度的方法
查看>>
TheDAO被攻击事件考察报告
查看>>
以太坊常用网址
查看>>
如何分叉以太坊并变成自己的私链?
查看>>
区块链开发(一)搭建基于以太坊的私有链环境
查看>>
BlockChain 与 Ethereum 介绍
查看>>
以太坊的POS共识机制(一)友善的小精灵 Casper
查看>>