An open API service indexing awesome lists of open source software.

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.

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进行一些数据对接以实现动态渲染视图。


类图


路网结构相关



出租车系统



请求



系统设定


路网



  • 路网横纵坐标编号均从079

  • 相邻点之间的连接状况


出租车


编号



  • 出租车编号从1100


状态




  • 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的矩阵,包含数字012对应意义参见路口状态的设定


信号灯采用单独文件输入,而不是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只允许设置为FREESTOPPEDSTOPPED将休止后继续恢复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-serviceGOING_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辆车全部进入待命状态),接下来各个车重新计算的时间点将被分散到(2 3 4 5 6五个时间点上,之后也将大致呈现均匀分布。故同一时间的计算压力将减少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都没有过才叫寂寞呢