1. 程式人生 > >電梯排程演算法---SCAN演算法

電梯排程演算法---SCAN演算法

請珍惜小編勞動成果,該文章為小編原創,轉載請註明出處。

掃描(SCAN)排程演算法:總是從磁臂當前位置開始,沿磁臂的移動方向去選擇離當前磁臂最近的那個柱面的訪問者。如果沿磁臂的方向無請求訪問時,就改變磁臂的移動方向。採用這種排程演算法,需要為訪問者設定兩個佇列,根據磁頭的移動方向,能訪問到的訪問者由近及遠排隊,背離磁頭移動方向的訪問者也由近及遠排為另一隊。先按磁頭移動方向佇列排程訪問者訪問磁碟,當該方向沒有訪問者時,再改變方向,選擇另一個訪問者佇列訪問磁碟。

java程式碼實現:

import java.util.Scanner;


public class SCAN {

	int visitAdd[];
	int visitSub[];
	int index=0;   //存放下標,已排序序列中找到比它大的最小值的下標
	public void scan(int data[],int begin,int direction){
		int temp=0;
		//從小到大排序
		for(int i=0;i<data.length;i++){
			for(int j=i;j<data.length;j++){
				if(data[i]>data[j]){
					temp=data[i];
					data[i]=data[j];
					data[j]=temp;
				}
			}
		}

		for(int i=0;i<data.length;i++){
			if(data[i]>begin){   //在已排序序列中找到比它大的最小值的下標
				index=i;
				break;
			}
		}
		//比起始位置小的
		visitSub=new int[index];   //比他小的共有index個
		for(int i=0;i<index;i++){
			visitSub[i]=data[i];
		}
		//比起始位置大的
		visitAdd=new int[data.length-index];   //比他大的共data.length-index個
		for(int i=0;i<visitAdd.length;i++){
			visitAdd[i]=data[i+index];
		}
		//計算平均時間
		int lengthAdd=0;
		int lengthSub=0;
		int length=0;
		for(int i=0;i<visitAdd.length-1;i++){
			lengthAdd+=Math.abs(visitAdd[i]-visitAdd[i+1]);
		}
		for(int i=visitSub.length-1;i>0;i--){
			lengthSub+=Math.abs(visitSub[i]-visitSub[i-1]);
		}
		length=lengthAdd+lengthSub+Math.abs(begin-visitAdd[0])+Math.abs(begin-visitSub[visitSub.length-1]);
		
		if(direction==0){   //找小的
			for(int i=visitSub.length-1;i>=0;i--){              
				System.out.print(visitSub[i]+"    ");
			}
			//迴轉
			for(int i=0;i<visitAdd.length;i++){              
				System.out.print(visitAdd[i]+"    ");
			}
			length+=Math.abs(visitSub[0]-begin);
		}else{        //找大的
			for(int i=0;i<visitAdd.length;i++){              
				System.out.print(visitAdd[i]+"    ");
			}
			//迴轉
			for(int i=visitSub.length-1;i>=0;i--){              
				System.out.print(visitSub[i]+"    ");
			}
			length+=Math.abs(visitAdd[visitAdd.length-1]-begin);
		}
		System.out.println("平均尋道長度為"+length/data.length);
	}
	public static void main(String[] args) {
		SCAN scan=new SCAN();
		Scanner scanner=new Scanner(System.in);
		System.out.println("請輸入資料個數");
        int num=scanner.nextInt();
        System.out.println("請一次輸入資料,空格隔開");
        int data[]=new int[num];
        for(int i=0;i<num;i++){
        	data[i]=scanner.nextInt();
        }
        System.out.println("請輸入讀寫頭起始位置");
        int  begin=scanner.nextInt();
        System.out.println("請輸入磁頭移動方向  0:磁軌減少方向   1:磁軌增加方向 ");
        int direction=scanner.nextInt();
        scan.scan(data, begin, direction);
        
	}
	//98 183 37 122 14 124 65 67
}

測試: