电梯V2.0

GitHub仓库地址

Problem

一栋10层的大楼(楼层编号1-10),设3台无限载重的电梯,初始时电梯停在1层。其中:1号电梯只能停留在奇数层,2号电梯可以各层都停留,3号电梯只停留在第1层和偶数层。电梯移动1层的耗时为1,在某一层停靠的耗时为1(时间初始为0)。电梯不允许未仆先知,必须在时间到了之后才能开始响应这条请求。
为了使得电梯完成接送所有乘客的运行时间最短,请你编写一个程序来进行电梯调度。

输入
输入文件的文件名为 input.txt ,其中:第一行为一个非负整数N,代表乘客的请求数量;接下来N行,描述了这N个请求的信息,格式为请求时刻 起始楼层数 去往楼层。
保证请求时刻是单调不减的。

/input example/
2
1 1 2
1 2 1

输出
输出调度决策,3部电梯分别输出到3个文件。文件名分别为output1.txt、output2.txt和output3.txt,其中:每一行的输出格式为时刻 停靠楼层。(初始时停在1层的状态不输出)
注意:“时刻”指的是在某层楼停靠的时刻,且不算入在该层的停靠时间。

/onput1.txt为空/

/onput2 example/
3 2

/onput3 example/
2 2
4 1


思考过程

提示:本文针对的是我对这题的思考过程,思路不止一种。

拿到题目的我直接一脸懵逼,这次的作业直接由之前的单线操作变为多线同时操作,我猜测老师和助教的本意是让我们尝试使用继承和多态来解决不同运行规律的电梯这个问题,然而在加大语法考核难度的同时算法难度几乎是几何倍的增长了啊!这周又有高数考试忙于复习,这不是为难我胖虎么!
总之,问题是不会少的,在我实践的过程中,大概碰到了以下几个问题

如何建立特殊运行模式的电梯?
如何设计实现多线程同时运行的算法?
如何使函数与继承的类联系?

第一个问题还算好解决,直接把学来的继承和多态用上,建立一个特殊的电梯类。然而第二个问题困扰了我很久,我之前设计的算法思想采用的是dfs(深度优先搜索),是以单线操作为设计思路设计的算法,在多线程操作上无能为力,只能重新设计算法,又由于考试的原因没能去深思,还没能想出好的解决办法,暂且就用了比较菜的调度算法orz。而因为第二个问题还没能有效的解决,第三个问题也只好先留着了。具体请留意本篇博客的更新。


5.21更新

这几天想算法和DeBug真的要搞到我头发掉光QAQ。想来想去,参考了部分前辈的算法思想,但是由于知识所限以及deadline的逼迫,目前还是只能利用dfs实现电梯调度,以此算法思想为核心编写了两个调度算法,我将其称为:

任务分配型电梯调度算法
全局响应型电梯调度算法

以下就这两个算法进行简单的叙述。

任务分配型电梯调度算法

当乘客提出请求时,将乘客请求分配给三台电梯中满足乘客要求的电梯进行模拟运算,选出运行时间最短的电梯,将乘客直接分配给电梯(乘客:被安排的明明白白.jpg)。电梯在收到分配的乘客请求后才会进入运行状态,没有任务则会在最后一位乘客离开时的楼层停机待命。
优点:满足尽量缩短电梯运行时间的要求,算法实现较为简单。
缺点:新的乘客请求不会影响到已经分配的任务,其他可能最优的电梯无法干涉已分配的任务。
时间复杂度:O(3^n)(单次运算)

全局响应型电梯调度算法

当乘客发出请求后,并不将乘客直接分配给电梯,而是所有满足运行规则的电梯都可以为其响应,直到乘客成功进入电梯后才分配给电梯。电梯在丢失乘客请求(即乘客进入电梯后)在运行的当前楼层停止运行(电梯没人的情况下)。
优点:尽量缩短所有乘客的等待时间,且新请求可以影响乘客最终的分配情况。
缺点:并不是电梯最短运行时间,不符合题意
时间复杂度:O(3^n)(单次运算)
没错这个算法其实是我看错题目后写的(依照寒假最短乘客等待时间设计算法),直到抓完bug后再看一眼题目才发现做错了。。。(你感受过绝望吗.jpg)

DFS算法的缺点(算法设计心得和反思)

效率极低!即使我进行了剪枝还是没能挽救20数据1s响应的指数级复杂度。在设计算法的期间对TSP等算法进行了简单的了解(时间复杂度还是很高。。),以及一直被@Stolf大佬安利贪心算法(然而实在是不能理解和设计贪心策略)。总之不管如何,当前的算法绝对是无法在下次的作业中继续使用了,设计新的算法思路迫在眉睫。

一些其他的收获和总结

在这次的编程作业中,也首次使用了很多新学的骚操作:

为了更好的方便数据调度,首次在工程中大规模的使用STL容器(std::vector)。
尝试使用继承、多态等类操作
更加充分利用指针的特性,在一些地方使用更加便利

不过一次上了这么多新学的东西,出现问题和疑惑是必然的

无法很好的处理迭代器的使用和容器操作
如何让函数适应继承类
指针的错误操作

