在电梯系列的作业中,笔者的整体架构几乎没有发生改变。现介绍如下,对于一个电梯系统,主要的工作步骤就是获取乘客请求、分派请求、执行请求。针对这样的工作模式,笔者设计了Elevator、Uselist两个主要的类(获取请求由主类完成)。在线程的配合方面,笔者采用的是消费者-生产者模式,Uselist相当于托盘,不同的是该类还负责向不同的电梯分配请求。

一、作业分析

(一)第一次作业

调度算法:严格采用可稍带原则,中途楼层遇到新的乘客就进行搭载。

UML类图:

复杂度分析:

由于只有一部电梯,因此方法都相对简单,在复杂度方面表现良好。

Bug分析:未出现bug

(二)第二次作业

调度算法:本次作业电梯数变为了多部,并且电梯增加了最大乘客数的限制。在调度方向,笔者采用了贪心策略,电梯每次都优先前往最近的有乘客的楼层,并优先去往距离当前楼层最近的楼层,在过程中仍然可稍带。从最后的结果来看,在不考虑单个乘客的等待时间的情况下,这种算法的效率很不错,达到了由及局部最优取得整体最优的效果。

UML类图

复杂度分析

在复杂度方面,本次作业的表现也较好。

Bug分析:未出现bug

(三)第三次作业

调度算法:本次作业电梯出现了不同的种类,并且不同的电梯可前往的楼层是不同的,这意味着需要换乘,除此,电梯的数量也会动态增加。笔者认为电梯数量的增加不是主要的问题,因此将作业的重点放到了换乘策略上。经过对楼层的分析,发现1层和15层是三种电梯都会到达的楼层,因此1层和15层就作为换乘的中转站。笔者采用的策略是当一个乘客进入电梯后,如果不需要换乘就前往相应楼层,如果需要换乘就根据乘客的目的楼层去往1层或者15层。这种调度方式的效率并不高,但是可以保证正确性。由于笔者能力有限,就没有做过多的优化。

UML类图

复杂度分析

可以看出部分方法被标红,被标红的方法主要的功能就是对乘客请求的调度,出现了很多对请求队列的遍历,在这方面笔者认为有很大的优化余地。但是值得注意的是,电梯的run方法也被标红,主要的原因是电梯线程在运行过程中需要大量的与请求队列进行读写操作,但是笔者还未想到如何降低电梯与请求队列之间的耦合度,这也是需要改进的一个方面。

Bug分析:在本次作业中笔者出现了重大的错误。C类电梯不能前往15层以上,而笔者错误的将C类电梯的可达楼层设置为了所有的奇数楼层。由于这个bug,在强测中只得到了35分,互测中也有被hack。但是bug修复中只修改了2行代码就完全修复了。出现了这样的错误笔者心情十分复杂,只能在之后多注意各种约束条件。

可扩展性:Uselist进行请求队列的管理,Elevator负责电梯的运行。比较符合SRP原则。但是对OCP、LSP、ISP、DIP几个原则上表现就不是很好。笔者分析后认为,对笔者来说第三次作业算是比较复杂的,在复杂程序的设计中,会出现思路不清晰,最后导致思绪复杂,使得原来各司其职的类混杂了多余的功能。在对类之间的协作上笔者还需要加强。

二、HACK策略

首先查看是否出现了轮询的情况。没有的话,就主要集中在特殊情况,比如:同一时间出现大量乘客(请求相同或者请求各不相同)、换乘的情况。

三、心得体会

在电梯系列的作业中,线程安全是一个重要的问题。笔者是第一次接触多线程相关的程序,因此在第一次作业中,感觉到很困难。但是经过了第一次作业之后,对于多线程的理解上,感觉就通透了很多。笔者比较满意的是,第一次作业设置的整体架构比较稳定,在之后的迭代中程序的整体架构没有发生大的变化,这给功能的迭代带来了极大的方便。这一点是笔者认为比求导系列作业有很大进步的地方。但是,在第三次作业中也出现了比较大的失误,对C类电梯的限制条件设置错误,导致了bug的产生,这是完全不应该的,希望能引以为戒。在作业的过程中,笔者也体会到了设计模式的精妙之处,采取适当的设计模式确实可以减轻设计的负担,因此笔者也认为要多多了解不同的设计模式,这对程序的设计是很有帮助的。

