计算智能-一种求解TSP问题的改进克隆选择算法

实现论文

《一种求解TSP问题的改进克隆选择算法》

链接:https://pan.baidu.com/s/1scdDvKvUviEVEeQC8fweRg
提取码:k38b

实验目的

为进一步提高人工免疫算法求解组合优化问题的效率, 提出了一种针对 TSP 问题的抗体局部最优免疫优势的克隆 选择算法(LOICSA),算法首先通过局部最优免疫优势操 作获得优秀抗体,将优秀抗体按照亲和力和浓度大小进行克 隆复制,动态改变变异概率,高频变异等操作算子,加速抗 体亲和力成熟,同时引入浓度调节,与抗体克隆删除等相关 算子操作以保证抗体群的多样性,扩大搜索解空间,避免了 早熟收敛。运用随机概率理论分析了算法的收敛性,实验仿真表明该算法的可行性、有效性,具有较快的收敛速度,同 时具有精确的最优解,为求解离散组合优化问题有着积极的意义。

基本思路

基于抗体局部最优免疫优势的克隆选择算(LOICSA), 是通过选择 K 个高亲和度抗体进行局部最优免疫优势算子 操作获得优秀抗体,将 K 个高亲和度抗体按照亲和力和浓 度大小进行克隆扩增,采用动态变异概率,通过高频变异, 引入抗体克隆删除算子,提高抗体亲和力成熟的效率。同时隔α 代引入浓度调节机制的抗体循环补充算子以保证抗体群的多样性。

基本流程

在这里插入图片描述

代码实现

(因tsp测试集数据下载失败,故用随机数据测试)

import random
import math
'''
def coordinate(m):
  data=[]
  while len(data)<m:
    x = random.randint(0,100)
    y = random.randint(0,100)
    if [x,y] not in data:
      data.append([x,y])
  return data
'''
def init(m):
  data=[i for i in range(1,m+1)]
  random.shuffle(data)
  return data

def distance(data,coordinate):
  dis=0
  for i in range(1,len(data)):
    dis+=math.sqrt((coordinate[data[i]-1][0]-coordinate[data[i-1]-1][0])**2+\
                   (coordinate[data[i]-1][1]-coordinate[data[i-1]-1][1])**2)
  return dis

def affinity(dis):
  affinity1=[]
  f=max(dis)
  sumaffinity=0
  eps=0.1
  for i in range(len(dis)):
    sumaffinity+=(f-dis[i])+eps
  for i in range(len(dis)):
    affinity1.append((f-dis[i])/sumaffinity)
  return affinity1
 
def fd(data,gamma,m):
  d=0
  dc=0
  fd1=[]
  for i in range(len(data)):
    for j in range(len(data)):
      for k in range(len(data[i])):
        if data[i][k] != data[j][k]:
          d+=1
      fitness=1/(1+d)
      if fitness >= gamma:
        dc+=1
      d=0
    fd1.append((1/m)*dc)
    dc=0
  return fd1
      
        
def disdis(coordinate,i,j):
  dis=math.sqrt((coordinate[i-1][0]-coordinate[j-1][0])**2+\
                   (coordinate[i-1][1]-coordinate[j-1][1])**2)
  return dis  

if __name__=="__main__":
  P=0.75
  m=30
  age=10
  belta=0.131
  alpha=100
  b=10
  gamma=0.0137
  #城市坐标
  coordinate=[[40, 32], [93, 55], [38, 39], [11, 43], [32, 68], [54, 75], [19, 15], [56, 30], \
              [16, 21], [77, 51], [48, 81], [68, 1], [99, 35], [73, 24], [62, 77], [90, 43], \
              [87, 90], [96, 40], [72, 61], [78, 9], [96, 82], [61, 64], [61, 46], [86, 90], \
              [20, 78], [5, 59], [88, 71], [96, 2], [95, 57], [12, 28]]
  data=[]
  dis=[]
  #初始化抗体
  for i in range(m):
    initm=init(m)
    data.append(initm)
    dis.append(distance(initm,coordinate))
  #抗原
  bestdis=min(dis) 
  #亲和力
  affinity1=affinity(dis)
  #抗体溶度
  fd1=fd(data,gamma,m)
  
  time=10
  now=0
  
  
  while now<time:
    #扩增k取1

    maxindex=affinity1.index(max(affinity1))
    bb=round(alpha*(affinity1[maxindex]/(fd1[maxindex]))+b)
    m+=bb
    for i in range(bb):
      data.append(data[maxindex])
      dis.append(dis[maxindex])
    olddata=data.copy()
    olddis=[]
    for i in range(len(data)):
      olddis.append(distance(data[i],coordinate))
    oldaffinity=affinity(olddis)
   
    
    
    #局部最优免疫优势算子
    ab=5
    databest=data[maxindex][5:10]
    ss=databest.copy()
    for i in range(len(data)):
      newdata=data[i].copy()
      for j in newdata[:]:
        if j in databest:
          newdata.remove(j)
      data[i]=databest+newdata
    mindata=[]
    for i in range(len(data)): 
      for j in range(ab):
        for k in range(ab,len(data[i])-1):
          mindata.append(disdis(coordinate,data[i][k],data[i][j])\
                         +disdis(coordinate,data[i][k+1],data[i][j])\
                         -disdis(coordinate,data[i][k],data[i][k+1]))
        data[i].insert(mindata.index(min(mindata))+ab+1,data[i][j])
        mindata=[]
    for i in range(len(data)):
      data[i]=data[i][ab:]


    #克隆删除
    
    newdis=[]
    for i in range(len(data)):
      newdis.append(distance(data[i],coordinate))
    newaffinity=affinity(newdis)
    for i in range(len(newaffinity)):
      if newaffinity[i] < oldaffinity[i]:
        data[i]=olddata[i].copy()
    #克隆补充R=5  

    dis=[]      
    for i in range(len(data)):
      dis.append(distance(data[i],coordinate))
    #抗原
    bestdis=min(dis) 
    #亲和力
    affinity1=affinity(dis)
    #抗体溶度
    fd1=fd(data,gamma,m)  
    now+=1
  print("最优距离:",bestdis)
  print(data[dis.index(min(dis))])

    
  
  
  
    
    
  

实验结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值