以上的每一个问题都让我脑壳发疼,解决他们促使不断地学习和解决。
不过以上语法问题都是小问题,最严重的不足还是对面向对象OOP思想的理解不够深刻。特别是对程序框架搭建的不够理解和不懂的如何搭建程序框架,使得算法设计再一次变得复杂,对框架无法很好的利用,修补bug就像不断的挖土填坑,也促使了bug的接憧而至。下一步应该要好好的学习接口设计和框架搭建了。
这次作业让我又学到了不少OOP的知识,也在这次编程作业中尝试使用了,更多的思考内容可以移步面向对象编程学习日记参看。


关于C语言实现的过程

本次作业我使用的显然是C++,如果使用C语言的话无非就是结构体+函数+以设计过程为思路来实现电梯的调度了。

End

电梯V2.0的更多相关文章

  1. [Android]Android端ORM框架——RapidORM(v2.0)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM ...

  2. JuCheap V2.0响应式后台管理系统模板正式发布beta版本

    JuCheap V1.* 查看地址: http://blog.csdn.net/allenwdj/article/details/49155339 经过半年的努力,JuCheap后台通用响应式管理后台 ...

  3. python gettitle v2.0

    #!/usr/bin/env python # coding=utf-8 import threading import requests import Queue import sys import ...

  4. ".NET Compact Framework v2.0 could not be found."

    参考: http://blog.csdn.net/godcyx/article/details/7348431 问题原因: That's a known issue where VS can't di ...

  5. 【JS】heatmap.js v1.0 到 v2.0,详细总结一下:)

    前段时间,项目要开发热力图插件,研究了heatmap.js,打算好好总结一下. 本文主要有以下几部分内容: 部分源码理解 如何迁移到v2.0 v2.0官方文档译文 关于heatmap.js介绍,请看这 ...

  6. 怎样在IDEA中使用JUnit4和JUnitGenerator V2.0自动生成测试模块

     因为项目的需要,所以研究了一下自动生成测试代码.将经验记录下来,总会有用的.我个人认为,好记性不如多做笔记多反思总结. 1.    前提条件 开发环境已正确配置 工程已解决JUnit依赖关系(pom ...

  7. 微信快速开发框架(六)-- 微信快速开发框架(WXPP QuickFramework)V2.0版本上线--源码已更新至github

    4月28日,已增加多媒体上传及下载API,对应MediaUploadRequest和MediaGetRequest ------------------------------------------ ...

  8. 【原创】风讯DotNetCMS V1.0~V2.0 SQL注入漏洞

      文章作者:rebeyond 注:文章首发I.S.T.O信息安全团队,后由原创作者友情提交到乌云-漏洞报告平台.I.S.T.O版权所有,转载需注明作者. 受影响版本:貌似都受影响. 漏洞文件:use ...

  9. API Monitor v2.0 Alpha-r13 (32+64) 汉化版

    API Monitor v2.0 Alpha-r13 (32+64) 汉化版: 链接: https://pan.baidu.com/s/1jIx5znC 密码: 4538 本软件已最大化汉化,已经趋于 ...

随机推荐

  1. 解决Linux上tomcat启动却无法访问

    linux中tomcat的安装 安装tomcat前首先要安装对应的jdk并配置Java环境 下载tomcat安装包 下载路径:https://tomcat.apache.org/download-80 ...

  2. 转 关于window10安装jdk,配置环境变量,javac不是内部或外部命令,也不是可运行的程序 或批处理文件的细节问题。

    今日拿到一台新的window10笔记本电脑,非常熟练的安装了JDK(因为在学校经常给同学安装JDK - -)但是发现java java -version命令都可以使用,唯独javac命令出现不是内部或 ...

  3. 【常用】IDEA常用快捷键与操作

    以下出场顺序为开始学习IDEA时遇到的顺序,并非实际中的使用频率,最终版待整理 0.“ctrl+space(由于习惯问题我已经更改为alt+/)”——基本提示 “ctrl+shift+space”—— ...

  4. 20155209实验二《Java面向对象程序设计》

    20155209实验二<Java面向对象程序设计> 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计 ...

  5. 20145207 2016-2017-2 《Java程序设计》第4周学习总结

    一.继承与多态 1.继承的定义 面对对象中,子类继承父类,避免重复的行为定义,不过并非为了避免重复定义行为就使用继承,滥用而继承会导致程序维护上的问题. 程序代码重复在程序设计上就是不好的信号,多个类 ...

  6. WPF 带刻度的滑动条实现

    原文:WPF 带刻度的滑动条实现 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/83507170 ...

  7. PhoneGap3.2安装步骤

    1.首选安装好JDK.Android SDK.Ant 配置如下:        系统环境变量        ANDROID_HOME Value: C:\Development\adt-bundle\ ...

  8. 【SDOI2014】数表

    题面 题解 不管$a$的限制 我们要求的东西是:($\sigma(x)$是$x$的约数个数和) $ \sum_{i=1}^n\sum_{j=1}^m\sigma(gcd(i,j)) $ 设$f(x)= ...

  9. 【BZOJ4016】[FJOI2014]最短路径树问题

    [BZOJ4016][FJOI2014]最短路径树问题 题面 bzoj 洛谷 题解 虽然调了蛮久,但是思路还是蛮简单的2333 把最短路径树构出来,然后点分治就好啦 ps:如果树构萎了,这组数据可以卡 ...

  10. UTC时间转为正常日期

    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);SimpleDa ...