计算智能作业 遗传算法

业:应用GAs 求解         的TSP问题,编程并分析结果。和应用Hopfield网络方法进行比较。

实现任意数量节点的TSP问题

遗传算法在时间无穷下,可以得到最优解,说明一般都得不到最优解

样本数量,变异概率和交配方法都会影响算法的结果。

对于固定的数据,点之间的距离不变,因此啊,先算出(n-1)!的各点距离,避免重复计算。

样本数量200

交配时将最优解*2放入子样本

随机取样本交配,根据适应度计算是否交配,若交配,将交配结果放入子样本,一直循环到样本为200截至,得到下代样本。

一直取到设置的遗传次数为止。

最短距离为全部样本的最优解。

20点

200代数结果

1412

计算智能作业 遗传算法_第1张图片

500代数结果

1336

计算智能作业 遗传算法_第2张图片

1000次:

1269

计算智能作业 遗传算法_第3张图片

 

看了网上的一些程序,感觉自己数据的格式设置的有些问题,可能设置为两个一级列表数据表示更好一点,下次需要注意。

 

import math
import random
import matplotlib.pyplot as plt

pointdis=[]
def getDistance(a):  #a为route  
    dis=0.0
    length=len(a)
    for i in range(length):
        tmp1=a[i]        #根据pointdis表得到距离
        tmp2=a[i-1]
        if tmp1>tmp2:
            tmp1,tmp2=tmp2,tmp1
        distance=pointdis[tmp1-1][tmp2-tmp1-1]
        dis=dis+distance
    return dis

def Mating(a,b):
    length=len(a)
    num1=random.randrange(length)
    num2=random.randrange(length)
    while num1==num2:     #num1!=num2
        num2=random.randrange(length)
    if num1>num2:
        num1,num2=num1,num2
    a1=a[:]
    b1=b[:]   
    if num1>num2:
        num1,num2=num2,num1
    for i in range(num1,num2):  #将交配处初始化为0
        a1[i]=0
        b1[i]=0
    for i in range(num1,num2):      #交配
        tmp=b[i]   #a的交配值
        if tmp in a1:
            while a1.count(tmp)>0: #如果交配值已存在,更新 tmp1 为a中重复值
                index=a.index(tmp)
                tmp=b[index]   
            a1[i]=tmp
        else:
            a1[i]=tmp
        
        #更新二父亲
        tmp=a[i]
        if tmp in b1:
            while b1.count(tmp)>0:
                index=b.index(tmp)
                tmp=a[index]
            b1[i]=tmp
        else:
            b1[i]=tmp
    return a1,b1
def Variation(a):
    length=len(a)
    num1=random.randrange(length)
    num2=random.randrange(length)
    while num1==num2:     #num1!=num2
        num2=random.randrange(length)
    tmp=a[num1]
    a[num1],a[num2]=a[num2],a[num1]
    return a
def All_Variation(route,p):  #p为变异概率
    length=len(route)
    for i in range(length):
        p1=random.random()
        if p1maxvalue:
            max=i
            maxvalue=b[i]
    k=-0.8/(maxvalue-minvalue)   #fitness = k* b[i]+  b1
    b1=0.1-k*b[max]
    fitness=[]
    for i in range(len(b)):
        tmp=k*b[i]+b1
        fitness.append(tmp)
    return fitness
def get_maxindex(a):    #适应度最大,路径最小
    length=len(a)
    maxvalue=a[0]
    maxindex=0
    for i in range(length):
        if(a[i]>maxvalue):
            maxvalue=a[i]
            maxindex=i
    return maxindex
def get_minindex(a):
    length=len(a)
    minvalue=a[0]
    minindex=0
    for i in range(length):
        if(a[i]

 

你可能感兴趣的:(计算智能作业 遗传算法)