告别了三次奇妙无比的求导作业之后,我们就开始搭建一部自己的电梯了。相信我们不同同学的电梯运行方式肯定各具特色吧,但值得肯定的是,在艰苦的走完了三次电梯逐步改进的作业之后,我们的电梯在正常情况下应该是可以运作了~所以当我们一起坐电梯,相信我们的电梯应该是不会接不到人、把人最后关在里面、莫名其妙的就把人给丢了以及把人送到+或者是-的啦。下面是我对这三次作业的总结与分析~

  在三次作业中我都是用的三个线程。一个是main线程,主要负责构造并start另外两个线程,构建调度器对象;另外两个是Request与Elerun线程,顾名思义,一个用来得到请求并将请求put到调度器,另一个用来模拟电梯运行。调度器类命名为Control。

FAFS电梯调度

  对于刚刚接触多线程的我来说,要实现一部相对智能的电梯几乎是不可能的,更不要说是多部电梯了。应该也是出于对同学们情况的考虑吧,第一次作业只是要求我们实现VIP(傻瓜)级别的电梯调度。即在任一时刻每当有一个用户给电梯发送了一个请求,那么调度器就将该请求传递给电梯,电梯在运行路径上不用去接其他的人,只把接到这个请求当作目标,来一次执行完各个请求。

设计思路:

  因为这次作业不要求具体的各个请求之间的调度,所以我甚至没有在调度器里面构建一个链表。在Request得到一个输入之后便立马put给调度器,如果此时调度器之前要put的请求还没有被电梯get到,那么就先让put方法等待,直到电梯get完前一个请求之后再将这一个put进去。同样,在电梯get的时候,如果此时没有请求则调度器便让当前电梯的线程wait,直到put进一个请求被notify了之后才继续运行。最后在Request得到程序输入结束的指示后,会给调度器传入一个自定义好了的请求,而当电梯读到那个请求之后,便会直接结束运行。

  下面是第一次作业的结构度量:

类图:
复杂度分析:

时序图:

ALS电梯调度

  在FAFS电梯的基础上,这次调度要求电梯在运行过程中可以捎带着人以减少电梯的总运行时间,同时增加了底下层,具体原因不清楚为什么,好像是为了避免出现固定化楼层分析的情况?不过在这次编程中值得注意的一点是从底下-1层到1层电梯只是运行了1层,而不是单纯的减法就能够满足的了。

设计思路:

  在Request线程方面,与第一次差别不大。唯一的区别就是在put的时候会直接put到调度器里面一个已经构建好的请求链表(比较习惯用ArrayList)里,这样Request每读到一个输入则会避免了等待而直接压入同时notifyAll一次主要来唤醒电梯的Elerun线程。

  在电梯进行get初步读入请求时,如果此时ArrayList链表为空,则一直wait,直到Request线程重新唤醒该线程后再继续运行。在电梯运行时,我设计思路是电梯get时只get到第一个人的位置作为主请求,同时电梯向第一个人的方向运行,在每一层判断一次请求链表中是否有与电梯运行方向相同的人或者事要下电梯的人,如果有则在该层停靠完成相应的in或者out的过程,在in的时候每进入一个人则删除请求链表里的该请求。直到电梯将初步get到的请求运行完之后再重新从链表里得到一个新的主请求。

不足之处:

  虽然这样写可以比较稳定的实现电梯在运行过程中执行捎带人的动作,而且也能知道电梯此时的运行情况及运行状态。但是有一个比较重要的点没有考虑到,就是假如有三个人同时分别在13、14、15层按了向下的按钮,那么此时电梯就会从一层上来逐个的送回三个人,那么在这种情况下就和FAFS电梯一样了,这是一个在设计层面上没有想到的情况,拉低了自己的性能分。而我在后来改进的时候只需要判断是否有比当前请求更适合作为主请求的请求,就可以初步的改进这个问题。

  下面是我的第二次作业的度量分析:

类图:
复杂度:
时序图:

SS电梯调度

  第三次作业在第二次的基础上,增加成了三部电梯,并且规定了电梯所能到达的楼层各不相同,运行速度不同,容量不同等限制因素。要求尽可能的实现优化调度以在比较少的时间内执行完所有的请求。我在第二次作业的基础上,对Elerun与调度器进行了修改。

  不同于第二次作业,我是在调度器里买面改成了三个链表存储对应的请求。每个电梯在每次改变状态时便实时通知调度器,在Request读取到一个请求之后便调用调度器的put函数,调度器根据此时各个电梯的运行状态来将此请求压入制定的链表。下面是部分内容的更详细的介绍。

  首先介绍我实现的调度器是怎样将读到的请求尽量合理的压入不同链表的。如图所示,我在调度器里面用0代表A电梯,用1代表B电梯,2代表C电梯,这个二维数组表示不同

的电梯所能到达的楼层,能到达则为1,不能则为0。这样在判断电梯能否到达楼层时只需判断对应的值是否为1就可以了。那么在调度器得到一个请求之后,按照下面的步骤筛选应该压入的链表。

由于时间限制和个人能力不足的原因吧,我没有完成只把请求压到一个指定的链表中去的假想,在最后一步筛选时间最短时的筛选条件比较苛刻,如果没有满足的电梯,则就把该请求压入到满足前一个请求的电梯的链表里。

  还有一点要提的是换乘时的判断。当没有电梯可以直达时,我先筛选出能在此层停靠的电梯,然后针对每一个电梯,筛选该电梯可以到达的最近的楼层floor,且有电梯可以在该floor直达目的地,那么我以此楼层作为中转,修改之前的请求。对应每一个电梯,当拆分请求完成后,压入对应的请求链表,完成拆分。

  下面是我的第三次作业的度量分析:

