出门游玩,运用百度api 和蚁群算法 ,解决基于现实实时数据的 旅行商问题

本文主要是介绍出门游玩,运用百度api 和蚁群算法 ,解决基于现实实时数据的 旅行商问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

# 导入相关的包
# -- coding: utf-8 --**
import requests #HTTP请求
import time
import re
import json # 用于解析Json
import pandas as pd # 用于处理数据(数据分析相关的同学必须会的包)
import pandas
import csv
import re
import time
import json
from urllib.request import urlopen
import urllib
import random
import copy
import sys
import tkinter  # //GUI模块
import threading
from functools import reduce
from geopy.distance import geodesic
import numpy as np'''https://blog.csdn.net/Fuel_Ming/article/details/117193433'''
'https://blog.csdn.net/Fuel_Ming/article/details/117193433'

开发简易文档:

需求:

给定指定地点,获取最短路径问题 ,也就是解决现实生活中的旅行商问题

实现步骤:
1.调用百度api,获取各个地点的经纬度(关于百度api的使用请查阅最后的引用文献)
2.将各个地点经纬度换算为distance 单位: km 并获得cost loss ,默认为对应的最佳公交地铁时间花费,
3.采用蚁群算法获取最短路径

以下为程序生成的实际显示
在这里插入图片描述

在这里插入图片描述

