本项目的核心是利用百度地图API获取步行时间和借助GBDT(梯度提升决策树)模型进行排队时间的预测。它旨在为用户提供一种自主选择多个目的地的功能,然后系统会输出最佳路线规划的结果,并根据用户的选择提供智能化的建议。
首先,项目利用百度地图API,能够获取到步行时间信息。这些信息包括从一个地点到另一个地点所需的预计步行时间。这个步骤确保了系统具有地理位置感知能力,可以理解用户的出行需求。
接下来,项目使用GBDT模型,这是一种强大的机器学习模型,用于预测排队时间。GBDT模型会考虑多个因素,如交通状况、目的地之间的距离、历史排队数据等,来预测用户在不同地点排队的时间。
一旦获取了这些信息,系统可以让用户自主选择多个目的地。用户可以输入他们的出发点和多个目标地点,然后系统会根据百度地图API的步行时间和GBDT模型的排队时间预测,计算出最佳路线规划。这个规划考虑了用户的时间限制、排队时间、步行时间等因素,以确保用户能够在最短的时间内到达所有目的地。
最后,系统还可以根据用户的选择,提供智能化的建议。例如,如果用户希望优先选择最短排队时间的目的地,系统可以相应地调整路线规划。
总的来说,这个项目结合了地图数据和机器学习技术,为用户提供了一个方便的自主选择多个目的地并获取最佳路线规划的工具。这对于城市出行和旅游规划非常有用,可以帮助用户更高效地安排行程。
本部分包括系统整体结构图和系统流程图。
系统整体结构如图所示。
系统流程如图所示。
路径规划流程如图所示。
计算路径耗时流程,如图所示。
本部分包括 Python 环境、Pycharm 环境和Scikit-learn环境。
需要Python 3.6及以上配置,在Windows环境下推荐下载Anaconda完成Python所需环境的配置,下载地址为https://www.anaconda.com/,也可下载虚拟机在Linux环境下运行代码。
PyCharm下载地址为http://www.jetbrains.com/pycharm/download/#section=windows,进入网站后单击Comminity版本下的DOWNLOAD下载安装包,下载完成后安装。单击Create New Project创建新的项目文件,Location为存放工程的路径,单击project附近的三角符号,可以看到PyCharm已经自动获取Python 3.6,单击create完成。
安装CPU版本的Scikit-learn
: pip install -U --ignore-installed scikit-learn
, 或者从Anaconda环境中直接搜索 scikit-learn包进行下载、安装。
本项目包括6个模块:数据预处理、客流预测、百度地图API调用、GUI界面设计、路径规划和智能推荐,下面分别给出各模块的功能介绍及相关代码。
详见博客:https://blog.csdn.net/qq_31136513/article/details/133011765#1__49
详见博客:https://blog.csdn.net/qq_31136513/article/details/133011802#2__54
详见博客:https://blog.csdn.net/qq_31136513/article/details/133011802#3_API_134
导入Tkinter
包进行GUI设计。用户通过下拉菜单手动选择当前位置,勾选目的地。单击“确认”
按钮后调用create()
函数跳转至最佳路线输出界面。
相关代码如下:
#背景初始化部分
window = tkinter.Tk()
window.geometry('900x500')
window.title('智能导航系统——欢乐谷')
#显示图片
#通过PIL打开图片
img = Image.open('C:/Users/99509/Desktop/map.jpg')
img = img.resize((750,500),Image.ANTIALIAS) #Image.ANTIALIAS使图片不模糊
#通过PIL生成PhotoImage对象,即可正常加载
photo = ImageTk.PhotoImage(img)
imageLabel = Label(window, image=photo)
imageLabel.pack(side=LEFT)
相关代码如下:
ss=Label(window,text="您当前位置为",justify=RIGHT)
ss.pack()
comvalue=tkinter.StringVar() #窗体自带的文本,新建一个值
comboxlist=ttk.Combobox(window,textvariable=comvalue) #初始化
comboxlist["values"]=("入口","玛雅天灾","雪域金翅","异域魔窟","奥德赛之旅","太阳神车","天地双雄","能量风暴")
all_paths_first=""
def xFunc(event):
global all_paths_first
#print(comboxlist.get())
#当前位置
if comboxlist.get()=="入口":
all_paths_first=0
elif comboxlist.get()=="玛雅天灾":
all_paths_first=1
elif comboxlist.get()=="雪域金翅":
all_paths_first=2
elif comboxlist.get()=="异域魔窟":
all_paths_first=3
elif comboxlist.get()=="奥德赛之旅":
all_paths_first=4
elif comboxlist.get()=="太阳神车":
all_paths_first=5
elif comboxlist.get()=="天地双雄":
all_paths_first=6
elif comboxlist.get()=="能量风暴":
all_paths_first=7
comboxlist.bind("<>" ,xFunc)
#绑定事件,(下拉列表框被选中时,绑定xFunc()函数)
comboxlist.pack()
复选框格式是一致的,为了界面简洁,只展示一个复选框设计。
#count判断是否需要调用百度地图API,奇数表示选中
count1=0
N = []
def myEvent1():
global count1
if count1%2==0:
count1+=1
else:
count1+=1
#项目选择部分
v1=IntVar()
c1=Checkbutton(window,text='入口',variable=v1,justify=RIGHT,command=myEvent1) #存放选中状态
c1.pack()
l1=Label(window,textvariable=v1,justify=RIGHT)
l1.pack() #未选中显示为0,选中显示为1
相关代码如下:
total=[] #存放被选择的目的地
total_n=[] #存放未被选择的地点
#选择地点完成后调出最短路径结果输出界面
def create():
window2 = tkinter.Toplevel() #新建子窗口windows2
window2.geometry('300x200')
window2.title('计算页面')
s0=Label(window2,text="您选择了:") #文字框s0
s0.pack()
#选择目的地
if count1%2==1: #如果被选中
N.append(0) #N列表中增加0
total.append("入口") #total列表中增加“入口”
else: #如果未被选中
N_notchoose.append(0) #N_notchoose列表中增加0
total_n.append("入口") #total_n列表中增加“入口”
if count2%2==1: #以下同理
N.append(1)
total.append("玛雅天灾")
else:
N_notchoose.append(1)
total_n.append("玛雅天灾")
if count3%2==1:
N.append(2)
total.append("雪域金翅")
else:
N_notchoose.append(2)
total_n.append("雪域金翅")
if count4%2==1:
N.append(3)
total.append("异域魔窟")
else:
N_notchoose.append(3)
total_n.append("异域魔窟")
if count5%2==1:
N.append(4)
total.append("奥德赛之旅")
else:
N_notchoose.append(4)
total_n.append("奥德赛之旅")
if count6%2==1:
N.append(5)
total.append("太阳神车")
else:
N_notchoose.append(5)
total_n.append("太阳神车")
if count7%2==1:
N.append(6)
total.append("天地双雄")
else:
N_notchoose.append(6)
total_n.append("天地双雄")
if count8%2==1:
N.append(7)
total.append("能量风暴")
else:
N_notchoose.append(7)
total_n.append("能量风暴")
s_total=Label(window2,text=total) #输出用户选中的地点
s_total.pack()
s9=Label(window2,text="最佳路线为:") #文字框s9
s9.pack()
get_time(N) #调用get_time进行运算
PLAN=[] #用于存放计划路径
#输出路径
for i in range(0,len(N)+1):
if PATH[i]==0:
PLAN.append("入口")
elif PATH[i]==1:
PLAN.append("玛雅天灾")
elif PATH[i]==2:
PLAN.append("雪域金翅")
elif PATH[i]==3:
PLAN.append("异域魔窟")
elif PATH[i]==4:
PLAN.append("奥德赛之旅")
elif PATH[i]==5:
PLAN.append("太阳神车")
elif PATH[i]==6:
PLAN.append("天地双雄")
else:
PLAN.append("能量风暴")
s10=Label(window2,text=PLAN) #输出计划的最短路径
s10.pack()
s11=Label(window2,text="\n大约耗时:"+str(round(TIME[0],2))+"小时")
#输出对应总耗时
s11.pack()
b2=Button(window2,text='猜你喜欢',command=create_guess)
#新建“猜你喜欢”按钮进入智能推荐模块
b2.pack()
b3=Button(window2,text='退出',command=window.destroy) #退出按钮
b3.pack()
相关代码如下:
#创建智能推荐的页面
def create_guess():
window3 = tkinter.Toplevel() #新建子窗口windows3
window3.geometry('400x250')
window3.title('猜你喜欢')
s0=Label(window3,text="您选择了:") #文字框s0
s0.pack()
s_total=Label(window3,text=total) #输出用户选中的地点
s_total.pack()
s7=Label(window3,text="为您推荐:") #文字框s7
s7.pack()
try:
guess_time(N) #调用guess_time函数,计算推荐地点及推荐最短路径
except:
tkinter.messagebox.showwarning("提示", "选取地点有误!\n请退出重新选取")
#加入异常处理,跳出提示框
PLAN=[] #存放推荐最短路径
#输出路径
for i in range(0,len(N)+2):
if PATH_guess[i]==0:
PLAN.append("入口")
elif PATH_guess[i]==1:
PLAN.append("玛雅天灾")
elif PATH_guess[i]==2:
PLAN.append("雪域金翅")
elif PATH_guess[i]==3:
PLAN.append("异域魔窟")
elif PATH_guess[i]==4:
PLAN.append("奥德赛之旅")
elif PATH_guess[i]==5:
PLAN.append("太阳神车")
elif PATH_guess[i]==6:
PLAN.append("天地双雄")
else:
PLAN.append("能量风暴")
s8=Label(window3,text=location[recommend]) #输出推荐的地点
s8.pack()
s9=Label(window3,text="加入推荐地点的最佳路线为:") #文本框s9
s9.pack()
s10=Label(window3,text=PLAN) #输出推荐的最短路径
s10.pack()
s11=Label(window3,text="\n大约耗时:"+str(round(TIME_guess[0],2))+"小时") #输出推荐的总耗时
s11.pack()
s12=Label(window3,text="预计比原路线多花费:"+str(round((TIME_guess[0]-TIME[0]),2))+"小时") #输出推荐一个地点后的总耗时与之前总耗时的差
s12.pack()
b3=Button(window3,text='返回',command=window3.destroy)
#“返回”按钮,返回上一界面
b3.pack()
b4=Button(window3,text='退出',command=window.destroy)
#“退出”按钮,退出程序
b4.pack()
GUI主页面如图所示。
通过调用百度地图API模块产生节点之间的步行时间矩阵和客流模型,应用穷举法设计算法,得出最佳路线规划。
GUI界面下拉菜单中选择当前位置作为所有可能线路的起点,复选框中目的地作为节点,调用itertools
库中的permutations()
函数进行全排列,路线每到节点时间、排队时间输出在cmd窗口,如图所示。
最佳路线和总耗时输出在GUI模块设计的界面当中,如图所示。
#获得最佳路径和出游时间
def get_time(N):
global TIME
global PATH
gbdt_6_model_path = "D:/~STUDY~/Grade3/信息系统设计/final_files/data/模型/gbdt_6.model"
gbdt_model = joblib.load(gbdt_6_model_path) #加载模型
#初始化客流模型顺序不可改变
features=pd.DataFrame({'temperature_average':[2],
'wind_average':[0],
'weather_average':[6],
'time':[0],
'isholiday':[0],
'dayofweek':[1]})
#N = [0,1,2,3] #GUI界面单击选择
n=len(N)+1
print(all_paths_first)
all_paths_tuple=list(itertools.permutations(N,n-1))
#得到的全排列是元组tuple
all_paths=[]
#tuple类型不能插入操作,所以转换成list
for i in range(0,math.factorial(n-1)):
all_paths.append(list(all_paths_tuple[i]))
all_paths[i].insert(0,all_paths_first)
path = list()
all_time = float('inf') #无穷大
#第i条路线
for i in range(0,math.factorial(n-1)):
time = 0 #(h)
nowtime = 9 #可以获取当前时间,需要事件表示的转换(h)
print("第"+str(i+1)+"条路线为:"+str(all_paths[i]))
#第i条路线的第j个地点
for j in range(0,n-1):
time = time + (walk_time[all_paths[i][j]][all_paths[i][j+1]]/3600)
#到达一个地点的时间
nowtime = nowtime+time
features['time'] = nowtime
gbdt_predict_labels = gbdt_model.predict(features)/2000
#客流量/2000当作时间(h)
print("现在的时间是:"+str(nowtime)+" 此时"+str(j)+"点的排队时间为:"+str(gbdt_predict_labels)+"h")
time = time + gbdt_predict_labels + (PLAYTIME[j]/60)
print("耗时为:"+str(time))
print("===================================================================")
if all_time>time:
all_time = time
path = all_paths[i]
print("耗时最短的路径为:"+str(path)+" 耗时为:"+str(all_time))
PATH = path
TIME = all_time
系统将用户未选择的地点一次分别加入已选择的队列中进行运算,其基本思路与最佳路线规划模块一致,采用穷举法得到所有路线及其总耗时,最后将它们输出,实现智能推荐。
相关代码如下:
#智能推荐“猜你喜欢”的运算
def guess_time(N):
global TIME_guess
global PATH_guess
global recommend
path_whole = list()
all_time_whole = float('inf') #无穷大
gbdt_6_model_path = "D:/~STUDY~/Grade3/信息系统设计/final_files/data/模型/gbdt_6.model"
gbdt_model = joblib.load(gbdt_6_model_path) #加载模型
features=pd.DataFrame({'temperature_average':[2],
'wind_average':[0],
'weather_average':[6],
'time':[0],
'isholiday':[0],
'dayofweek':[1]})
#N = [0,1,2,3] #GUI界面单击选择
print('起点是:'+str(all_paths_first))
for nn in range(0,len(N_notchoose)):
#把未选择的地点分别加入到已选择的队列中进行计算
guess_path = []
guess_path = N[:]
guess_path.append(N_notchoose[nn]) #构建推荐的列表
print(guess_path)
if(all_paths_first in guess_path):
pass #如果未选择的地点是起点,则跳过
else:
all_paths_tuple=list(itertools.permutations(guess_path,len(guess_path)))
#得到的全排列是元组tuple
all_paths=[]
#tuple类型不能插入操作,所以转换成list
#for i in range(0,math.factorial(n-1)):调试代码
for i in range(0,math.factorial(len(guess_path))):
all_paths.append(list(all_paths_tuple[i]))
all_paths[i].insert(0,all_paths_first)
path = list()
all_time = float('inf') #无穷大
#第i条路线
for i in range(0,math.factorial(len(guess_path))):
time = 0 #(h)
nowtime = 9 #可以获取当前时间,需要事件表示的转换(h)
print("第"+str(i+1)+"条路线为:"+str(all_paths[i]))
#第i条路线的第j个地点
for j in range(0,len(guess_path)):
time = time + (walk_time[all_paths[i][j]][all_paths[i][j+1]]/3600)
#到达一个地点的时间
nowtime = nowtime+time
features['time'] = nowtime
gbdt_predict_labels = gbdt_model.predict(features)/2000
#客流量/2000当作时间(h)
print("现在的时间是:"+str(nowtime)+" 此时"+str(j)+"点的排队时间为:"+str(gbdt_predict_labels)+"h")
time = time + gbdt_predict_labels + (PLAYTIME[j]/60)
print("耗时为:"+str(time))
print("")
if all_time>time:
all_time = time
path = all_paths[i]
if all_time_whole>all_time:
all_time_whole = all_time
path_whole=path[:]
recommend = N_notchoose[nn]
print("推荐第"+str(recommend)+"个景点")
print("推荐第"+str(recommend)+"个景点")
print("智能推荐耗时最短的路径为a:"+str(path_whole)+" 耗时为:"+str(all_time_whole))
PATH_guess = path_whole
TIME_guess = all_time_whole
在cmd窗口输出所有路径及该路径每到一节点的时间,如图所示。
在GUI模块设计的界面中显示最佳路线和总耗时,如图所示。
基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(一)
基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(二)
基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(四)
详见本人博客资源下载页
如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。