電梯排程演算法---SCAN演算法
阿新 • • 發佈:2018-12-26
請珍惜小編勞動成果,該文章為小編原創,轉載請註明出處。
掃描(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 }
測試: