使用游戏引擎实现普普通通的电梯调度算法


注:这是目前WebGL2.0支持的浏览器版本号列表


稀疏

如同在那个慵懒的午后,贴心地给你指出你代码块的错误的主程老大的头发

WebGL2.0这目前稀疏的浏览器支持,着实令人唏嘘,不过我们要谈的不是WebGL2.0,而是

一个在游戏引擎中实现的电梯算法模拟

如果您的浏览器符合上图中的要求,就可以按住ctrl再点击上面这个标题,可以直接尝试浏览笔者的小团队正在制作的Unity项目(稍等,有疑问请继续看)

哦?怎么看符不符合要求?

允许笔者再翻译一下这个符合要求的浏览器,目前主流的火狐和Chrome都支持,只要您更新到了最新的版本。当然如果您使用Opera的话,恭喜您最新版也是可以直接浏览该页面的(那么我猜IE应该是没人使用的,这里就略过了(逃))

话不多说

本身这个项目只是一个半成品,但是已经达到了作业要求因此才有了这篇blog,从26号作业发布至今,笔者一直在持续维护这个小东西,前几日的工作具体在项目库的push里有一定的说明,但是作为说明就太过简洁了,感兴趣的各位可以点击这里,因此也是为了记录工作的新进展才有了这篇blog,目前就先记录这么多(ps:如果对截图有需要的话,或者提出什么建议的话敬请留言)

再多说点

如果您进入了项目预览的网页,那么具体的操作方式是:

左键点击、右键旋转视角、lshift视角降低、space视角升高、WASD控制镜头移动、滚轮控制视角移动速度
左上角新增了一个可点击的UI,用于切换正交和透视视图,默认透视,推荐切换成正交视图可以观察的更清晰


一些说明

游戏引擎?

是的,当时接到这个作业在不到十分钟的时间就拿定了这个主意,主要的原因在于笔者看到要求中“最好有图形界面的实现”,略加思索应该没有比游戏引擎更合适的了,正好笔者对Unity这个引擎略有心得,C#的编程也懂一些就做出了这个决定

Unity?

如果常玩手机游戏的各位应该不陌生,该引擎因其比较轻量和插件式工作的特点很容易上手并且制作跨平台的游戏,被广泛用于制作手机游戏,较低的门槛使得对使用者的能力要求不高,而且是利用C#来作为主要语言进行编程的,所以刚好符合笔者的需求,因而选用了该引擎

额外声明

虽然没有必要,但是还是应该说一下,本项目的电梯调度算法的实现没有使用任何的Unity中的影视动画的相关内容,笔者不是动画师,只是个程序员,自然是用纯编程的方式完成该项目的实现

整个电梯算法只有按钮逻辑的一部分利用了Unity框架里面的UI逻辑,来完成比较直观的按键响应


290419C

也是本博客发表的第一天,要写一些实质性的东西,再次说明一下笔者选择实现电梯调度算法,而其本身的要求正如其名,电梯“调度

这是一个比较有趣的题目,它说了自己是调度算法,那么它就是通过调度系统(也可以理解为该算法)处理在每次楼内的任意一层上下按钮被按下后,对电梯进行调度的一系列行为

说人话就是它才不用管电梯内是怎么按的,只要在电梯的外部(也就是大楼内部),每一层发出对电梯的请求,而该请求在调度算法预定的规则或者逻辑里进行分配,即电梯调度算法的实现

而至今日中午算是完成了一些小功能以及电梯算法的全部逻辑,笔者的编程思想是只使用规则处理逻辑,而规则再进行细分从而达成算法的优化,表层基本规则如下:

  1. 电梯分为三种状态:空闲(idle),上行(upward),下行(downward)
  2. 上行的电梯只处理比自己当前楼层高的“向上”的请求,下行的电梯只处理比自己楼层低的“向下”的请求,空闲的电梯两种请求不论高低都接受

完毕,第一层的规则就是这么简单,只规定基本的处理请求的规格,我们接下来进一步优化它:

  1. 轮询所有电梯,选择最佳的那一个

各位可能觉得这里很怪异,什么叫最佳的?这里其实就是整个问题的核心部分,即便所有人(对电梯调度问题)的实现方式都有所不同,但都要有这么一步,这也是区分各种电梯调度算法结果优劣的核心——找出最好(花费时间最短就能到达)的电梯,而本算法采用的是:

  1. 距离最近的电梯优先

这就完了?这就完了,但只是对到这一步而言

到此为止我们的电梯还没有“正规化”,一个提供正常服务的电梯有一个必备的功能:等待
也就是我们常说的开门关门

那么有关于等待再增加简单的规则:

  1. 不等待的电梯优先

这也就完了?对,这也就完了,但还是只针对到这一步而言,我们这样真的就最优了吗?看看我们的规则哪里有一个巨大的转折?

是的,我们的第4个规则非常将所有远距离的电梯扼杀了,如果那个远距离的电梯只是相差了可以接受的层数,而当前最近的电梯正处于等待这种忙状态呢?

6.距离最近的电梯在等待,此时距离该电梯较近并符合前述规则的电梯优先

好的,至此我们已经处理完了尽可能多的最优规则,实际上这也是笔者所想到的全部限制了。
更多的细节在代码中其实也做了一些优化的实现,比如优先Idle状态的电梯相应请求等,算法相关C#源代码见下文,由于用到了一些Unity的API,如果真的要看的话,只需要看算法的实现思路,具体点击这里,里面有一些自用的注释

接下来要做的事情

在做好了电梯调度算法之后需要做的是如何让它看起来有用,因此要加入可以自动行动的AI,目前正在进行相关代码编写,今天暂时就是如此,以上

猜你喜欢

转载自www.cnblogs.com/SHQstudio/p/10792213.html