最近想详细研究一下电梯调度算法,但是所涉及到内容太多了,目前没有时间了。关于电梯算法的种类:
http://www.cnblogs.com/jianyungsun/archive/2011/03/16/1986439.html
那我只能研究一下简单的了。
这是编程之美中的一道题目:
一座大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯在每层都停。
实习生小飞常常会被每层都停的电梯弄得很不耐烦,于是他提出了这样的一个办法:
由于楼层并不太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的一层。所有乘客都从一楼上电梯,到达某楼层后,电梯停下来,所有乘客再从这里爬到自己的目的层。在一楼上电梯的时候,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
问:电梯停在哪一层,能够保证这次乘坐的电梯所有乘客爬楼梯的层数之和最少。
直接贴出我用java实现的代码吧:
public static void main(String[] args) { for (int n = 0; n < 10; n++) { int nums[] = getInfoInOneElevator(); System.out.println("一共有:" + nums.length + "人上楼,分别上得楼层数为:"); for (int i = 0; i < nums.length; i++) { System.out.print(nums[i] + " "); } System.out.println(""); int[] info = getMinTotalSteps(nums); System.out.println("最小步数:" + info[0]); System.out.println("停在楼层:" + info[1]); System.out.println("-----------------------------"); } } /** * 根据一电梯中人的信息,计算出最小需要爬得步数,和电梯应该停的楼层 */ public static int[] getMinTotalSteps(int nums[]) { int minStep = level * nums.length; // 默认都去最高层 int nFloor = -1; for (int i = 0; i < level; i++) { int tempStep = 0; for (int j = 0; j < nums.length; j++) { tempStep += Math.abs(nums[j] - i - 1); } if (minStep > tempStep) { minStep = tempStep; nFloor = i + 1; } } return new int[] { minStep, nFloor }; } /** * 随机得到一批的上电梯的人,限载人13 */ public static int[] getInfoInOneElevator() { // 随机上来的人数 int[] nums = new int[(int) (Math.random() * 13)]; for (int i = 0; i < nums.length; i++) { nums[i] = (int) (Math.random() * level) + 1; } return nums; }
经过10次随机模拟:
这个问题比较简单,以后有时间详细的模拟各个电梯调度算法。
时间: 2024-10-10 22:58:03