实现论文
《一种求解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))])