徐永康 高文超 廖宏科 崔長潤 丁雨萌 劉旭昭 左家昌
摘要:個人出行逐漸成為人們出游的首選,但是市場上缺少可以為用戶深度定制旅行路線的軟件。該文介紹了一種基于SpringBoot后端和Android客戶端的個性化旅游路線推薦系統(tǒng),實(shí)現(xiàn)了北京區(qū)域內(nèi)景點(diǎn)的推薦功能。經(jīng)過測試,可以實(shí)現(xiàn)用戶登錄注冊以及路線規(guī)劃功能。
關(guān)鍵詞:Android;SpringBoot;Mybatis;個性化旅游;TSP
1 背景
隨著移動互聯(lián)網(wǎng)的發(fā)展和人們生活水平的提高,旅游逐漸成為民眾娛樂的重要途徑。然而如今的旅游規(guī)劃軟件大多是起到預(yù)定門票酒店的功能,并不能發(fā)揮路線規(guī)劃和景點(diǎn)推薦的作用。本文將介紹基于安卓平臺的個性化旅游路線推薦軟件的設(shè)計(jì)與實(shí)現(xiàn)。
2 當(dāng)今個人旅游系統(tǒng)發(fā)展現(xiàn)狀
在當(dāng)今的移動互聯(lián)網(wǎng)時代,越來越多的在線旅游服務(wù)如雨后春筍般涌現(xiàn)。目前這些旅游類的服務(wù)大可以分為兩類。 第一類是提供基本的訂機(jī)票、火車票、訂酒店之類的服務(wù)。作為代表的應(yīng)用主要有:攜程、去哪旅行、飛豬、藝龍旅行、同程旅行等。這些應(yīng)用往往是將大量的信息提供給用戶,讓用戶自行篩選,服務(wù)商較為被動,優(yōu)點(diǎn)是信息較為全面??梢姶祟惖姆?wù)還有很大的提升空間。 第二類則是為用戶提供旅行的行程規(guī)劃服務(wù),屬于傳統(tǒng)的旅行社的線上升級版,提供成套的解決方案。代表App有:氫氣球旅行,蟬游記,面包旅行,行程助手,百度旅游。這類應(yīng)用可以初步對信息進(jìn)行篩選,效率相比第一種有一定的提高。但是隨旅行社出游并不靈活,可定制化程度比較低,仍有提升空間。 在未來旅游類 App 的發(fā)展趨向?qū)⑹菑?qiáng)自動化的。軟件應(yīng)該盡可能變被動為主動,幫用戶完成旅行的整體大致規(guī)劃,提供私人的成套的旅行解決方案。讓系統(tǒng)依據(jù)用戶的出行方式、出行人數(shù)、個人偏好來自動地為用戶規(guī)劃好行程,為用戶提供一整套出行方案,降低用戶的決策成本。
3 路線規(guī)劃算法(蟻群算法)
TSP問題(Travel Salesperson Problem即旅行商問題)是一種NP-hard問題,在大型事件中很難獲得最優(yōu)解,一般需要啟發(fā)式算法就近似解,如遺傳算法(GA),蟻群算法(ACO),微粒群算法(PSO)。蟻群算法是一種以螞蟻覓食行為為依據(jù)逐漸發(fā)展出來的一種啟發(fā)式優(yōu)化算法[1],算法的目的是尋找優(yōu)化路徑,最初是用來解決TSP問題而產(chǎn)生的。該算法在系統(tǒng)中起到了為用戶安排游覽路徑的作用。
4 所用技術(shù)
4.1 安卓平臺
安卓是一種基于Linux內(nèi)核的自由開源的操作系統(tǒng)。主要使用于移動設(shè)備,使用java語言作為開發(fā)語言[2]。Android的開發(fā)包括四大組件:活動(Activity),服務(wù)(Service),廣播接收器(Broadcast Receiver),內(nèi)容提供商(Content Provider)。
Activity中包含了所有程序的運(yùn)行流程,是Android 當(dāng)中最基本的模塊。每一個頁面需要通過setContentView()指定界面布局。
4.2 百度地圖sdk
百度地圖API是一套應(yīng)用程序接口,為開發(fā)者提供基于百度地圖的各種功能,涵蓋iOS、Andriod、Web服務(wù)等多種版本,提供基本地圖、位置搜索、周邊搜索、公交路線查詢等功能。只需導(dǎo)入百度地圖的sdk即可使用。 景點(diǎn)、路線和用戶數(shù)據(jù)存儲在云服務(wù)器端,云服務(wù)器鏈接mysql云數(shù)據(jù)庫存儲數(shù)據(jù)。景點(diǎn)的初始信息一部分手動導(dǎo)入,一部分通過爬蟲獲取以后存儲在服務(wù)器端,供App調(diào)用。
4.3 spring boot
Spring框架是Java平臺上的一種開源應(yīng)用框架,而SpringBoot 是大量開發(fā)框架的整合,它簡化了Spring大部分的繁雜配置工作[3]。SpringBoot的整合解決了依賴包之間的沖突和不可靠性等問題。大大簡化了開發(fā)人員在后端開發(fā)的難度,支持jar項(xiàng)目打包方式,可以實(shí)現(xiàn)項(xiàng)目快速部署。Springboot的總體框架如圖1所示。
實(shí)體層(entity)主要用于和數(shù)據(jù)庫對象相對應(yīng)的屬性,需要有set/get方法,無參和有參的構(gòu)造函數(shù)??刂茖樱╟ontroller)實(shí)現(xiàn)具體的模塊流程控制,主要是調(diào)用service層內(nèi)的接口實(shí)現(xiàn),負(fù)責(zé)從前端接受請求。業(yè)務(wù)層(service)和持久層(dao)一樣都是先設(shè)計(jì)接口,再創(chuàng)建要實(shí)現(xiàn)的類,然后在配置文件中進(jìn)行配置其實(shí)現(xiàn)的關(guān)聯(lián)[4]。接下來就可以在service層調(diào)用接口進(jìn)行業(yè)務(wù)邏輯應(yīng)用的處理。封裝Service層的業(yè)務(wù)邏輯有利于業(yè)務(wù)邏輯的獨(dú)立性和重復(fù)利用性。持久層與數(shù)據(jù)庫進(jìn)行聯(lián)系,持久層的數(shù)據(jù)源和數(shù)據(jù)庫連接的參數(shù)都是在配置文件中進(jìn)行配置的。
YAML是一種基于Unicode容易閱讀,容易和腳本語言交互的,用來表達(dá)資料序列的編程語言。文件后綴為yml。本項(xiàng)目使用application.yml作為配置文件,相較于application.properties,YAML文件具有樹狀結(jié)構(gòu)以及更易于理解的特點(diǎn)。此外,YAML還具有編程語言可移植性的優(yōu)點(diǎn)。
在本項(xiàng)目內(nèi),controller層調(diào)用了Service層的方法,Service層調(diào)用Dao層的方法,其中調(diào)用的參數(shù)是使用Entity層進(jìn)行傳遞的。
5 數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)
系統(tǒng)的數(shù)據(jù)庫設(shè)計(jì)有三個表,分別是用戶信息表(表1),景點(diǎn)數(shù)據(jù)表(表2)和公共交通路程時間矩陣表(表3)。景點(diǎn)類型存儲在景點(diǎn)數(shù)據(jù)表的type列中,所有景點(diǎn)一共分為6種類型,分別是博物館,文物古跡,公園,游樂園,風(fēng)景區(qū)和其他。
6 Android應(yīng)用程序設(shè)計(jì)
本系統(tǒng)的總體框架如下:springboot作為服務(wù)端,提供數(shù)據(jù)庫查詢和數(shù)據(jù)返回功能。Android應(yīng)用提供客戶端服務(wù)。
服務(wù)端使用Maven 對項(xiàng)目進(jìn)行構(gòu)建、依賴管理。dao層(data access object)使用Mybatis框架實(shí)現(xiàn),service層和controller層用于后端操作邏輯控制。服務(wù)端主要實(shí)現(xiàn)數(shù)據(jù)庫的維護(hù)工作。