Abstract

Introduction

Topic

The topic of project 5-7 is concurrent elevator simulation. The program read requests from stdin, simulate the elevator system, and print runtime infomation to stdout.

Request

<PersonID>-FROM-<FromLevel>-TO-<ToLevel>

  • On behalf of a pessenger
  • <PersonID> must be unique

Elevator

  • Function

    • Move: Move up or down to next level in <MoveTime>, and print ARRIVE-<Level>-<ElevatorName>
    • Open Door: Open Door in <OpenTime>, and print OPEN-<Level>-<ElevatorName> when begin opening
    • Close Door: Close Door in <CloseTime>, and print CLOSE-<Level>-<ElevatorName> when close finished
    • Pessenger in: Print IN-<PersonID>-<Level>-<ElevatorName>
    • Pessenger out: Print OUT-<PersonID>-<Level>-<ElevatorName>
  • Argument
    • Name
    • Time
      • OpenTime
      • CloseTime
      • MoveTime
    • Level
      • InitialLevel
      • SupLevel
      • InfLevel
      • ApprovedLevel
    • Capacity

Analysis

The major focus is concurrency: The program has to plan and simulate while reading requests, so it has to be concurrent. Thus we have to design a concurrent architechture and guarantee its thread safety.

Also, for multi-elevator scene, we need to design a coordinating thread to coordinate elevators.

The program's function can be classified as follows, and the threads can be designed correspondingly:

Reading Requests

Reading requests in real time, and pass them to coordinating thread.

Coordinating

Get requests from reading thread, set path for the person and pass it to scheduling thread.

Scheduling and controling

Get requests from reading thread, schedule and pass the action of elevator to elevator, and control the movement of passenger.

Elevator simulation

Get command from scheduling thread, open and close door, and go up or down stairs.

Course

This topic has three assignments.

P5-P6

Reading (and coordinating)

  • Read from given input interface
  • Analyse the request, put the person to corresponse location in concurrent two-dimensional map
    • Dimension 1: From level
    • Dimension 2: To level
  • Pass person to scheduling and controling thread through cuncurrent map: ConcurrentHashMap<MapKey, Set<Integer>>

Scheduling and controling

  • Move up and down again and again

    • Take in person whose destination direction is consistent with the elevator
    • Free person who arrived
    • U-turn if there's no person ahead
    • Stop if there's no person anywhere
  • Give command through TransferQueue<Command> to elevator

Elevator simulation

  • Execute command

    • Print information
    • Change level
    • Sleep for given time

P7

Reading and coordinating

  • Read from given input interface
  • Analyse and coordinate
    • If there's a single elevator approved to access both from and to floor

      • The person only have one request: from <FromLevel> to <ToLevel>
    • else
      • Because it takes at most two steps to go from <FromLevel> to <ToLevel>
      • Find the elevator who can access <FromLevel>
      • Find the elevator who can access <ToLevel>
      • Find the level which can be accessed by both elevator
      • The person has two request
        • From <FromLevel> to <TransferLevel>
        • From <TransgerLevel> to <ToLevel>
    • The coordinate algorithm can be refacted to recursive one to support any number of transfers
  • Pass
    • Pass person to scheduling and controling thread through cuncurrent map: ConcurrentHashMap<MapKey, Set<Integer>>
    • The mapkey presents the first request: new MapKey(<FromLevel>, <ToLevel>)
    • The rest requests stored in the person object

Scheduling and controling

  • Move up and down again and again

    • If current level is accessable

      • Take in person

        • Destination direction is consistent with the elevator
        • Destination level is accessable
      • Free person who arrived
        • If the person has rest requests, put him to correspensive location in reqMap, and delete its next request
    • U-turn if there's no person at accessable level ahead
    • Stop if there's no person anywhere
  • Give command through TransferQueue<Command> to elevator

Elevator simulation

  • Execute command

    • Print information
    • Change level
    • Sleep for given time

Class Design

Measurement

Complexity Metric

Method Complexity

