@基于蒙特卡罗树搜索的智能行程规划系统设计
github链接.https://github.com/blue-sky-sea/MCTS-TRAVEL-PLAN
以东京都横滨市为例
使用googlemaps库。google开发者的key自行申请。
googlemaps库的文档在此.
#例子
#import库
import googlemaps
#获取client
gmaps = googlemaps.Client(key='你的googlemapkey')
#Places search
#查找 横滨红砖仓库 相关的地点
places_result = gmaps.places(query="横滨红砖仓库",location="35.4525944, 139.6428944",language="zh")
#横滨预选的景点(我去过的大众景点hhh)
candidate_places_name_yokohama = ["山下公园","横滨红砖仓库","横滨未来21","横滨中华街","GUNDAM FACTORY YOKOHAMA","橫濱宇宙樂園","合味道纪念馆","Shin-Yokohama Raumen Museum","三溪园","横滨地标大厦","横滨面包超人儿童博物馆","横滨美术馆"]
import xlwt#导入xlwt库
workbook = xlwt.Workbook(encoding = 'ascii')#创建workbook
worksheet = workbook.add_sheet('Yokohama spot') #添加名叫Yokohama spot的sheet
n=0
for spotname in candidate_places_name_yokohama:
places_result = gmaps.places(query=spotname,location="35.4525944, 139.6428944",language="zh")
#print(i)
item=places_result['results'][0]
print(spotname,":",item['place_id'],item['name'],item['geometry']['location'],item['formatted_address'])
worksheet.write(n, 0, item['place_id'])#写入xls的n行0列
worksheet.write(n, 1, item['name'])
worksheet.write(n, 2, str(item['geometry']['location']))
worksheet.write(n, 3, item['formatted_address'])
n=n+1
workbook.save('/Users/liuyi/Desktop/Ttravel-Master/Main/DATA/Yokohama_spot.xls') #保存到xls路径
就省略了。因为是demo所以数据集里面交通花费的时间和金钱都是一个确定的值。
比如:
MCTS interface 在这个地址,是github上一个大佬的,我感觉是我找到的最简洁的最好用的MCTS interface了
MCTS interface在此.
其中mcts.py中几乎不需要改什么代码
我们需要做的是完善exampleInterface.py中的方法
通过修改exampleInterface.py,我们就可以用mcts算法创造出五子棋AI,口袋妖怪AI或者是我们的智能行程AI啦
(根据目标特性的不同,code里面的方法)
这是马蜂窝上横滨的人气景点地图
上面没有显示高达工厂
因为可能横滨中华街value最高,就一直先访问中华街的结点,而忽略了其他同样不错但评分可能略差一点的景点。
有陷入局部最优解的可能,而且规划的结果评定并不像五子棋的输赢规则那样鲜明。这是需要后续考虑的问题。
app.py(flask.main.py)
# 导入Flask类
from flask import Flask
from flask import render_template
from flask import request
# 实例化,可视为固定格式
app = Flask(__name__)
# 配置路由,当前端请求/deal_request的action时执行deal_request()方法(前端可用ajax发起请求)
@app.route('/deal_request', methods = ['GET', 'POST'])
def deal_request():
if request.method == "GET":
# get通过request.args.get("param_name","")形式获取参数值
#get_q = request.args.get("q","")
#print("start ai")
import sys
sys.path.append("../AI/")
import MCTS
mcts_manager = MCTS.mcts(timeLimit=10000)#开启mcts程序
print("初始化中...")
#from datetime import date
from datetime import datetime
#from datetime import timedelta
start_datetime = datetime(2021, 2, 1, 9, 30, 0)
end_datetime = datetime(2021,2,1,20,30,0)
initialstate=MCTS.State(nowspotname="横滨港未来21",
travelpoint=0,
totaltravelpoint=0,
moneycost=0,
onfoottime=0,
now_datetime=start_datetime,
end_datetime=end_datetime,
hasbeenspots=[])
print("初始化sucess")
root = mcts_manager.search(initialState=initialstate)
result = mcts_manager.getBestRoute(root)
return str(result)
#返回result到前端
elif request.method == "POST":
# post通过request.form["param_name"]形式获取参数值
post_q = request.form["q"]
return render_template("result.html", result=post_q)
if __name__ == '__main__':
# app.run(host, port, debug, options)
# 默认值:host=127.0.0.1, port=5000, debug=false
app.run()
cmd 中python app.py 即可开启,访问127.0.0.1:5000
设定游玩偏好(其他设定还没code),点击运行MCTS-AI规划即可
但是根据结果,为啥最后一站是山下公园,感觉还是有点不太对劲。。。要改的地方太多了。