df = pd.DataFrame(['广东工业大学(大学城校区)','广州市鲁迅纪念馆','广州天河宜家',
'广州五仙观',
'广州Lavie拉维电影公馆',
'广州近代史博物馆',
'广州余荫山房 番禺区',
])df.columns = ['location']
ak = 'pOSMq456AFQuZyYfTlCBGcB8GG2VakRm'
def get_result(x,ak):""":param x: 传入一个字符串类型的地点:return: ([坐标],类别,置信度)"""Post_url = "https://api.map.baidu.com/geocoding/v3/?address=" + x + f"&output=json&ak={ak}&callback=showLocation"Post_data = {'address' : x}se = requests.session()Text = se.post(Post_url, data=Post_data).text.replace("'", '"').replace('/ ', '/')[27:-1]jsonValue = json.loads(Text) # 转化为Json对象if ("result" in jsonValue):return  (jsonValue['result']['location']['lng'],jsonValue['result']['location']['lat']),jsonValue['result']['level'],jsonValue['result']['confidence']else: return  ''
result = {'name' :df['location'].values,'position' : [],'category' : [],'confidence' : []
}
for value in df.values:tmp = get_result(value[0],ak)if tmp != '':result['position'].append(tmp[0])result['category'].append(tmp[1])result['confidence'].append(tmp[2])
result
{'name': array(['广东工业大学(大学城校区)', '广州市鲁迅纪念馆', '广州天河宜家', '广州五仙观', '广州Lavie拉维电影公馆','广州近代史博物馆', '广州余荫山房 番禺区'], dtype=object),'position': [(113.39959744237572, 23.045704807207507),(113.2841059860486, 23.13014496993394),(113.42238287179822, 23.111107776003106),(113.26630839796859, 23.126907167141244),(113.32622196190339, 23.101572988503353),(113.28977420398412, 23.13464065626514),(113.4019110989934, 23.017728378073617)],'category': ['教育', '旅游景点', '餐饮', '旅游景点', '休闲娱乐', '旅游景点', '旅游景点'],'confidence': [70, 50, 80, 50, 70, 50, 50]}
recoder = pd.DataFrame(result)
recoder
namepositioncategoryconfidence
0广东工业大学(大学城校区)(113.39959744237572, 23.045704807207507)教育70
1广州市鲁迅纪念馆(113.2841059860486, 23.13014496993394)旅游景点50
2广州天河宜家(113.42238287179822, 23.111107776003106)餐饮80
3广州五仙观(113.26630839796859, 23.126907167141244)旅游景点50
4广州Lavie拉维电影公馆(113.32622196190339, 23.101572988503353)休闲娱乐70
5广州近代史博物馆(113.28977420398412, 23.13464065626514)旅游景点50
6广州余荫山房 番禺区(113.4019110989934, 23.017728378073617)旅游景点50
names=['序号','起点纬度','起点经度','终点纬度','终点经度']
dataList = []  # 储存获取的路线数据
akn=0 # 使用第几个ak
for i , name1 in enumerate(recoder['name']):for j ,name2 in enumerate(recoder['name']):if name1 == name2:dataList.append([0,0,0,0,0,0,0])continueout_lat = recoder.at[i,'position'][1]out_lng = recoder.at[i,'position'][0]des_lat = recoder.at[j, 'position'][1]des_lng = recoder.at[j, 'position'][0]"""# 获取驾车路径:常规路线规划(不考虑路况)以下是可选参数#  tactics =10不走高速;=11常规路线;=12距离较短;=13距离较短"""url_drive = r"http://api.map.baidu.com/routematrix/v2/driving?output=json&origins={0},{1}&destinations={2},{3}&{4}&tactics=11&ak={4}".format(out_lat,out_lng,des_lat,des_lng,ak)result_drive = json.loads(urlopen(url_drive).read())  # json转dictstatus_drive = result_drive['status']if status_drive == 0:  # 状态码为0:无异常distance_drive = round(result_drive['result'][0]['distance']['value'] / 1000,3)  # 里程(k米)timesec_drive = round(result_drive['result'][0]['duration']['value'] /60,2)   # 耗时(分钟)elif status_drive == 302 or status_drive == 210 or status_drive == 201:  # 302:额度不足;210:IP验证未通过distance_drive = timesec_drive = 'AK错误'else:distance_drive = timesec_drive = '请求错误'"""### 以下是乘车规划可选参数tac_bus = r'&tactics_incity=0'# 市内公交换乘策略 可选,默认为0      0推荐;1少换乘;2少步行;3不坐地铁;4时间短;5地铁优先city_bus = r'&tactics_intercity=0'# 跨城公交换乘策略  可选,默认为0    0时间短;1出发早;2价格低;city_type = r'&trans_type_intercity=0'# 跨城交通方式策略  可选,默认为0  0火车优先;1飞机优先;2大巴优先;"""url_bus = r'http://api.map.baidu.com/direction/v2/transit?output=json&origin={0},{1}&destination={2},{3}&{4}&ak={4}'.format(out_lat,out_lng,des_lat,des_lng,ak)result_bus = json.loads(urlopen(url_bus).read())status_bus = result_bus['status']if status_bus == 0:rsls = result_bus['result']['routes']if rsls == []:    # 无方案时状态也为0,但只返回一个空listdistance_bus = timesec_bus = cost_bus = '无公交方案'else:distance_bus = round(result_bus['result']['routes'][0]['distance'] / 1000,3)  # 乘车路线距离总长(km)timesec_bus = round(result_bus['result']['routes'][0]['duration'] / 60,2)  # 乘车时间(分钟)cost_bus = result_bus['result']['routes'][0]['price']  # 乘车费用(元)elif status_bus == 302 or status_bus == 210 or status_bus == 201:distance_bus = timesec_bus = cost_bus = 'AK错误'elif status_bus == 1001:distance_bus = timesec_bus = cost_bus = '无公交方案'else:  # 其他类型状态码(服务器错误)distance_bus = timesec_bus = cost_bus = '请求错误'dataList.append([status_drive,distance_drive,timesec_drive,status_bus,distance_bus,timesec_bus,cost_bus])

计算两个坐标轴点的距离
例如:
from geopy.distance import geodesic
distance = geodesic((39.995304, 116.308264), (40.003304, 116.326759)).km
round(distance,2) 保留两位小数

