# -*- coding: utf-8 -*-
"""
Spyder Editor
This temporary script file is located here:
C:\Users\潘sir\.spyder2\.temp.py
"""
import numpy as np
np.set_printoptions(threshold='nan')
import math
import matplotlib.pyplot as plt
import dongtai
import datetime
numant = 10 #蚂蚁个数
w_weight = 0#无人车初始重量
alpha = 1 #信息素重要程度因子
#beta = 5 #启发函数重要程度因子
beta = 2
rho = 0.1 #信息素的挥发速度
Q = 1
speed_car=1 #无人车速度
speed_drone=2#无人机速度
itermax = 500
lengthaver = np.zeros(itermax) #各代路径的平均长度
lengthbest = np.zeros(itermax) #各代及其之前遇到的最佳路径长度
def getdistmat(coordinates):
num = coordinates.shape[0]
distmat = np.zeros((num,num))
for i in range(num):
for j in range(i,num):
distmat[i][j] = distmat[j][i]=np.linalg.norm(coordinates[i]-coordinates[j])#norm 两点距离函数
return distmat
def Ant_algorithm(distmat,weight,numcity,maxcarweight):##蚁群算法进行初始无人车路径规划
pheromonetable = np.ones((numcity,numcity)) # 信息素矩阵 ones返回初始值为1的矩阵
pathtable = np.zeros((numant,numcity*2-1)).astype(int) #路径记录表
pathbest = np.zeros((itermax,numcity*2-1)) # 各代及其之前遇到的最佳路径长度
etatable = 1.0/(distmat+np.diag([1e10]*numcity)) #启发函数矩阵,表示蚂蚁从城市i转移到矩阵j的期望程度 diag 形成对角矩阵
iter = 0
for i in range(numant):
for j in range(numcity*2-1):
pathtable[i][j] = -1
while iter < itermax:
'''
# 随机产生各个蚂蚁的起点城市
if numant <= numcity:#城市数比蚂蚁数多
pathtable[:,0] = np.random.permutation(range(0,numcity))[:numant]#产生numant个数,放在第0列上
else: #蚂蚁数比城市数多,需要补足
pathtable[:numcity,0] = np.random.permutation(range(0,numcity))[:]
pathtable[numcity:,0] = np.random.permutation(range(0,numcity))[:numant-numcity]
'''
pathtable[:,0] = 0
length = np.zeros(numant) #计算各个蚂蚁的路径距离
for i in range(numant):
w_weight = 0
visiting = pathtable[i,0] # 当前所在的城市
#visited = set() #已访问过的城市,防止重复
#visited.add(visiting) #增加元素
unvisited = set(range(numcity))#未访问的城市
unvisited.remove(visiting) #删除元素
j=1
while(len(unvisited) != 0):
listunvisited = list(unvisited)
flag=0
probtrans = np.zeros(len(listunvisited))
can_unvisited=[0]*len(listunvisited)
for l in range (len(listunvisited)):
if(w_weight + weight[listunvisited[l]] <= maxcarweight):#判断是否超出无人车最大载重,若没有,则加入无人车
can_unvisited[l] = listunvisited[l]
for k in range(len(can_unvisited)):
if(can_unvisited[k]>0):#计算信息素
probtrans[k] = np.power(pheromonetable[visiting][listunvisited[k]],alpha)\
*np.power(etatable[visiting][listunvisited[k]],beta)
flag = 1
if(flag == 1):
cumsumprobtrans = (probtrans/sum(probtrans)).cumsum()#使最大概率变为1,轮盘必会找到城市
cumsumprobtrans -= np.random.rand()
for cc in range(len(cumsumprobtrans)):
if(cumsumprobtrans[cc]>0):
kw=cc
break
k = listunvisited[[kw][0]]
pathtable[i,j] = k
w_weight = w_weight + weight[k]
unvisited.remove(k)
length[i] += distmat[visiting][k]
visiting = k
j += 1
else:
length[i] += distmat[visiting][0]
w_weight = 0
visiting = 0
pathtable[i,j] = 0
j += 1
length[i] += distmat[visiting][0]
pathtable[i,j] = 0 #添加结束点0
# 包含所有蚂蚁的一个迭代结束后,统计本次迭代的若干统计参数
lengthaver[iter] = length.mean()
if iter == 0:#寻找总路程最短
lengthbest[iter] = length.min()
pathbest[iter] = pathtable[length.argmin()].copy()#argmin 最小值下标
else:
if length.min() > lengthbest[iter-1]:
lengthbest[iter] = lengthbest[iter-1]
pathbest[iter] = pathbest[iter-1].copy()
else:
lengthbest[iter] = length.min()
pathbest[iter] = pathtable[length.argmin()].copy()
# 更新信息素
changepheromonetable = np.zeros((numcity,numcity))
for i in range(numant):
#nnnum=0
for j in range(numcity*2-2):
if((pathtable[i,j] != -1) and (pathtable[i,j] != -1) ):
#if(distmat[pathtable[i,j]][pathtable[i,j+1]] == 0):
#continue
changepheromonetable[pathtable[i,j]][pathtable[i,j+1]] += Q/distmat[pathtable[i,j]][pathtable[i,j+1]]
#changepheromonetable[pathtable[i,nnnum]][pathtable[i,0]] += Q/distmat[pathtable[i,nnnum]][pathtable[i,0]]
pheromonetable = (1-rho)*pheromonetable + changepheromonetable
iter += 1 #迭代次数指示器+1
#print "outyiqun"
return pathbest
def print_path(pathbest,numcity):#建立多维数组,每行代表一条路径
bestpath = pathbest[-1]
num = 0
m=1
x = 0
y = 1
flag = 1
for j in range(len(bestpath)):
if(bestpath[j] == 0):
num += 1
finalpathtable = np.zeros((num-1,numcity+1)).astype(int)
for i in range(num-1):
for j in range(numcity+1):
finalpathtable[i][j] = -1
finalpathtable[:,0] = 0
while(flag == 1):
if(bestpath[m] == 0 and bestpath[m+1] == -1):
break
if(bestpath[m] == 0):
finalpathtable[x][y] = 0
x += 1
y = 1
else:
finalpathtable[x][y] = bestpath[m]
y += 1
m += 1
finalpathtable[x][y] = 0
return finalpathtable
def outqingjian(path1,weight,numcity,coordinates,weightflag,drone_weight):
jilubiao = [[[0 for a in range(2)] for b in range(len(path1[0]))] for c in range(len(path1))]
m=[]
zonglu=[]
zhongwe=[]
for i in range (len(weight)):
if(weight[i] < drone_weight and weight[i] > 0):
weightflag[i] = 0
else:
weightflag[i] = 1
weightflag[0] = 1
for i in range (len(path1)):
for k in path1[i]:#将所有点加入有个分组,和所有重件点加入一个分组
if(k!=-1):
zonglu.append(coordinates[k])
if(weightflag[k] == 1 and k !=-1):
zhongwe.append(coordinates[k])
for i in range (len(path1)):
count=0
l=[]
for k in path1[i]:
if(weightflag[k] == 1 and k !=-1):
l.append(coordinates[k])
jilubiao[i][count][0]=k
jilubiao[i][count][1]=1
else:
jilubiao[i][count][0]=k
jilubiao[i][count][1]=0
count+=1
m.append(l)
#print "outqingjian"
return m,weightflag,jilubiao,zonglu,zhongwe
def outqingjian_all(path1,weight,numcity,coo