stop is left
This commit is contained in:
parent
52a1e4f691
commit
ef1095438e
Binary file not shown.
After Width: | Height: | Size: 8.6 KiB |
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 6.2 KiB |
|
@ -1,6 +1,6 @@
|
|||
17栋,18-3,1
|
||||
601食堂,9-3,1
|
||||
轻食,16-1,11
|
||||
轻食,16-1,1
|
||||
超市,14-1,1
|
||||
102教学楼,9-6,2
|
||||
101教学楼,9-6,2
|
||||
|
|
|
BIN
map.jpg
BIN
map.jpg
Binary file not shown.
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
Binary file not shown.
After Width: | Height: | Size: 7.7 KiB |
25
report.aux
25
report.aux
|
@ -3,12 +3,21 @@
|
|||
\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}实验要求}{1}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}实验环境}{1}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {2}实验过程}{1}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}建模}{1}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces 地形数据}}{1}}
|
||||
\newlabel{knn}{{1}{1}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces 地图模型}}{2}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}数据渲染}{1}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces 数据渲染过程}}{2}}
|
||||
\newlabel{draw_map}{{1}{2}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces 地形数据}}{2}}
|
||||
\newlabel{knn}{{2}{2}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}两点间最短路径}{2}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}求解}{3}}
|
||||
\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces 利用欧几里得距离得到的结果}}{3}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3}实验总结}{3}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces 地图模型}}{3}}
|
||||
\newlabel{knn}{{3}{3}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}最短路径}{3}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces 路径起始点输入框}}{4}}
|
||||
\newlabel{btn_path}{{4}{4}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {5}{\ignorespaces 最短路径处理流程图}}{4}}
|
||||
\newlabel{sp}{{5}{4}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}线路规划}{5}}
|
||||
\newlabel{linedis}{{2.3}{6}}
|
||||
\newlabel{linedis}{{2.3}{6}}
|
||||
\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces 利用欧几里得距离得到的结果}}{6}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3}实验过程}{7}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {4}实验总结}{7}}
|
||||
|
|
46
report.log
46
report.log
|
@ -1,4 +1,4 @@
|
|||
This is XeTeX, Version 3.14159265-2.6-0.99991 (TeX Live 2014/W32TeX) (preloaded format=xelatex 2016.5.31) 7 JUL 2016 00:42
|
||||
This is XeTeX, Version 3.14159265-2.6-0.99991 (TeX Live 2014/W32TeX) (preloaded format=xelatex 2016.5.31) 7 JUL 2016 19:03
|
||||
entering extended mode
|
||||
restricted \write18 enabled.
|
||||
%&-line parsing enabled.
|
||||
|
@ -1230,8 +1230,12 @@ LaTeX Font Info: External font `cmex10' loaded for size
|
|||
LaTeX Font Warning: Font shape `EU1/STSong(0)/bx/n' undefined
|
||||
(Font) using `EU1/STSong(0)/m/n' instead on input line 45.
|
||||
|
||||
File: csv.jpg Graphic file (type QTm)
|
||||
<use "csv.jpg" >
|
||||
File: draw_map.jpg Graphic file (type QTm)
|
||||
<use "draw_map.jpg" >
|
||||
Overfull \hbox (28.45273pt too wide) in paragraph at lines 74--75
|
||||
[][]
|
||||
[]
|
||||
|
||||
|
||||
Package Fancyhdr Warning: \headheight is too small (12.0pt):
|
||||
Make it at least 14.49998pt.
|
||||
|
@ -1239,19 +1243,33 @@ Package Fancyhdr Warning: \headheight is too small (12.0pt):
|
|||
This may cause the page layout to be inconsistent, however.
|
||||
|
||||
[1]
|
||||
File: csv.jpg Graphic file (type QTm)
|
||||
<use "csv.jpg" > [2]
|
||||
File: map.jpg Graphic file (type QTm)
|
||||
<use "map.jpg" >
|
||||
Overfull \hbox (28.45273pt too wide) in paragraph at lines 75--76
|
||||
Overfull \hbox (28.45273pt too wide) in paragraph at lines 96--97
|
||||
[][]
|
||||
[]
|
||||
|
||||
[3]
|
||||
File: btn_path.jpg Graphic file (type QTm)
|
||||
<use "btn_path.jpg" >
|
||||
File: sp.jpg Graphic file (type QTm)
|
||||
<use "sp.jpg" > [4]
|
||||
File: line_dis.jpg Graphic file (type QTm)
|
||||
<use "line_dis.jpg" >
|
||||
|
||||
LaTeX Warning: `!h' float specifier changed to `!ht'.
|
||||
|
||||
File: min_dis.jpg Graphic file (type QTm)
|
||||
<use "min_dis.jpg" >
|
||||
LaTeX Font Info: External font `cmex10' loaded for size
|
||||
(Font) <12> on input line 93.
|
||||
(Font) <12> on input line 164.
|
||||
LaTeX Font Info: External font `cmex10' loaded for size
|
||||
(Font) <8> on input line 93.
|
||||
(Font) <8> on input line 164.
|
||||
LaTeX Font Info: External font `cmex10' loaded for size
|
||||
(Font) <6> on input line 93.
|
||||
[2] [3] (./report.aux)
|
||||
(Font) <6> on input line 164.
|
||||
[5] [6] [7] (./report.aux)
|
||||
|
||||
LaTeX Font Warning: Some font shapes were not available, defaults substituted.
|
||||
|
||||
|
@ -1260,12 +1278,12 @@ LaTeX Warning: There were multiply-defined labels.
|
|||
|
||||
)
|
||||
Here is how much of TeX's memory you used:
|
||||
19532 strings out of 493734
|
||||
389856 string characters out of 6144398
|
||||
443354 words of memory out of 5000000
|
||||
22711 multiletter control sequences out of 15000+600000
|
||||
19594 strings out of 493734
|
||||
392981 string characters out of 6144398
|
||||
462378 words of memory out of 5000000
|
||||
22769 multiletter control sequences out of 15000+600000
|
||||
7481 words of font info for 50 fonts, out of 8000000 for 9000
|
||||
1328 hyphenation exceptions out of 8191
|
||||
52i,11n,58p,10438b,420s stack positions out of 5000i,500n,10000p,200000b,80000s
|
||||
52i,11n,58p,10438b,514s stack positions out of 5000i,500n,10000p,200000b,80000s
|
||||
|
||||
Output written on report.pdf (4 pages).
|
||||
Output written on report.pdf (8 pages).
|
||||
|
|
BIN
report.pdf
BIN
report.pdf
Binary file not shown.
Binary file not shown.
96
report.tex
96
report.tex
|
@ -44,17 +44,39 @@
|
|||
|
||||
\section{实验内容}
|
||||
\subsection{实验要求}
|
||||
运用人工智能课程涉及到的算法,求解交通规划问题。给定一个新的地理区域,能够以图形化方式展示该区域的地形和各种建筑物等分布;其次,能够利用相关算法求解两个地点之间的最短路径,同时以图形化方式展示出来。最后,能够对该区域进行道路规划。
|
||||
运用人工智能课程涉及到的算法,求解交通规划问题。在本次实验中我实现了以下的功能:
|
||||
\begin{itemize}
|
||||
\item 数据渲染:给定一个新的地理区域,能够识别各种地形,并且以图形化方式展示该区域的地形和各种建筑物等分布。
|
||||
|
||||
\item 最短路径:给定区域内的任意两个地点,能够利用相关算法求解两个地点之间的最短路径,同时以图形化方式展示出来。
|
||||
|
||||
\item 道路规划:按照实际交通要求对该区域进行道路规划,为该区域内指定的各个地点提供优质交通服务。
|
||||
|
||||
\item 站点规划:在规划得到的交通线路上,能够根据相关要求和约束对公交站点进行合理的规划。
|
||||
\end{itemize}
|
||||
|
||||
\subsection{实验环境}
|
||||
利用Python实现规划算法,通过Python自带图形工具包Tkinter对实验数据构建的模型以及解决方案进行可视化。
|
||||
实验中使用的地图数据是我根据科大校园地理环境自行绘制的,主要包括我平时经常涉及到的一些场所,集中体现在跨线桥以北以及东门,有些地方为了方便处理做了相应的调整,但大体上和实际环境是差不多的。
|
||||
|
||||
在相关具体实现中,我选择Python实现具体算法,通过Python自带图形工具包Tkinter对实验数据构建的模型以及解决方案进行可视化。
|
||||
|
||||
\section{实验过程}
|
||||
|
||||
|
||||
\subsection{建模}
|
||||
\subsection{数据渲染}
|
||||
|
||||
本次实验以科大校园的地理环境为基础,地形数据我是以CSV的形式输入的,规模是23*18的矩阵,如下图所示,涉及的元素有0 - 围墙,1 - 道路,2 - 建筑物,3 - 训练场,4 - 大门,5 - 草坪/操场,6 - 其他非道路区域。在这些元素中,只有道路是可以通过的,其他都可以看做"障碍物"。
|
||||
如前所述,我的地图数据是根据科大校园的地理环境绘制的,生成过程为:先在Excel表格中进行模拟绘制,最小单位是一个单元格;把绘制的地图数据导成CSV格式的;最后程序的输入就是该CSV文件。
|
||||
|
||||
|
||||
数据渲染首先从文件中加载数据,然后调用Tkinter进行绘制,其中的关键点是画布与地图数据的动态协调:能够根据数据规模动态地协调各元素的表示位置和尺寸。其具体过程如下图所示。
|
||||
\begin{figure}[h!]
|
||||
\centering
|
||||
\includegraphics[width=18cm]{draw_map.jpg}
|
||||
\caption{数据渲染过程}
|
||||
\label{draw_map}
|
||||
\end{figure}
|
||||
|
||||
地图数据是一个规模为23*18的矩阵,如下图所示。其中元素点的含义:0 - 围墙,1 - 道路,2 - 建筑物,3 - 训练场,4 - 大门,5 - 草坪/操场,6 - 其他非道路区域。在这些元素中,只有道路是可以通过的,其他都可以看做"障碍物",不可通行。
|
||||
|
||||
\begin{figure}[h!]
|
||||
\centering
|
||||
|
@ -63,11 +85,6 @@
|
|||
\label{knn}
|
||||
\end{figure}
|
||||
|
||||
数据加载过程为:
|
||||
\begin{python}
|
||||
|
||||
|
||||
\end{python}
|
||||
另外,为了更好的显示的显示部分建筑物以及更直观的可视化,我还对大部分的建筑物做了标记,这些数据也是存放在csv文件中,格式是<名称,坐标>。其中为了简化处理过程,还做了如下的假设:
|
||||
\begin{itemize}
|
||||
\item 为便于定位和识别建筑物,我标记了一些建筑物用来做测试,这些建筑物假设只占一个格子,这样方便判断和确定其位置。如果一个建筑物占据了多个格子,那在确认它的时候需要做一些额外的繁琐的判断,但是对于基本的核心算法是没有影响的,因此在这里做了个一个简化性的假设。
|
||||
|
@ -81,14 +98,71 @@
|
|||
\label{knn}
|
||||
\end{figure}
|
||||
|
||||
|
||||
|
||||
\subsection{最短路径}
|
||||
本次试验支持搜寻两点之间的最短路径,具体求解过程用到了A*算法。
|
||||
在求解区域内两个建筑物间最短路径的问题中,我应用了A*算法。算法的大题思路是参考的教科书上的过程,只不过在具体实现中有很多的细节和优化的地方需要考虑而已。
|
||||
|
||||
在该模型中,最短路径问题可形式化为:
|
||||
\begin{itemize}
|
||||
\item 初始状态为“起始节点”,目标状态是“终止节点”,地图中每一个道路节点都可以看做是一个状态,其它元素节点不会出现在最后的路径中出现,但是会影响状态的可用动作集合;
|
||||
\item 在某一个状态可用的动作集合我定义为{“上”、“下”、“左”、“右”},也就是某个节点上下左右相邻的四个方向,但是如果该方向有前面定义的“障碍物”的话,此方向便不可通过;
|
||||
\item 路径代价设置的是每移动一个方格耗费一个单元的值。
|
||||
\end{itemize}
|
||||
|
||||
为了方便交互,我在界面中添加了文本框用以输入起始点和终止点,其次我在程序中做了转换,因此输入的数据直接是建筑物名字即可,对照着图形中的标注,可以很方便的进行测试。
|
||||
\begin{figure}[h!]
|
||||
\centering
|
||||
\includegraphics[width=8cm]{btn_path.jpg}
|
||||
\caption{路径起始点输入框}
|
||||
\label{btn_path}
|
||||
\end{figure}
|
||||
|
||||
在输入起始节点和终止节点之后,算法的处理流程如下所示。
|
||||
\begin{figure}[h!]
|
||||
\centering
|
||||
\includegraphics[width=10cm]{sp.jpg}
|
||||
\caption{最短路径处理流程图}
|
||||
\label{sp}
|
||||
\end{figure}
|
||||
为了清晰表达大致思路,在该流程中有一些子过程pop\_frontier、get\_neighbors和get\_solution等没有画出,他们的作用为:
|
||||
\begin{itemize}
|
||||
\item pop\_frontier:用于在frontiers里面选择一个进行判断和扩展,在该函数中会利用f(n) = g(n) + h(n)对节点进行评估,g(n)就是从初始节点到当前节点的路径代价,由前面模型的形式化可知g(n)也是走过的方格数,因此再展开新的frontier时直接递增即可;而对于启发函数h(n)来说,它的选择比较重要,常见的有欧几里得距离也就是直线距离,或者曼哈顿距离。在本实验中,这两种方法我都试过了,在我试的几个测试用例中,它们俩的表现是相同的,没有发现有太大的差别。
|
||||
\item get\_neighbors函数用于获取一个节点的相邻接点,这与模型规定的可用动作是一致的,它做的主要判断有两类:是否是合法的节点,也就是是否超过了给定的地图边界;其次是该节点是否是有效节点,有效节点是那些道路所处的节点,其它的节点不能出现在路径中。
|
||||
\item get\_solution是为了获得解的路径,因此我对每个节点对应一个father指针,它指向展开它的节点,也就是最后路径上处于它上一个的节点。因此这个函数利用链表倒序就可以把解路径求出。
|
||||
\end{itemize}
|
||||
|
||||
具体的测试会在实验结果中给出。
|
||||
|
||||
\subsection{线路规划}
|
||||
现在设想这样一种场景:为了方便师生在校园内的交通,现在想要开辟一个环校线路提供校车服务。在前面章节地图中标出的地点表明是主要地点,该线路应该尽可能使得这些地点的师生方便乘车,其次图书馆和北门是必须要经过的,因为这两个地方人流量是最大的。现在先不考虑站点停靠,可以先考虑成招手上车、随时停车,站点规划问题会在下一节中考虑。由上可得该线路的目标有:
|
||||
\begin{itemize}
|
||||
\item 路径长度短:从实际情况出发,该目标也是现实的,规划的路线越短越经济,效益越高。
|
||||
\item 方便人们上车:地图中指定的地点都是分散的,规划出的线路要使各个地方的人们上车距离尽可能小,使人们不要走太长的路就能走到该线路上等车或者乘车。
|
||||
\item 考虑人群量:另外还要考虑一个因素,那就是这些地方的人群量是不同的,有些地方人数较多,线路就应该忘这些地方倾斜,满足更多人的需求,也使得线路的吞吐量大一些。
|
||||
\end{itemize}
|
||||
|
||||
cache 优化
|
||||
通过分析该问题可以理解为:寻找一条路径使得地图中各点到该路线的加权距离越小越好,并且该路径越短越好。另外,要求必须通过图书馆和北门,因此可以使这个问题分为两部分来规划,其实这也是我为了简化问题故意设定的场景。对处于图书馆和北门之上和之下的建筑分别规划出同样目的的路径,因为这两条路径的起始点和终止点是重叠的,所以最后可以连成一条路径,通过用这样的分治法先规划出子问题来解决复杂的问题。
|
||||
|
||||
由以上需求,结合A*算法,其f(n) = g(n) + h(n)中的g(n)和求最短路径一样,还是起始节点到当前节点的路径长度。而h(n)就需要好好设计了。一开始我是算的各个地点到当前节点的直线距离然后配上其人群量权重,h(n)是这样计算的:\\
|
||||
\begin{figure}[h!]
|
||||
\centering
|
||||
\includegraphics[width=8cm]{line_dis.jpg}
|
||||
\label{linedis}
|
||||
\end{figure}
|
||||
|
||||
其中p是对需要规划的所有地点进行遍历,w是其对应的人群量的权重,该值越大说明该地点人数越多。由这种方式规划出来的效果非常不好,后来我分析,不能计算地点到当前节点的距离,如果路径已经规划出一部分了,那么应该计算地点到该路径,也就是从起始点到当前节点的这段路上,其最短距离才对。因为如果一个地点到该路径的最短距离不是当前节点,而是其之前的某一个节点,则该地点不应该影响对这个节点的选择才对。因此此时的h(n)是这样的:\\
|
||||
\begin{figure}[h!]
|
||||
\centering
|
||||
\includegraphics[width=8cm]{min_dis.jpg}
|
||||
\label{linedis}
|
||||
\end{figure}
|
||||
path(p)表示从起始节点到当前节点的路径,min\_dis(a,p)指p到路径a上最短距离。通过这种方式后,效果比之前的要好了一些,但是对于一些地点它还是会处理的不好,比如对于位于底部的博餐来说,如果距离函数用的还是直线距离,那么当算法走到位于其左上角的丁字路口时,无论是直走还是右拐,其值不变,但是对于其他值来说右拐似乎更好,因此路径就会被诱导的右拐了,即使博餐的人群量再大,在这个路口也不会直走。因此我就想着如何规避这个陷阱 ,最后决定用A*算法算出的最短路径来代替直线距离,这样的h(n)更能反映真实的距离。这样一来这个算法有点贪心算法的性质,并且直观上讲起效率有点低下。在这里我进行了优化,利用动态规划后的思想对地点到路径节点的最短路径值进行缓存,这样的做法大大的提高了效率,实验对比会在实验结果中给出。
|
||||
|
||||
|
||||
\subsection{站点规划}
|
||||
为更有效的运行该线路,可以在上一节得到的线路中,对其设置一些校车停靠点,
|
||||
\section{实验结果}
|
||||
\begin{table}[!h]
|
||||
\renewcommand\arraystretch{1.1}
|
||||
\centering
|
||||
|
|
Loading…
Reference in New Issue