dataList = np.array(dataList).reshape(len(recoder),len(recoder),-1)
'''【驾车状态, 自驾距离km,花费时间(分钟),推荐的公交状态,公交地铁距离 km,花费时间(分钟),金钱(元)'''
dataList_name = ['status_drive','distance_drive','timesec_drive','status_bus','distance_bus','timesec_bus','cost_bus']
dataList
array([[[  0.   ,   0.   ,   0.   ,   0.   ,   0.   ,   0.   ,   0.   ],[  0.   ,  27.548,  40.15 ,   0.   ,  23.899,  67.03 ,   6.   ],[  0.   ,  18.95 ,  32.88 ,   0.   ,  13.49 ,  37.17 ,   5.   ],[  0.   ,  27.542,  44.32 ,   0.   ,  23.796,  72.62 ,   6.   ],[  0.   ,  19.801,  34.47 ,   0.   ,  15.236,  42.08 ,   5.   ],[  0.   ,  26.529,  43.72 ,   0.   ,  22.802,  64.42 ,   6.   ],[  0.   ,  15.492,  31.33 ,   0.   ,  11.445,  52.15 ,   5.   ]],[[  0.   ,  26.815,  39.47 ,   0.   ,  23.901,  68.03 ,   6.   ],[  0.   ,   0.   ,   0.   ,   0.   ,   0.   ,   0.   ,   0.   ],[  0.   ,  15.521,  24.8  ,   0.   ,  18.993,  50.32 ,   5.   ],[  0.   ,   2.164,   8.27 ,   0.   ,   2.503,  23.43 ,   3.   ],[  0.   ,   9.285,  17.82 ,   0.   ,   8.915,  39.63 ,   2.   ],[  0.   ,   1.229,   4.17 ,   0.   ,   2.308,  22.25 ,   2.   ],[  0.   ,  33.633,  46.63 ,   0.   ,  27.912, 122.25 ,  -1.   ]],[[  0.   ,  17.501,  33.45 ,   0.   ,  13.492,  38.17 ,   5.   ],[  0.   ,  16.072,  34.05 ,   0.   ,  16.606,  44.97 ,   5.   ],[  0.   ,   0.   ,   0.   ,   0.   ,   0.   ,   0.   ,   0.   ],[  0.   ,  17.769,  39.62 ,   0.   ,  19.003,  54.43 ,   5.   ],[  0.   ,  14.477,  33.3  ,   0.   ,  13.277,  30.68 ,   4.   ],[  0.   ,  15.053,  35.4  ,   0.   ,  15.509,  42.35 ,   5.   ],[  0.   ,  24.319,  40.85 ,   0.   ,  21.462,  70.03 ,   8.   ]],[[  0.   ,  28.996,  43.4  ,   0.   ,  23.795,  73.62 ,   6.   ],[  0.   ,   2.776,  11.35 ,   0.   ,   2.516,  23.1  ,   1.   ],[  0.   ,  17.702,  28.93 ,   0.   ,  19.003,  54.43 ,   5.   ],[  0.   ,   0.   ,   0.   ,   0.   ,   0.   ,   0.   ,   0.   ],[  0.   ,  11.466,  21.7  ,   0.   ,   8.515,  45.77 ,   2.   ],[  0.   ,   3.06 ,  12.75 ,   0.   ,   3.582,  35.27 ,   2.   ],[  0.   ,  35.814,  51.15 ,   0.   ,  41.005, 141.15 ,   8.   ]],[[  0.   ,  18.501,  34.62 ,   0.   ,  15.235,  43.08 ,   5.   ],[  0.   ,   9.576,  25.33 ,   0.   ,  10.04 ,  47.1  ,   2.   ],[  0.   ,  13.024,  27.88 ,   0.   ,  13.276,  30.68 ,   4.   ],[  0.   ,  10.918,  30.15 ,   0.   ,  10.872,  54.63 ,   2.   ],[  0.   ,   0.   ,   0.   ,   0.   ,   0.   ,   0.   ,   0.   ],[  0.   ,   9.687,  25.7  ,   0.   ,   8.773,  29.92 ,   3.   ],[  0.   ,  25.319,  42.9  ,   0.   ,  22.579,  69.72 ,   6.   ]],[[  0.   ,  25.766,  35.6  ,   0.   ,  22.805,  65.42 ,   6.   ],[  0.   ,   1.591,   4.68 ,   0.   ,   1.549,  23.33 ,   2.   ],[  0.   ,  14.472,  21.5  ,   0.   ,  14.753,  60.   ,  -1.   ],[  0.   ,   3.614,  11.85 ,   0.   ,   3.785,  34.93 ,   2.   ],[  0.   ,   8.236,  14.63 ,   0.   ,   8.775,  30.92 ,   3.   ],[  0.   ,   0.   ,   0.   ,   0.   ,   0.   ,   0.   ,   0.   ],[  0.   ,  32.584,  42.62 ,   0.   ,  42.179, 157.82 ,   8.   ]],[[  0.   ,  18.927,  31.95 ,   0.   ,   8.338,  53.65 ,   4.   ],[  0.   ,  30.291,  44.87 ,   0.   ,  28.957, 123.95 ,  -1.   ],[  0.   ,  21.689,  33.18 ,   0.   ,  21.858,  68.93 ,  -1.   ],[  0.   ,  26.861,  49.48 ,   0.   ,  28.142, 112.42 ,  -1.   ],[  0.   ,  22.922,  40.9  ,   0.   ,  22.14 , 111.58 ,   6.   ],[  0.   ,  29.272,  47.62 ,   0.   ,  29.316, 129.08 ,  -1.   ],[  0.   ,   0.   ,   0.   ,   0.   ,   0.   ,   0.   ,   0.   ]]])
# '''计算每两个城市间的distance  得到邻接矩阵'''
# from geopy.distance import geodesic
# adj_matrix = []
# for i , name1 in enumerate(recoder['name']):
#     for j ,name2 in enumerate(recoder['name']):
#         if name1 == name2:
#             distance = np.inf
#             adj_matrix.append(distance)
#         else:
#             distance = geodesic((recoder['position'][i][1],recoder['position'][i][0]),
#                                 (recoder['position'][j][1],recoder['position'][j][0])).km  # 转换为国外的维度和经度
#
#             distance = round(distance,2) # 保留2位有效
#             adj_matrix.append(distance)
# adj_matrix = np.array(adj_matrix).reshape(len(recoder),len(recoder))
#
#
# new_data = pd.DataFrame(adj_matrix)
# new_data.columns = recoder['name']
# new_data.insert(loc =0 ,column=' ',value=recoder['name'])
# new_data.to_excel('test.xlsx')
# new_data

