遗传算法求解TSP问题(人工智能实验)

遗传算法求解TSP问题

参考博客参考的代码和详解

根据老师的数据把其中一些代码修改了很小一部分:


```python

import numpy as np
import math
import random

# 適應度
def fitnessFunction(pop,num,city_num,distance):
    length=city_num
    for i in range(num):
        dis=0
        for j in range(length-1):
            dis+=distance[int(pop[i][j])][int(pop[i][j+1])]
        dis+=distance[int(pop[i][j+1])][int(pop[i][0])]
        pop[i][-1]=20000/dis

# 選擇
def choiceFuction(pop):
    numlist=[0]
    length=len(pop)
    allnum=0
    for i in range(0,length):
        allnum+=pop[i][-1]
        numlist.append(allnum)

    temppop=[]                                                      #用于临时的种群数据
    max = pop[np.argmax(pop[:, -1])]                                #最优的一个个体
    for i in range(0,length):
        rannum=random.random()*numlist[-1]                          #0~1的小数乘上最大的数字,得到[0,max]上的一个点
        ranIndex=InsertionSearch(numlist,rannum,0,length-1)         #调用搜索函数
        temppop.append(pop[ranIndex-1])                             #将一个个的数据添加到
    pop=np.array(temppop)                                           #将pop索引指向临时数据,并且此处应该清理原来的pop空间才对
    pop[0]=max.copy()                                               #保证第一个元素就是最优的元素
    
    return pop
    
# 插值搜索
# 输入:列表,要搜索的值,最低索引,最高索引
# 输出:相等时的索引,或者接近该值左侧的索引
# 备注:Python里面的递归有次数限制(99次)
def InsertionSearch(list,value,low,high):
    mid=low+int((value-list[low])/(list[high]-list[low])*(high-low))
    if list[mid]==value:
        return mid
    if list[mid]>value:
        if list[mid-1]value:
            return mid
        else:
            return InsertionSearch(list,value,mid+1,high)

# 交叉变异(此处的交叉有两种情况)
# 输入:种群,交叉概率,城市数量(列),变异概率,种群数量(行)
# 输出:无输出,是一个过程(先交叉,再变异)
# 备注:不同的交叉策略,相邻,随机,配对
def matuingFuction(pop, pc, city_num, pm, num):
    #产生两个不同的索引
    rancon=True
    while rancon :
        p1=random.randint(1,city_num-1)
        p2=random.randint(0,city_num-2)
        if p1==p2:
            rancon=True
        elif p1


你可能感兴趣的:(遗传算法求解TSP问题(人工智能实验))