https://github.com/hansbug/2018_spring_16061104_10
本科阶段写的沙雕代码 / A piece of BULLSHIT which you call it code, written in my undergraduate stage.
https://github.com/hansbug/2018_spring_16061104_10
Last synced: 11 months ago
JSON representation
本科阶段写的沙雕代码 / A piece of BULLSHIT which you call it code, written in my undergraduate stage.
- Host: GitHub
- URL: https://github.com/hansbug/2018_spring_16061104_10
- Owner: HansBug
- Created: 2022-02-02T07:36:41.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2022-02-02T07:56:55.000Z (over 4 years ago)
- Last Synced: 2025-05-21T14:17:42.949Z (about 1 year ago)
- Language: Java
- Size: 585 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.html
Awesome Lists containing this project
README
README
/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) */
/* Author: Nicolas Hery - http://nicolashery.com */
/* Version: b13fe65ca28d2e568c6ed5d7f06581183df8f2ff */
/* Source: https://github.com/nicolahery/markdownpad-github */
/* RESET
=============================================================================*/
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
}
/* BODY
=============================================================================*/
body {
font-family: Helvetica, arial, freesans, clean, sans-serif;
font-size: 14px;
line-height: 1.6;
color: #333;
background-color: #fff;
padding: 20px;
max-width: 960px;
margin: 0 auto;
}
body>*:first-child {
margin-top: 0 !important;
}
body>*:last-child {
margin-bottom: 0 !important;
}
/* BLOCKS
=============================================================================*/
p, blockquote, ul, ol, dl, table, pre {
margin: 15px 0;
}
/* HEADERS
=============================================================================*/
h1, h2, h3, h4, h5, h6 {
margin: 20px 0 10px;
padding: 0;
font-weight: bold;
-webkit-font-smoothing: antialiased;
}
h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code, h5 tt, h5 code, h6 tt, h6 code {
font-size: inherit;
}
h1 {
font-size: 28px;
color: #000;
}
h2 {
font-size: 24px;
border-bottom: 1px solid #ccc;
color: #000;
}
h3 {
font-size: 18px;
}
h4 {
font-size: 16px;
}
h5 {
font-size: 14px;
}
h6 {
color: #777;
font-size: 14px;
}
body>h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child {
margin-top: 0;
padding-top: 0;
}
a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
margin-top: 0;
padding-top: 0;
}
h1+p, h2+p, h3+p, h4+p, h5+p, h6+p {
margin-top: 10px;
}
/* LINKS
=============================================================================*/
a {
color: #4183C4;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* LISTS
=============================================================================*/
ul, ol {
padding-left: 30px;
}
ul li > :first-child,
ol li > :first-child,
ul li ul:first-of-type,
ol li ol:first-of-type,
ul li ol:first-of-type,
ol li ul:first-of-type {
margin-top: 0px;
}
ul ul, ul ol, ol ol, ol ul {
margin-bottom: 0;
}
dl {
padding: 0;
}
dl dt {
font-size: 14px;
font-weight: bold;
font-style: italic;
padding: 0;
margin: 15px 0 5px;
}
dl dt:first-child {
padding: 0;
}
dl dt>:first-child {
margin-top: 0px;
}
dl dt>:last-child {
margin-bottom: 0px;
}
dl dd {
margin: 0 0 15px;
padding: 0 15px;
}
dl dd>:first-child {
margin-top: 0px;
}
dl dd>:last-child {
margin-bottom: 0px;
}
/* CODE
=============================================================================*/
pre, code, tt {
font-size: 12px;
font-family: Consolas, "Liberation Mono", Courier, monospace;
}
code, tt {
margin: 0 0px;
padding: 0px 0px;
white-space: nowrap;
border: 1px solid #eaeaea;
background-color: #f8f8f8;
border-radius: 3px;
}
pre>code {
margin: 0;
padding: 0;
white-space: pre;
border: none;
background: transparent;
}
pre {
background-color: #f8f8f8;
border: 1px solid #ccc;
font-size: 13px;
line-height: 19px;
overflow: auto;
padding: 6px 10px;
border-radius: 3px;
}
pre code, pre tt {
background-color: transparent;
border: none;
}
kbd {
-moz-border-bottom-colors: none;
-moz-border-left-colors: none;
-moz-border-right-colors: none;
-moz-border-top-colors: none;
background-color: #DDDDDD;
background-image: linear-gradient(#F1F1F1, #DDDDDD);
background-repeat: repeat-x;
border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD;
border-image: none;
border-radius: 2px 2px 2px 2px;
border-style: solid;
border-width: 1px;
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
line-height: 10px;
padding: 1px 4px;
}
/* QUOTES
=============================================================================*/
blockquote {
border-left: 4px solid #DDD;
padding: 0 15px;
color: #777;
}
blockquote>:first-child {
margin-top: 0px;
}
blockquote>:last-child {
margin-bottom: 0px;
}
/* HORIZONTAL RULES
=============================================================================*/
hr {
clear: both;
margin: 15px 0;
height: 0px;
overflow: hidden;
border: none;
background: transparent;
border-bottom: 4px solid #ddd;
padding: 0;
}
/* TABLES
=============================================================================*/
table th {
font-weight: bold;
}
table th, table td {
border: 1px solid #ccc;
padding: 6px 13px;
}
table tr {
border-top: 1px solid #ccc;
background-color: #fff;
}
table tr:nth-child(2n) {
background-color: #f8f8f8;
}
/* IMAGES
=============================================================================*/
img {
max-width: 100%
}
OO第十次作业README
嘛。。以后要拿中文写文档了呢
运行环境
- java 1.8.0_112
- javac 1.8.0_112
- git 2.7.4
- 编写者操作系统 Windows 10 Professional
- 基本硬件配置 4core i7 CPU, 8G RAM
需求分析与设计
需求
- 模拟一个出租车系统
- 出租车按照指定的模式自行行进
- 出租车调度中心按照指定的模式进行分配调度
- 支持通过控制台(或者其他形式)状态访问等操作
- 配合GUI详细展示整个动态效果
架构布置
路网(FlowMap)
- 路网仅用于存储程序所使用的路网的拓扑结构信息。
- 路网支持节点和边的一些相关查询(边存在性,点相关的边等)。
- 路网对象提供路网结构数据导出接口(用于给GUI组件快速提供路网结构数据)。
- 【新增】支持流量信息对外查询
- 支持最短路计算(内置进了该部分)
- 支持道路增删
流量处理单元(MapFlow)
- 支持流量累积统计
- 支持上一个时间单元流量查询
- 通过外部定时器支持定时切换时间片
出租车(Taxi)
- 出租车为出租车动作模拟的基本单位,只负责单个出租车本身的行为模拟。
- 可以查询出租车各项指标和状态。
- 当位置和状态发生改变时,可以通过事件机制实时触发自定义动作。
- 可以进行请求任务的分配,且带有线程安全保护措施。
出租车调度系统(TaxiSystem)
- 出租车调度系统负责从外部接受用户请求,并按照规定的策略尝试分配给出租车。
- 出租车调度系统根据出租车所提供的事件机制,监测出租车的变化,并提供相关的查询服务。
- 出租车调度系统需要能跟GUI进行一些数据对接以实现动态渲染视图。
类图
路网结构相关

出租车系统

请求

系统设定
路网
- 路网横纵坐标编号均从
0到79。 - 相邻点之间的连接状况
出租车
编号
- 出租车编号从
1到100
状态
-
FREE 自由状态,可以接收服务请求。 -
GOING_TO_SERVICE 等待服务状态,该车正在赶往乘客位置(到达位置后等待的1s内也处于这一状态)。 -
IN_SERVICE 服务状态,该车正在载着乘客赶往目的地。 -
STOPPED 停止状态,到达目的地后或随机行进20s后的1s修整时处于这一状态。
方向
-
UP 向上,行为为x -= 1 -
DOWN 向下,行为为x += 1 -
LEFT 向左,行为为y -= 1 -
RIGHT 向右,行为为y += 1
红绿灯
-
RED 红灯 -
GREEN 绿灯
路口状态
-
NONE 无红绿灯(对应值0) -
EAST_WEST 东西向绿灯(对应值1) -
NORTH_SOUTH 南北向绿灯(对应值2)
使用
地图输入
格式参见指导书,文件名map.txt。
地图仍采用单独文件输入,而不是load_file输入
信号灯输入
格式参见指导书,文件名traffic.txt。
格式为80x80的矩阵,包含数字0、1、2(对应意义参见路口状态的设定)
信号灯采用单独文件输入,而不是load_file输入
此外:
- 如果信号灯输入文件格式有异常,将在控制台上进行反馈
- 如果有异常,将跳过这一块直接继续执行接下来的程序,且视为所有路口均无信号灯(保证操作原子性)。
load_file输入
- 在程序的一开始,基础数据加载完毕后,可以输入一条
load_file指令 - 格式为
load_file <filename>,例如load_file 1.txt表示加载1.txt(绝对路径相对路径均支持) -
load_file指令不输入或者格式错误(在控制台上有操作反馈),除了不会加载文件内数据外,不影响程序继续执行。
load_file文件内格式
-
No.<id> <status> <credit> <position>表示将第id号出租车,状态设置为status,信用度设置为credit,位置设置为position,其中:-
id需要保证合法,即0~99 - 为了避免"滴滴打鬼"情况出现,本命令中
status只允许设置为FREE和STOPPED(STOPPED将休止后继续恢复FREE状态) -
credit请在Integer范围内(其实可以设置为负数) -
position请确保合法
-
-
No.<id> <status> <request>,表示将第id号出租车,状态设置为status,且当前单子设置为request,其中:-
id需要保证合法,即0~99 -
status四种状态均可(由于一并设置了当前订单,故不会出现"滴滴打鬼"现象,可以较好模拟中间情况) -
request即为一般的出租车请求格式,代表当前处理的订单
-
- 一般的出租车请求格式(具体格式见demo或者下文)
load_file demo
以上请求的样例如下:
No.1 FREE 0 (1, 1)
No.2 FREE 0 (1, 1)
No.3 IN_SERVICE 0 (1, 1)
No.99 FREE 0 (70, 79)
No.98 FREE 0 (1, 1)No.99 GOING_TO_SERVICE [CR, (1, 2), (70, 72)]
No.98 IN_SERVICE [CR, (1, 2), (39, 79)]
[CR, (1, 2), (70, 72)]
[CR, (1, 3), (70, 71)]
[CR, (1, 4), (70, 70)]
[CR, (1, 5), (70, 69)]
[CR, (1, 6), (70, 88)]
其中:
* No.3 IN_SERVICE 0 (1, 1)为非法指令,解析失败
* ``(空行)为非法指令,解析失败
* [CR, (1, 6), (70, 88)]为非法指令,解析失败
注意:
- 在进行读入的时候,成功读入的语句会在控制台上有反馈输出(即识别失败的语句将不会有输出,可以据此判定某行是否解析成功)
- 如果多条指令之间存在矛盾的话,以后面的为准(相关请求执行方式为顺序执行,故后面的同类请求会覆盖前面的请求)
- 在
load_file文件中出现的出租车请求将会在系统start之后一并投入系统参与计算。
控制台输入
- 输入格式如
[CR, (x0, y0), (x1, y1)]的指令(支持带空格),表示向出租车系统发出从(x0, y0)去(x1, y1)的请求。(即一般的出租车请求格式) - 输入格式如
query_taxi <taxi_id>的指令,表示查询编号为taxi_id的出租车。例如:query_taxi 23将查询23号出租车当前信息。 - 输入格式如
query_taxi_by_status <taxi_status>的指令,表示查询状态为taxi_status的出租车,例如:query_taxi_by_status GOING_TO_SERVICE表示查询GOING_TO_SERVICE状态的出租车。其中<taxi_status>部分大小写不敏感,且_可以替换为-(即going-to-service与GOING_TO_SERVICE等价)。 -
输入格式如set_road (x0, y0) <direction> to <status>的指令,表示将节点(x0, y0)与其指定方向上的对应相邻节点设置为指定的状态。- 其中,
direction为方向值(具体取值见上文) -
其中,status包含两种取值-
CONNECT表示连接这两个点 -
UNCONNECT表示断开这两个点
-
- 其中,可以自由开闭任何相邻节点之间的道路
- 其中 * 4,请测试者保证图的连通性。整个系统运转过程中将不会再次检查图连通性,一旦连通性被破坏,程序虽然不会crash,但是可能出现不可预料的结果。
- 其中,
控制台输出
-
控制台将输出出租车系统内的一些关键事件-
接单状况- 是否成功分配出租车?
- 如果成功分配,出租车编号为多少?
-
出租车运行状况- 出租车到达乘客位置
- 出租车到达乘客目的地
-
-
控制台将针对控制台输入的查询请求作即时回复- 对于
query_taxi,将输出出租车实时的状态信息(编号、信用积累、位置、状态) - 对于
query_taxi_by_status,将输出该状态出租车的查询结果(查询状态、结果数、符合条件的出租车编号) - 对于
set_road,将输出操作是否成功(只要两个点均合法即可成功,无论原先边状态如何)
- 对于
-
各类异常操作信息- 基础数据异常,例如:路网图存在诸如不连通、边越界之类的数据异常
- 指令格式异常,例如:格式未识别的指令
- 指令数据异常,例如:参数越界或者查询结果不存在的指令
日志输出
在日志(文件名log.txt)中,将有较为详细的系统调度信息,可以自行查看日志,此处不再赘述。
GUI
- GUI不使用
4*4区域框 - GUI将详细展示点的运动状态
- GUI将展现出边的开闭状态
其他一些骚操作
路径动态选择策略
按照之前的一些同学讨论,大致分为两派:
- 打算开始时规划路径然后遇到被切断的路径再更新
- 打算一步一更新
这两种方法各有优劣:
- 前者很节约计算资源,但是机动性较差,无法做到实时避开高流量区域,用户体验较差(
可以想象为一个不会实时避开拥堵区域的百度地图导航,显然不可能有人想用这种东西的) - 后者机动性很高,可以做到实时避开拥堵区,但是计算资源消耗严重。尤其是在这样的一个系统中,很多时间单位都有一个最大公因数
500ms,这意味着高并发状态下,每500ms就得应该一波最短路计算高峰。而本人程序在压测下,最短路计算引擎在一秒内大概只能计算300次左右的最短路。这将导致计算资源非常紧张(cpu占用飙升且居高不下)。
于是,基于以上,本人采取了一种较为折中的策略:
- 每次计算最短路后,行进
x步后重新计算路线(x为[2, 6]的随机整数) - 在每次行走的过程中,要是遇到断路,立刻退出循环并重新计算路线
- 直到走到终点为止
这样的做法有以下一些好处:
- 具有一定的机动性(显然)
- 同时节省计算资源(显然)
- 除此之外,由于
x为一个随机数,所以意味着当同一批大量订单下达之后(假设100辆车全部进入待命状态),接下来各个车重新计算的时间点将被分散到(23456五个时间点上,之后也将大致呈现均匀分布。故同一时间的计算压力将减少80%,系统运行将更加平稳)
官方智障GUI
- 官方GUI放置在
shit_like_code包下 - 本人这次对官方GUI包进行了一点小的改动,当一辆车在等待红灯的时候,将会出现紫色圈。
注意事项
- 本程序中除非特殊说明,否则输入的枚举类参数均大小写不敏感,且
-和_等价。 - 除上条之外,本程序中各处格式,除非特殊说明,否则一律大小写敏感。
- 本程序中各处输入格式,除非特殊说明,否则一律支持在元素之间带空格。例如:
[CR,(0, -0),( 1 , 1) ]合法,而[CR, (1 2, 3), (3, 2)]不合法。 - 事件机制本质是基于抽象类+接口的面向接口编程。
- 由于图片和指导书存储在云端,如果本文档图片加载不出来,请连网。
-
detail.txt日志文件配合grep命令食用更佳。(具体:cat detail.txt|grep "Taxi No.xxx"类似这样的;Q:Windows用户怎么办? A:那就人眼看吧,祝你不要看漏哦23333) - 本程序
repOK均使用全局接口ApplicationClassInterface默认实现,除少数类情况特殊进行了重写之外(例如Node类),行为均为判定内部属性(包括私有属性)是否全部不为null(Q:怎么实现的呢?为啥类中找不到repOK? A:自行Google,java interface default,提高姿势水平) 请无视官方gui包的包名。Q: 这明明是真心话啊喵? A: 闭嘴,大实话怎么能瞎说。- Q:jsf啥的怎么办? A:随你咯
,120+个类欢迎慢慢找 - Q:类Overview在哪? A:每个类上头都有javadoc,等价于Overview。
- 看不懂代码?javadoc在此,欢迎找bug,
给个笑容自己体会,找到bug算我输。(Q:那。。河蟹六系怎么办? A:这种东西我才不在乎23333。比起这个,这么多次一个bug都没有过才叫寂寞呢)