类图:

复杂度:

总结与感想

  这三次作业在强测和互测中都没有被

OO电梯调度的更多相关文章

  1. OO第二次博客作业——电梯调度

    OO第二次博客作业——电梯调度 前言 最近三周,OO课程进入多线程学习阶段,主要通过三次电梯调度作业来学习.从单部电梯的傻瓜式调度到有性能要求的调度到多部电梯的调度,难度逐渐提升,对同学们的要求逐渐变 ...

  2. OO第二单元总结(多线程的电梯调度)

    经过第一单元作业的训练,在做第二单元的作业的时候,要更加的有条理.但是第二次作业多线程的运行,带来了更多的运行的不确定性.呈现出来就是程序会出现由于线程安全问题带来的不可复现的bug.本单元的作业也让 ...

  3. oo第二次博客-三次电梯调度的总结与反思

    本单元从电梯调度相关问题层层深入,带领我们学习并运用了了多线程相关的知识. 三次电梯调度依次为单电梯单容量.单电梯可携带.多电梯可携带. 一.我的设计 在第一次作业中,使用了最简单的FIFO调度方法. ...

  4. 电梯调度编写(oo-java编程)

    第二单元的问题是写一个关于电梯调度的程序. 需要模拟一个多线程实时电梯系统,从标准输入中输入请求信息,程序进行接收和处理,模拟电梯运行,将必要的运行信息通过输出接口进行输出. 主要锻炼学生的多线程程序 ...

  5. 学会拒绝,是一种智慧——OO电梯章节优化框架的思考

    在本章的三次作业里,每次作业我都有一个主题,分别是:托盘型共享数据.单步电梯运行优化.多部电梯运行优化,因而电梯优化实际是第二.三次作业.虽然后两次作业从性能分上看做得还不错,但阅读其他大佬博客,我深 ...

  6. 【软件工程】电梯调度的初步实现 李亚文&&郭莉莉

    一.开门见山,代码粘 using System; using System.Collections.Generic; using System.Data; using System.Drawing; ...

  7. 电梯调度--c++--软件工程

    一.设计思路 (1)将乘客要去的楼层数存起来. (2)假设yi为乘客要爬楼层数之和,yi=n1*|(n1-ni)|+n2*|(n2-ni)|+..+n18*|(n18-ni)| (3)比较y1到y18 ...

  8. 电梯调度系统(界面由C图形库编绘)

    1.编程题目 电梯调度系统 2.结对编程组员 黄冠译,刘畅 3.编程语言 C语言图形库 4题目要求 编写人员:刘畅,黄冠译 代码如下: # include <stdio.h> # incl ...

  9. PairProject 电梯调度 【附加题】

    [附加题] 改进电梯调度的interface 设计, 让它更好地反映现实, 更能让学生练习算法, 更好地实现信息隐藏和信息共享. 目前的设计有什么缺点, 你会如何改进它? 1.之前判断电梯是否闲置的函 ...

随机推荐

  1. 详解Asp.Net Core 2.1+的视图缓存(响应缓存)

    响应缓存Razor 页与 ASP.NET 核心 2.0 中不支持. 此功能将支持ASP.NET 核心 2.1 版本. 在老的版本的MVC里面,有一种可以缓存视图的特性(OutputCache),可以保 ...

  2. 使用powerpoint的表对象

    以下为basic范例,delphi使用需要加以修改 Table 对象 代表幻灯片上的表格形状.Table 对象是 Shapes 集合的成员.Table 对象包含 Columns 集合和 Rows 集合 ...

  3. 廖雪峰Java8JUnit单元测试-2使用JUnit-2异常测试

    1.异常测试 对可能抛出的异常进行测试: 异常本身是方法签名的一部分: * public static int parseInt(String s) throws NumberFormatExcept ...

  4. mvc中让路由忽略带后缀的路径文件

    public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/ ...

  5. ArcGIS紧凑型缓存存储格式分析

    by 蔡建良 2018-8-24 网络中我看到的网文将bundle存储切片数据的方式都没说清或是说错.按照错误方法一样可以在桌面浏览,但在arcgis for android却无法浏览. bundlx ...

  6. react-redux笔记

    用vuex来对比来说明 分类 vuex redux react-redux 写state commit mutation (mutable state) dispatch reducer (immut ...

  7. 给Linux系统新增加一块硬盘

    今天公司测试Linux服务器硬盘不够用了,主要是mysql数据文件太大了,买了个500G的硬盘回来,这里记录下新加硬盘的方法PS 测试服务器的主板太差劲了,没有多余的电源接口,只能把光驱的电源拿出来, ...

  8. GPRS骨干网逻辑结构

    从逻辑上来说,GPRS通过在GSM网络结构中增添SGSN和GGSN两个新的网络节点来实现.由于增加了这两个网络节点,需要命名新的接口.图1说明了GPRS逻辑体系结构.表1给出了GPRS体系结构中的接口 ...

  9. SQL查询某库所有的表所有的字段及字段的属性

    then d.name else null end) 表名, a.colorder 字段序号, a.name 字段名, ( then '√'else '' end) 标识, ( then '√' el ...

  10. 对Unity一个Shader编译Bug的分析(Unrecognized sampler 'samplerunity_lightmap)

    写在前面 Unity的用户量越来越大,越来越有钱,这几年摊子也铺的越来越大,所以各个版本总是有很多Bug.对于一些Bug官方在ReleaseNote里的说明是很不详细的,而对于一些渲染相关的Bug,有 ...