OO第二单元总结——电梯的更多相关文章

  1. OO第二单元多线程电梯总结

    OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...

  2. OO第二单元多线程电梯总结分析

    一.概述 这一部分的作业考察的关注点与上一次的作业有所不同,上一次的考察重点主要集中在输入输出的判定以及多态的考察上面,而这一次是让我们进行多线程程序的调度与开发.这次开发过程中最大的感受就是自己之前 ...

  3. OO第二单元总结——电梯调度问题

    一.设计策略. 在三次作业中,多线程程序的实现分以下几个步骤: 1. 主线程Main类的创建多个线程. 2. 共享对象的synchronized锁保证线程之间的互斥访问. 3. 采用notifyAll ...

  4. 电梯也能无为而治——oo第二单元作业总结

    oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...

  5. OO第二单元——多线程(电梯)

    OO第二单元--多线程(电梯) 综述 第二单元的三次联系作业都写电梯,要求逐步提高,对于多线程的掌握也进一步加深.本次作业全部都给出了输入输出文件,也就避免了正则表达式判断输入输出是否合法的问题. 第 ...

  6. oo第二单元作业总结

    oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...

  7. OO第二单元优化博客

    OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...

  8. 【OO学习】OO第二单元作业总结

    OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...

  9. OO第二单元小结

    OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...

随机推荐

  1. 分布式流转开发常见报错FAQ

    鸿蒙入门指南,小白速来!0基础学习路线分享,高效学习方法,重点答疑解惑--->[课程入口] HarmonyOS开发中分布式协同是非常重要的一个功能,大家在刚接触的时候可能会出现各种各样的错误.我 ...

  2. Oracle VM VirtualBox的下载和安装

    软件介绍 VirtualBox 是一款开源虚拟机软件,由德国 Innotek 公司开发,由Sun Microsystems公司出品的软件,使用Qt编写,在 Sun 被 Oracle 收购后正式更名成 ...

  3. 解决springboot项目打成jar包部署到linux服务器后上传图片无法访问的问题

    前言:目前大三,自己也在学习和摸索的阶段.在和学校的同学一起做前后端分离项目的时候,我们发现将后端打包成jar,然后部署到服务器中通过java -jar xxx.jar运行项目以后,项目中存在文件上传 ...

  4. 剑指 Offer 48. 最长不含重复字符的子字符串 + 动态规划 + 哈希表 + 双指针 + 滑动窗口

    剑指 Offer 48. 最长不含重复字符的子字符串 Offer_48 题目详情 解法分析 解法一:动态规划+哈希表 package com.walegarrett.offer; /** * @Aut ...

  5. CCF(管道清洁):最小费用最大流

    管道清洁 201812-5 需要清洁的管道下界为1, 不需要清洁的管道下界为0, 可重复经过的管道上界为正无穷, 不可重复经过的管道上界为1. 这属于无源无汇的有容量下界的最小费用可行流.解决的方法就 ...

  6. [个人总结]利用grad-cam实现人民币分类

    # -*- coding:utf-8 -*- import os import numpy as np import torch import cv2 import torch.nn as nn fr ...

  7. 任务队列 与 Celery概述

    一.任务队列(Task Queues) 1.1 什么是任务队列? 任务队列用于管理后台工作,通常这些后台工作必须在 HTTP请求-响应循环 之外执行. 1.2 为什么需要任务队列? 对于那些不是由客户 ...

  8. 翻译:《实用的Python编程》04_02_Inheritance

    目录 | 上一节 (4.1 类) | 下一节 (4.3 特殊方法) 4.2 继承 继承(inheritance)是编写可扩展程序程序的常用手段.本节对继承的思想(idea)进行探讨. 简介 继承用于特 ...

  9. 使用当前主流的github管理项目代码(记我的第一次项目创建)

    先创建一个github的账号 网址:https://github.com/ 然后下载一个git工具并安装 网址:https://gitforwindows.org/ 下载安装注册完成后, 创建一个新的 ...

  10. javascript 之对象-13

    对象 无序属性的集合,属性可以包含基本值.对象或者函数,简单理解为对象是若干属性的集合:我们常说的面向对象(oop)编程其实是指的一种编码的思想,简单理解为用对象来封装数据,利用封装.继承.多态对代码 ...