将经纬度映射到 0-1 空间然后映射到画布空间
width,height

recoder
namepositioncategoryconfidence
0广东工业大学(大学城校区)(113.39959744237572, 23.045704807207507)教育70
1广州市鲁迅纪念馆(113.2841059860486, 23.13014496993394)旅游景点50
2广州天河宜家(113.42238287179822, 23.111107776003106)餐饮80
3广州五仙观(113.26630839796859, 23.126907167141244)旅游景点50
4广州Lavie拉维电影公馆(113.32622196190339, 23.101572988503353)休闲娱乐70
5广州近代史博物馆(113.28977420398412, 23.13464065626514)旅游景点50
6广州余荫山房 番禺区(113.4019110989934, 23.017728378073617)旅游景点50
from pyecharts.charts import Geo
from pyecharts import options
from pyecharts.globals import GeoTypeg = Geo().add_schema(maptype="广州")
for i in range(len(result['name'])):g.add_coordinate(result['name'][i], result['position'][i][0], result['position'][i][1])data_pair = [(result['name'][i],1)]g.add('',data_pair, type_=GeoType.EFFECT_SCATTER, symbol_size=20)
g.set_series_opts(label_opts=options.LabelOpts(is_show=False))
g.set_global_opts(title_opts=options.TitleOpts(title="pyecharts地图标点测试"))
g.render_notebook()
'''
ALPHA:信息启发因子,值越大,则蚂蚁选择之前走过的路径可能性就越大,值越小,则蚁群搜索范围就会减少,容易陷入局部最优
BETA:Beta值越大,蚁群越就容易选择局部较短路径,这时算法收敛速度会加快,但是随机性不高,容易得到局部的相对最优
'''
(ALPHA, BETA, RHO, Q) = (1.0, 2.0, 0.5, 100.0)
# 城市数,蚁群
(city_num, ant_num) = (len(recoder),len(recoder))'''可以优化的一点,分布采用真实分布,实现步骤,归一化,映射到0-1空间,再将经纬度,映射到画布空间的相对位置'''
abstract_position = []
for i ,value in enumerate(recoder['position']):value = list(value)abstract_position.append(value)
abstract_position = np.array(abstract_position)
# 归一化映射位置关系
abstract_position[:, 0] =  (abstract_position[:, 0] - np.min(abstract_position[:, 0]))/(np.max(abstract_position[:, 0]) - np.min(abstract_position[:,
0])) * 500 + 200
abstract_position[:, 1] = 1000 - (abstract_position[:, 1] - np.min(abstract_position[:, 1]))/(np.max(abstract_position[:, 1]) - np.min(abstract_position[:,
1])) * 500 - 200  # + bias 偏置
abstract_position = np.ceil(abstract_position)distance_x = [x[0] for x in abstract_position]
distance_y  = [y[1] for y in abstract_position]# 城市距离和信息素
distance_graph = [[0.0 for col in range(city_num)] for raw in range(city_num)]
pheromone_graph = [[1.0 for col in range(city_num)] for raw in range(city_num)]# ----------- 蚂蚁 -----------
class Ant(object):# 初始化def __init__(self, ID):self.ID = ID  # IDself.__clean_data()  # 随机初始化出生点# 初始数据def __clean_data(self):self.path = []  # 当前蚂蚁的路径self.total_distance = 0.0  # 当前路径的总距离self.move_count = 0  # 移动次数self.current_city = -1  # 当前停留的城市self.open_table_city = [True for i in range(city_num)]  # 探索城市的状态city_index = random.randint(0, city_num - 1)  # 随机初始出生点self.current_city = city_indexself.path.append(city_index)self.open_table_city[city_index] = Falseself.move_count = 1# 选择下一个城市def __choice_next_city(self):next_city = -1select_citys_prob = [0.0 for i in range(city_num)]  # 存储去下个城市的概率total_prob = 0.0# 获取去下一个城市的概率for i in range(city_num):if self.open_table_city[i]:try:# 计算概率:与信息素浓度成正比,与距离成反比select_citys_prob[i] = pow(pheromone_graph[self.current_city][i], ALPHA) * pow((1.0 / distance_graph[self.current_city][i]), BETA)total_prob += select_citys_prob[i]except ZeroDivisionError as e:print('Ant ID: {ID}, current city: {current}, target city: {target}'.format(ID=self.ID,current=self.current_city,target=i))sys.exit(1)# 轮盘选择城市if total_prob > 0.0:# 产生一个随机概率,0.0-total_probtemp_prob = random.uniform(0.0, total_prob)for i in range(city_num):if self.open_table_city[i]:# 轮次相减temp_prob -= select_citys_prob[i]if temp_prob < 0.0:next_city = ibreak# 未从概率产生,顺序选择一个未访问城市# if next_city == -1:#     for i in range(city_num):#         if self.open_table_city[i]:#             next_city = i#             breakif (next_city == -1):next_city = random.randint(0, city_num - 1)while ((self.open_table_city[next_city]) == False):  # if==False,说明已经遍历过了next_city = random.randint(0, city_num - 1)# 返回下一个城市序号return next_city# 计算路径总距离def __cal_total_distance(self):temp_distance = 0.0for i in range(1, city_num):start, end = self.path[i], self.path[i - 1]temp_distance += distance_graph[start][end]# 回路end = self.path[0]temp_distance += distance_graph[start][end]self.total_distance = temp_distance# 移动操作def __move(self, next_city):self.path.append(next_city)self.open_table_city[next_city] = Falseself.total_distance += distance_graph[self.current_city][next_city]self.current_city = next_cityself.move_count += 1# 搜索路径def search_path(self):# 初始化数据self.__clean_data()# 搜素路径,遍历完所有城市为止while self.move_count < city_num:# 移动到下一个城市next_city = self.__choice_next_city()self.__move(next_city)# 计算路径总长度self.__cal_total_distance()# ----------- TSP问题 -----------class TSP(object):def __init__(self, root, width=1000, height=1000, n=city_num):# 创建画布self.root = rootself.width = widthself.height = height# 城市数目初始化为city_numself.n = n# tkinter.Canvasself.canvas = tkinter.Canvas(root,width=self.width,height=self.height,bg="#EBEBEB",  # 背景白色xscrollincrement=1,yscrollincrement=1)self.canvas.pack(expand=tkinter.YES, fill=tkinter.BOTH)self.title("TSP蚁群算法(n:初始化 e:开始搜索 s:停止搜索 q:退出程序)")self.__r = 5self.__lock = threading.RLock()  # 线程锁self.__bindEvents()self.new()# 计算地点之间的距离,也就是花费, 这里的度量默认采用了 地铁公交车的时间花费'''['status_drive','distance_drive','timesec_drive','status_bus','distance_bus','timesec_bus','cost_bus']'''for i,value0 in enumerate(dataList):for j,value1 in enumerate(value0):distance = value1[5]distance_graph[i][j] = distance# 按键响应程序def __bindEvents(self):self.root.bind("q", self.quite)  # 退出程序self.root.bind("n", self.new)  # 初始化self.root.bind("e", self.search_path)  # 开始搜索self.root.bind("s", self.stop)  # 停止搜索# 更改标题def title(self, s):self.root.title(s)# 初始化def new(self, evt=None):# 停止线程self.__lock.acquire()self.__running = Falseself.__lock.release()self.clear()  # 清除信息self.nodes = []  # 节点坐标self.nodes2 = []  # 节点对象# 初始化城市节点for i in range(self.n):# 在画布上标定虚拟坐标x = distance_x[i]y = distance_y[i]self.nodes.append((x, y))# 生成节点椭圆,半径为self.__rnode = self.canvas.create_oval(x - self.__r,y - self.__r, x + self.__r, y + self.__r,fill="#ff0000",  # 填充红色outline="#000000",  # 轮廓白色tags="node",)self.nodes2.append(node)# 显示坐标self.canvas.create_text(x, y - 10,  # 使用create_text方法在坐标(302,77)处绘制文字text=f"{recoder['name'][i]}",  # 所绘制文字的内容fill='black'  # 所绘制文字的颜色为灰色)# 顺序连接城市# self.line(range(city_num))# 初始城市之间的距离和信息素for i in range(city_num):for j in range(city_num):pheromone_graph[i][j] = 1.0self.ants = [Ant(ID) for ID in range(ant_num)]  # 初始蚁群self.best_ant = Ant(-1)  # 初始最优解self.best_ant.total_distance = 1 << 31  # 初始最大距离self.iter = 1  # 初始化迭代次数# 将节点按order顺序连线def line(self, order):# 删除原线self.canvas.delete("line")def line2(i1, i2):p1, p2 = self.nodes[i1], self.nodes[i2]self.canvas.create_line(p1, p2, fill="#000000",tags="line")# # 显示线路花费时间# x = int((p1[0]+p2[0])/2)# y = int((p1[1]+p2[1])/2)## self.canvas.create_text(x, y - 10,  # 使用create_text方法在坐标(302,77)处绘制文字#                         text=f"{}",  # 所绘制文字的内容#                         fill='black'  # 所绘制文字的颜色为灰色#                         )return i2# order[-1]为初始值reduce(line2, order, order[-1])# 清除画布def clear(self):for item in self.canvas.find_all():self.canvas.delete(item)# 退出程序def quite(self, evt):self.__lock.acquire()self.__running = Falseself.__lock.release()self.root.destroy()print(u"\n程序已退出...")sys.exit()# 停止搜索def stop(self, evt):self.__lock.acquire()self.__running = Falseself.__lock.release()# 开始搜索def search_path(self, evt=None):# 开启线程self.__lock.acquire()self.__running = Trueself.__lock.release()while self.__running:# 遍历每一只蚂蚁for ant in self.ants:# 搜索一条路径ant.search_path()# 与当前最优蚂蚁比较if ant.total_distance < self.best_ant.total_distance:# 更新最优解self.best_ant = copy.deepcopy(ant)# 更新信息素self.__update_pheromone_gragh()print(u"迭代次数:", self.iter, f"最佳{dataList_name[5]} (hours)", round(self.best_ant.total_distance / 60,2))# 连线self.line(self.best_ant.path)# 设置标题self.title("TSP蚁群算法(n:随机初始 e:开始搜索 s:停止搜索 q:退出程序) 迭代次数: %d" % self.iter)# 更新画布self.canvas.update()self.iter += 1# 更新信息素def __update_pheromone_gragh(self):# 获取每只蚂蚁在其路径上留下的信息素temp_pheromone = [[0.0 for col in range(city_num)] for raw in range(city_num)]for ant in self.ants:for i in range(1, city_num):start, end = ant.path[i - 1], ant.path[i]# 在路径上的每两个相邻城市间留下信息素,与路径总距离反比temp_pheromone[start][end] += Q / ant.total_distancetemp_pheromone[end][start] = temp_pheromone[start][end]# 更新所有城市之间的信息素,旧信息素衰减加上新迭代信息素for i in range(city_num):for j in range(city_num):pheromone_graph[i][j] = pheromone_graph[i][j] * RHO + temp_pheromone[i][j]# 主循环def mainloop(self):self.root.mainloop()print(u"""
--------------------------------------------------------蚁群算法解决TPS问题程序程序中按提示键盘继续操作--------------------------------------------------------""")
TSP(tkinter.Tk()).mainloop()
--------------------------------------------------------蚁群算法解决TPS问题程序程序中按提示键盘继续操作--------------------------------------------------------迭代次数: 1 最佳timesec_bus (hours) 5.04
迭代次数: 2 最佳timesec_bus (hours) 5.04
迭代次数: 3 最佳timesec_bus (hours) 4.94
迭代次数: 4 最佳timesec_bus (hours) 4.94
迭代次数: 5 最佳timesec_bus (hours) 4.94
迭代次数: 6 最佳timesec_bus (hours) 4.94
迭代次数: 7 最佳timesec_bus (hours) 4.94
迭代次数: 8 最佳timesec_bus (hours) 4.94
迭代次数: 9 最佳timesec_bus (hours) 4.94
迭代次数: 10 最佳timesec_bus (hours) 4.85
迭代次数: 11 最佳timesec_bus (hours) 4.85
迭代次数: 12 最佳timesec_bus (hours) 4.85
迭代次数: 13 最佳timesec_bus (hours) 4.85
迭代次数: 14 最佳timesec_bus (hours) 4.85
迭代次数: 15 最佳timesec_bus (hours) 4.85
迭代次数: 16 最佳timesec_bus (hours) 4.85
迭代次数: 17 最佳timesec_bus (hours) 4.85
迭代次数: 18 最佳timesec_bus (hours) 4.85
迭代次数: 19 最佳timesec_bus (hours) 4.84
迭代次数: 20 最佳timesec_bus (hours) 4.84
迭代次数: 21 最佳timesec_bus (hours) 4.84
迭代次数: 22 最佳timesec_bus (hours) 4.84
迭代次数: 23 最佳timesec_bus (hours) 4.84
迭代次数: 24 最佳timesec_bus (hours) 4.84
迭代次数: 25 最佳timesec_bus (hours) 4.84
迭代次数: 26 最佳timesec_bus (hours) 4.84
迭代次数: 27 最佳timesec_bus (hours) 4.84
迭代次数: 28 最佳timesec_bus (hours) 4.84
迭代次数: 29 最佳timesec_bus (hours) 4.84
迭代次数: 30 最佳timesec_bus (hours) 4.84
迭代次数: 31 最佳timesec_bus (hours) 4.84
迭代次数: 32 最佳timesec_bus (hours) 4.84
迭代次数: 33 最佳timesec_bus (hours) 4.84
迭代次数: 34 最佳timesec_bus (hours) 4.84
迭代次数: 35 最佳timesec_bus (hours) 4.84
迭代次数: 36 最佳timesec_bus (hours) 4.84
迭代次数: 37 最佳timesec_bus (hours) 4.84
迭代次数: 38 最佳timesec_bus (hours) 4.84
迭代次数: 39 最佳timesec_bus (hours) 4.84
迭代次数: 40 最佳timesec_bus (hours) 4.84
迭代次数: 41 最佳timesec_bus (hours) 4.84
迭代次数: 42 最佳timesec_bus (hours) 4.83
迭代次数: 43 最佳timesec_bus (hours) 4.83
迭代次数: 44 最佳timesec_bus (hours) 4.83
迭代次数: 45 最佳timesec_bus (hours) 4.83
迭代次数: 46 最佳timesec_bus (hours) 4.83
迭代次数: 47 最佳timesec_bus (hours) 4.83
迭代次数: 48 最佳timesec_bus (hours) 4.83
迭代次数: 49 最佳timesec_bus (hours) 4.83
迭代次数: 50 最佳timesec_bus (hours) 4.83
迭代次数: 51 最佳timesec_bus (hours) 4.83
迭代次数: 52 最佳timesec_bus (hours) 4.83
迭代次数: 53 最佳timesec_bus (hours) 4.83
迭代次数: 54 最佳timesec_bus (hours) 4.83
迭代次数: 55 最佳timesec_bus (hours) 4.83
迭代次数: 56 最佳timesec_bus (hours) 4.83
迭代次数: 57 最佳timesec_bus (hours) 4.83
迭代次数: 58 最佳timesec_bus (hours) 4.83
迭代次数: 59 最佳timesec_bus (hours) 4.83
迭代次数: 60 最佳timesec_bus (hours) 4.83
迭代次数: 61 最佳timesec_bus (hours) 4.83
迭代次数: 62 最佳timesec_bus (hours) 4.83

引用文献
CSDN 百度api获取个人ak
蚁群算法的实现

这篇关于出门游玩,运用百度api 和蚁群算法 ,解决基于现实实时数据的 旅行商问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/324270

相关文章

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结