基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(三)

本文主要是介绍基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 前言
  • 总体设计
    • 系统整体结构图
    • 系统流程图
  • 运行环境
    • Python环境
    • Pycharm 环境
    • Scikit-learnt
  • 模块实现
    • 1. 数据预处理
    • 2. 客流预测
    • 3. 百度地图API调用
    • 4. GUI界面设计
      • 1)手绘地图导入
      • 2)下拉菜单设计
      • 3)复选框设计
      • 4)最短路径结果输出界面设计
      • 5)智能推荐结果输出设计
      • 6)界面展示
    • 5. 路径规划
    • 6. 智能推荐
  • 相关其它博客
  • 工程源代码下载
  • 其它资料下载


在这里插入图片描述

前言

本项目的核心是利用百度地图API获取步行时间和借助GBDT(梯度提升决策树)模型进行排队时间的预测。它旨在为用户提供一种自主选择多个目的地的功能,然后系统会输出最佳路线规划的结果,并根据用户的选择提供智能化的建议。

首先,项目利用百度地图API,能够获取到步行时间信息。这些信息包括从一个地点到另一个地点所需的预计步行时间。这个步骤确保了系统具有地理位置感知能力,可以理解用户的出行需求。

接下来,项目使用GBDT模型,这是一种强大的机器学习模型,用于预测排队时间。GBDT模型会考虑多个因素,如交通状况、目的地之间的距离、历史排队数据等,来预测用户在不同地点排队的时间。

一旦获取了这些信息,系统可以让用户自主选择多个目的地。用户可以输入他们的出发点和多个目标地点,然后系统会根据百度地图API的步行时间和GBDT模型的排队时间预测,计算出最佳路线规划。这个规划考虑了用户的时间限制、排队时间、步行时间等因素,以确保用户能够在最短的时间内到达所有目的地。

最后,系统还可以根据用户的选择,提供智能化的建议。例如,如果用户希望优先选择最短排队时间的目的地,系统可以相应地调整路线规划。

总的来说,这个项目结合了地图数据和机器学习技术,为用户提供了一个方便的自主选择多个目的地并获取最佳路线规划的工具。这对于城市出行和旅游规划非常有用,可以帮助用户更高效地安排行程。

总体设计

本部分包括系统整体结构图和系统流程图。

系统整体结构图

系统整体结构如图所示。

在这里插入图片描述

系统流程图

系统流程如图所示。

在这里插入图片描述
路径规划流程如图所示。
在这里插入图片描述

计算路径耗时流程,如图所示。

在这里插入图片描述

运行环境

本部分包括 Python 环境、Pycharm 环境和Scikit-learn环境。

Python环境

需要Python 3.6及以上配置,在Windows环境下推荐下载Anaconda完成Python所需环境的配置,下载地址为https://www.anaconda.com/,也可下载虚拟机在Linux环境下运行代码。

Pycharm 环境

PyCharm下载地址为http://www.jetbrains.com/pycharm/download/#section=windows,进入网站后单击Comminity版本下的DOWNLOAD下载安装包,下载完成后安装。单击Create New Project创建新的项目文件,Location为存放工程的路径,单击project附近的三角符号,可以看到PyCharm已经自动获取Python 3.6,单击create完成。

Scikit-learnt

安装CPU版本的Scikit-learn: pip install -U --ignore-installed scikit-learn, 或者从Anaconda环境中直接搜索 scikit-learn包进行下载、安装。

模块实现

本项目包括6个模块:数据预处理、客流预测、百度地图API调用、GUI界面设计、路径规划和智能推荐,下面分别给出各模块的功能介绍及相关代码。

1. 数据预处理

详见博客:https://blog.csdn.net/qq_31136513/article/details/133011765#1__49

2. 客流预测

详见博客:https://blog.csdn.net/qq_31136513/article/details/133011802#2__54

3. 百度地图API调用

详见博客:https://blog.csdn.net/qq_31136513/article/details/133011802#3_API_134

4. GUI界面设计

导入Tkinter包进行GUI设计。用户通过下拉菜单手动选择当前位置,勾选目的地。单击“确认”按钮后调用create()函数跳转至最佳路线输出界面。

1)手绘地图导入

相关代码如下:

#背景初始化部分
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)

2)下拉菜单设计