Method ev(G) iv(G) v(G)
com.nyan.EleSysTest.main(String[]) 1 1 1
com.nyan.elesys.Commander.Commander(int,String,Integer[],Integer,Integer,Integer,ConcurrentHashMap<MapKey, Set<Person>>,Long,Long,Long) 1 1 1
com.nyan.elesys.Commander.closeDoor() 1 2 2
com.nyan.elesys.Commander.downHave() 3 2 3
com.nyan.elesys.Commander.inDownPsgers() 1 3 3
com.nyan.elesys.Commander.inPsgers(Integer) 4 4 5
com.nyan.elesys.Commander.inUpPsgers() 1 3 3
com.nyan.elesys.Commander.levelHave(int) 5 6 8
com.nyan.elesys.Commander.loop() 7 5 9
com.nyan.elesys.Commander.openDoor() 1 2 2
com.nyan.elesys.Commander.outPsgers() 1 4 4
com.nyan.elesys.Commander.run() 1 4 5
com.nyan.elesys.Commander.upHave() 3 2 3
com.nyan.elesys.Coordinator.Coordinator(ConcurrentHashMap<MapKey, Set<Person>>,Integer[][]) 1 2 2
com.nyan.elesys.Coordinator.run() 12 11 14
com.nyan.elesys.Elevator.Elevator(Long,Long,Long,Integer,String,TransferQueue<Command>) 1 1 1
com.nyan.elesys.Elevator.getLevelNum() 1 1 1
com.nyan.elesys.Elevator.run() 3 7 8
com.nyan.elesys.Level.Level(Integer) 1 1 1
com.nyan.elesys.Level.add(Integer) 1 2 2
com.nyan.elesys.Level.addOne() 1 1 2
com.nyan.elesys.Level.equals(Object) 2 2 2
com.nyan.elesys.Level.getLevelNum() 1 1 1
com.nyan.elesys.Level.sub(Integer) 1 2 2
com.nyan.elesys.Level.subOne() 1 1 2
com.nyan.elesys.Level.toString() 1 1 1
com.nyan.elesys.MapKey.MapKey(Integer,Integer) 1 1 1
com.nyan.elesys.MapKey.equals(Object) 2 3 3
com.nyan.elesys.MapKey.hashCode() 1 1 1
com.nyan.elesys.MapKey.toString() 1 1 1
com.nyan.elesys.Person.Person(Integer) 1 1 1
com.nyan.elesys.Person.addReq(Request) 1 1 1
com.nyan.elesys.Person.compareTo(Person) 1 1 1
com.nyan.elesys.Person.nextReq() 2 1 2
com.nyan.elesys.Person.toString() 1 1 1
com.nyan.elesys.PsgsList.PsgsList(Integer,Integer) 1 2 2
com.nyan.elesys.PsgsList.add(int,Set<Person>) 1 1 1
com.nyan.elesys.PsgsList.get(int) 1 1 1
com.nyan.elesys.PsgsList.getTotal() 1 2 2
com.nyan.elesys.PsgsList.isEmpty() 3 3 4
com.nyan.elesys.Request.Request(Integer,Integer) 1 1 1
com.nyan.elesys.Request.getFromLevel() 1 1 1
com.nyan.elesys.Request.getToLevel() 1 1 1

Class Complexity

Class OCavg WMC
com.nyan.EleSysTest 1 1
com.nyan.elesys.Command n/a 0
com.nyan.elesys.Commander 3.33 40
com.nyan.elesys.Coordinator 7 14
com.nyan.elesys.Elevator 3 9
com.nyan.elesys.Level 1.62 13
com.nyan.elesys.MapKey 1.25 5
com.nyan.elesys.Person 1.2 6
com.nyan.elesys.PsgsList 1.8 9
com.nyan.elesys.Request 1 3

Package Complexity

Package v(G)avg v(G)tot
com.nyan 1 1
com.nyan.elesys 2.67 112

Module Complexity

Module v(G)avg v(G)tot
P7Project 2.63 113

Project Complexity

Project v(G)avg v(G)tot
project 2.63 113

Bug Review

Level movement step

Door movement time

Test Strategy

Concurrent Knowledge

Acknowledge

Reference

