基于蒙特卡罗树搜索的智能行程规划系统设计(二)一个简单的DEMO

@基于蒙特卡罗树搜索的智能行程规划系统设计

基于蒙特卡罗树搜索的智能行程规划系统设计DEMO0.1

github链接.https://github.com/blue-sky-sea/MCTS-TRAVEL-PLAN

(一)使用Googlemap API收集旅行点数据

以东京都横滨市为例

使用googlemaps库。google开发者的key自行申请。

googlemaps库的文档在此.

1.一个简单的例子如下:

#例子
#import库
import googlemaps

#获取client
gmaps = googlemaps.Client(key='你的googlemapkey')

#Places search
#查找 横滨红砖仓库 相关的地点
places_result = gmaps.places(query="横滨红砖仓库",location="35.4525944, 139.6428944",language="zh")

2.利用xlwt,将数据写入xls

#横滨预选的景点(我去过的大众景点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路径 

3.类似的方法,制作景点之间的交通数据集

就省略了。因为是demo所以数据集里面交通花费的时间和金钱都是一个确定的值。

4.根据需求对数据集里没有的数据进行人工添加(因为谷歌API没找到相关数据)

比如:

1.该地点是否更适合亲子/情侣游玩

2.更适合游玩的时间段(白天/晚上?)

3.附加的地点属性(二次元/购物/夜景/等)

4.特殊属性(横滨中华街新年活动等)

5.等

(二)利用MCTS interface构建AI-demo

MCTS interface 在这个地址,是github上一个大佬的,我感觉是我找到的最简洁的最好用的MCTS interface了
MCTS interface在此.

其中mcts.py中几乎不需要改什么代码
我们需要做的是完善exampleInterface.py中的方法基于蒙特卡罗树搜索的智能行程规划系统设计(二)一个简单的DEMO_第1张图片
通过修改exampleInterface.py,我们就可以用mcts算法创造出五子棋AI,口袋妖怪AI或者是我们的智能行程AI啦
(根据目标特性的不同,code里面的方法)

(三)利用MCTS interface构建AI-demo的要点

这是马蜂窝上横滨的人气景点地图
上面没有显示高达工厂

1.在本demo中,为了方便我只考虑在横滨一天的简单行程规划。

2.设定早上开始时间为9点(已经在樱木町车站前),晚上结束时间最好是在20点前。

3.设定用户的预算,行程偏好(亲子/情侣/购物/等)

4.没有考虑午饭晚饭和住宿,而实际上根据我在问卷星上的调查,美食和住宿等的质量和花费实际上是最受用户关注

5.没有考虑天气因素和特殊事件等,实际规划应该要有

6.根据用户的偏好,对应景点的value要上升或者下降(比如亲子游的话酒吧商城这种地点的价值就应该下降,喜欢二次元的话秋叶原的价值就上升)

7.由于用MCTS进行规划很难客观评判好坏(因为每一个景点实际上都还可以玩玩的)所以在6的基础上,对树搜索设定一定限制,防止重复访问同一个子节点。

因为可能横滨中华街value最高,就一直先访问中华街的结点,而忽略了其他同样不错但评分可能略差一点的景点。
有陷入局部最优解的可能,而且规划的结果评定并不像五子棋的输赢规则那样鲜明。这是需要后续考虑的问题。

(四)基于flask构建前端,部署mcts-ai到项目上

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规划即可

等待15秒ai计算(因为是demo,设置个15秒够了)

通过alert()很简单地把规划结果返回给了用户基于蒙特卡罗树搜索的智能行程规划系统设计(二)一个简单的DEMO_第2张图片

但是根据结果,为啥最后一站是山下公园,感觉还是有点不太对劲。。。要改的地方太多了。

你可能感兴趣的:(python,行程规划,mcts,flask,ai,python)