相关代码如下:

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=0elif comboxlist.get()=="玛雅天灾":all_paths_first=1elif comboxlist.get()=="雪域金翅":all_paths_first=2elif comboxlist.get()=="异域魔窟":all_paths_first=3elif comboxlist.get()=="奥德赛之旅":all_paths_first=4elif comboxlist.get()=="太阳神车":all_paths_first=5elif comboxlist.get()=="天地双雄":all_paths_first=6elif comboxlist.get()=="能量风暴":all_paths_first=7
comboxlist.bind("<<ComboboxSelected>>",xFunc)  
#绑定事件,(下拉列表框被选中时,绑定xFunc()函数)  
comboxlist.pack()  

3)复选框设计

复选框格式是一致的,为了界面简洁,只展示一个复选框设计。

#count判断是否需要调用百度地图API,奇数表示选中
count1=0
N = []
def myEvent1():global count1if count1%2==0:count1+=1else: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

4)最短路径结果输出界面设计

相关代码如下:

total=[]    #存放被选择的目的地
total_n=[]  #存放未被选择的地点
#选择地点完成后调出最短路径结果输出界面
def create():window2 = tkinter.Toplevel() #新建子窗口windows2window2.geometry('300x200')window2.title('计算页面')s0=Label(window2,text="您选择了:") #文字框s0s0.pack()    #选择目的地if count1%2==1:          #如果被选中N.append(0)           #N列表中增加0total.append("入口") #total列表中增加“入口”else:                       #如果未被选中N_notchoose.append(0) #N_notchoose列表中增加0total_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="最佳路线为:") #文字框s9s9.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() 

5)智能推荐结果输出设计

相关代码如下:

#创建智能推荐的页面
def create_guess():window3 = tkinter.Toplevel() #新建子窗口windows3window3.geometry('400x250')window3.title('猜你喜欢')s0=Label(window3,text="您选择了:") #文字框s0s0.pack()s_total=Label(window3,text=total) #输出用户选中的地点s_total.pack()s7=Label(window3,text="为您推荐:") #文字框s7s7.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="加入推荐地点的最佳路线为:") #文本框s9s9.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()

6)界面展示

GUI主页面如图所示。
在这里插入图片描述

下拉菜单如图所示。
在这里插入图片描述

5. 路径规划

通过调用百度地图API模块产生节点之间的步行时间矩阵和客流模型,应用穷举法设计算法,得出最佳路线规划。

GUI界面下拉菜单中选择当前位置作为所有可能线路的起点,复选框中目的地作为节点,调用itertools库中的permutations()函数进行全排列,路线每到节点时间、排队时间输出在cmd窗口,如图所示。

在这里插入图片描述

最佳路线和总耗时输出在GUI模块设计的界面当中,如图所示。

在这里插入图片描述
相关代码如下:

#获得最佳路径和出游时间
def get_time(N):global TIMEglobal PATHgbdt_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)+1print(all_paths_first)all_paths_tuple=list(itertools.permutations(N,n-1)) 
#得到的全排列是元组tupleall_paths=[]#tuple类型不能插入操作,所以转换成listfor 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'] = nowtimegbdt_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 = timepath = all_paths[i]print("耗时最短的路径为:"+str(path)+" 耗时为:"+str(all_time))PATH = pathTIME = all_time

6. 智能推荐

系统将用户未选择的地点一次分别加入已选择的队列中进行运算,其基本思路与最佳路线规划模块一致,采用穷举法得到所有路线及其总耗时,最后将它们输出,实现智能推荐。

相关代码如下:

#智能推荐“猜你喜欢”的运算
def guess_time(N):global TIME_guessglobal PATH_guessglobal recommendpath_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))) 
#得到的全排列是元组tupleall_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'] = nowtimegbdt_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 = timepath = all_paths[i]if all_time_whole>all_time:all_time_whole = all_timepath_whole=path[:]recommend = N_notchoose[nn]print("推荐第"+str(recommend)+"个景点")print("推荐第"+str(recommend)+"个景点")print("智能推荐耗时最短的路径为a:"+str(path_whole)+"  耗时为:"+str(all_time_whole))PATH_guess = path_wholeTIME_guess = all_time_whole

在cmd窗口输出所有路径及该路径每到一节点的时间,如图所示。

在这里插入图片描述

在GUI模块设计的界面中显示最佳路线和总耗时,如图所示。

在这里插入图片描述

相关其它博客

基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(一)

基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(二)

基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(四)

工程源代码下载

详见本人博客资源下载页


其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

这篇关于基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,