BUAAOO P5-P7 Elevator Simulation的更多相关文章

  1. hdu分类 Dynamic Programming(这是一场漫长的旅途)

    下面是difficulty 1的题 1003   Max Sum 最长递增子序列.非常经典,最棒的解法是在线算法O(n)的复杂度. 贴的呢,是用dp做的代码. 先是一个高亮的dp递推式,然后找到最大处 ...

  2. [android]亲自破解Flappy Bird(去广告+永生)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3544785.html  听说最近Flappy Bird很火,但 ...

  3. BZOJ3679 : 数字之积

    设f[i][p2][p3][p5][p7][j][k]表示前i位,2,3,5,7的次数,前i位是否等于x,是否有数字的方案数 然后数位DP即可,ans=cal(r)-cal(l) #include&l ...

  4. ADF_Starting系列1_JDeveloper IDE开发环境简介

    2013-05-01 Created By BaoXinjian

  5. SOA_环境安装系列3_Oracle Weblogic安装和环境搭建(案例)

    2014-01-03 Created By BaoXinjian

  6. WLS_Oracle Weblogic安装和环境搭建(案例)

    2014-01-03 Created By BaoXinjian

  7. mysql颠覆实战笔记(一)--设计一个项目需求,灌入一万数据先

    版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...

  8. poj3307

    可以证明,每个符合的数都由2,3,5,7相乘得到. 依据猜想:下一个出现的数是由前面某个数乘上这几个数之一得到的新的数. 假设之前的数均满足序列,则因为下一个数必有2,3,5,7相乘得到,而这个数之前 ...

  9. springmvc(六)——视图和视图解析器

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoIAAAGrCAIAAADb2WEhAAAgAElEQVR4nOzdaVhTd78vfF8/z772c9 ...

随机推荐

  1. 关于隐式创建vue实例实现简化弹出框组件显示步骤

    我们在使用vue写alert组件的时候,经常是定义了一个alert.vue,然后引入alert.vue,然后配置参数等等,非常繁琐,那有没有一种方式可以像window.alert("内容&q ...

  2. redis 高可用

    Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实 ...

  3. Robot Framework--ride使用说明2

    RIDE创建项目 1.创建项目 1.1File->New Project 注:选择directory原因是,在directory的项目下可以创建测试套件,如果是tpye为file,则只能创建测试 ...

  4. 15、TypeScript-函数

    1.参数和返回值可以指定类型 2.可选参数:在参数上加上?,表示可选的,可传可不传 3.默认参数:如果你不传参数,默认为20,如果你传参,就是你传的参数 4.剩余参数:会把传进来的实参变成一个数组,可 ...

  5. boost第 4 章 事件处理

    http://zh.highscore.de/cpp/boost/ 1.信号 Signals 2.一旦对象 被销毁,连接就会自动释放. 让 FF类继承自 boost::signals::trackab ...

  6. mysql查询表字段名称,字段类型

    select column_name,column_comment,data_type from information_schema.columns where table_name='查询表名称' ...

  7. 静态代码扫描之阿里java代码规范IDEA插件

    前言 2017年2月9日,首次公布<阿里巴巴Java开发手册>; 2017年9月25日,阿里巴巴集团发布了<阿里巴巴Java开发手册>PDF终极版; 2017年10月14日,在 ...

  8. Excel中如何截取字符串中指定字符后的部分字符

    1.如何给某列属性为时间整体加一个时间值:      场景一:假如我有一个excel中的某一列如下图所示,如何将该列的时间(用B代替整列)整体加一分钟呢?方法很简单,在空白单元格填写时间格式图中A所示 ...

  9. html入门1

    1.HTML超文本标记语言,(Hypertext Markup Language),通过一段内容定义为标题,段落或者图像等,从而让该内容具有结构以及含义 2.W3C:万维网联盟(World Wide ...

  10. 棋牌平台开发教程之扎金花大小比较算法在php中的实现

    PHP中扎金花比大小如何实现 在棋牌游戏中,不管是现实的还是线上的,扎金花无疑是最热门棋牌游戏之一,鄙人从小就酷爱扎金花,机缘巧合后面从事了IT行业,话不多说,直接进去正题吧. 扎金花两副牌的比较规则 ...