1. 程式人生 > >移動臂排程演算法

移動臂排程演算法

#include<stdio.h>
#include<string.h>
#include<math.h>
#include <time.h>


#define N 200
#define begin 125
#define before 100
#define NUM 9


void init(int arr[],int n);
int isdif(int arr[],int n);
int alldif(int arr[],int n);
void fcfs(int arr[]);
void sstf(int arr[]);


void elevator(int arr[]);
void elevator_before(int arr[]);
void elevator_later(int arr[]);


void uni_scan(int arr[]);
void uni_scan_later(int arr[]);
void uni_scan_before(int arr[]);


void sort_uni(int a[]);
void sort_uni_before(int a[]);
void sort_elevator(int a[]);
void sort_elevator_before(int a[]);


int main()
{
int arr[NUM] = {86,147,91,177,94,150,102,175,130};

init(arr,NUM);
printf("排程演算法\t\t作業排程次序\t\t\t\t\t\t移動臂的移動距離\n\n");
fcfs(arr);
sstf(arr);
uni_scan(arr);
elevator(arr);

return 0; 
 } 
 
 int isdif(int arr[],int n)
 {
 int i;
 for(i = 0;i < n;i++)
 {
 if(arr[i] == arr[n])
 {
 return 1;
}
}
return 0;
 }
 
 void init(int arr[],int n)
 {
 int i;
 srand(time(NULL));
 
int j;
for(i = 0;i < NUM;i++)
{
do
{
arr[i] = rand()%N;
}
while(isdif(arr,i) ==1);
}
printf("剛剛訪問過的柱面為%d\n",before);
printf("當前柱面位置:%d\n\n",begin);
printf("等待服務的請求有:");
for(i = 0;i < NUM;i++)
{
printf("%d ",arr[i]);
}
printf("\n\n");
 }
 
 int alldif(int arr[],int n)
 {
 int i = 0,j = 1;
 
 for(i = 0;i < n-1;i++)
 {
 for(j = i+1;j < n;j++)
 {
 if(arr[i] ==arr[j])
 {
 return 0;
}
}
}
return 1;
 }
 
 void fcfs(int arr[])
 {
 int i = 0,j = 0;
 int len = 0;
 int a[10] = {0};
 
 printf("先來先服務\t",begin);
 do
 {
 printf("%3d->",arr[i++]);
}
while(i != NUM-1);
printf("%3d\t",arr[NUM-1]);

for(j = 0;j < NUM;j++)
{
if(j == 0)
{
a[j] = abs(arr[0] - begin);
}
else
{
a[j] = abs(arr[j] - arr[j-1]);
}
len += a[j];
if(j != NUM-1)
{
printf("%3d+",a[j]);
}
else
{
printf("%3d=%d",a[j],len);
}
}
printf("\n\n");
 }
 
 void sstf(int arr[])
 {
 int i,j;
 int a[NUM],slen[NUM];
 int len = 0,tmp = begin,tmp_i;
 
 for(i = 0;i < NUM;i++)
 {
 a[i] = arr[i];
}

printf("最短尋找時間優先");
for(i = 0;i < NUM;i++)
{
slen[i] = abs(a[i] - tmp);
tmp_i = i;
for(j = i+1;j < NUM;j++)
{
if(slen[i] > abs(a[j]-tmp))
{
slen[i] = abs(a[j]-tmp);
tmp_i = j;
}
}
tmp = a[tmp_i];
a[tmp_i] = a[i];
a[i] = tmp;
if(i != NUM-1)
{
printf("%3d->",tmp);
}
else
{
printf("%3d\t",tmp);
}
}

for(i = 0;i < NUM;i++)
{
len += slen[i];
if(i != NUM-1)
{
printf("%3d+",slen[i]);
}
else
{
printf("%3d=%d",slen[i],len);
}
}
printf("\n\n");
 }
 
 void uni_scan(int arr[])
 {
 if(begin > before)
 {
 uni_scan_later(arr);
}
else
{
uni_scan_before(arr);
}
 }
 
 void uni_scan_later(int arr[])
 {
 int i;
 int a[NUM],len[NUM];
 int sumlen = 0;
 
 for(i = 0;i < NUM;i++)
 {
 a[i] = arr[i];
}
sort_uni(a); 

printf("單向掃描\t");
for(i = 0;i < NUM;i++)
{
if(i != NUM-1)
{
printf("%3d->",a[i]);
}
else
{
printf("%3d\t",a[i]);
}
}

for(i = 0;i < NUM;i++)
{
if(i ==0)
{
len[i] = a[0]-begin;
}
else if(a[i] > a[i-1])
{
len[i] = a[i] - a[i-1];
}
else
{
len[i] = a[i]+N-a[i-1];
}

sumlen += len[i];
if(i != NUM-1)
{
printf("%3d+",len[i]);
}
else
{
printf("%3d=%d",len[i],sumlen);
}
}
 printf("\n\n");
 }
 void uni_scan_before(int arr[])
 {
 int i;
 int a[NUM],len[NUM];
 int sumlen = 0;
 
 for(i = 0;i < NUM;i++)
 {
 a[i] = arr[i];
}
sort_uni_before(a); 

printf("單向掃描\t");
for(i = 0;i < NUM;i++)
{
if(i != NUM-1)
{
printf("%3d->",a[i]);
}
else
{
printf("%3d\t",a[i]);
}
}

for(i = 0;i < NUM;i++)
{
if(i ==0)
{
len[i] = abs(a[0]-begin);
}
else if(a[i] < a[i-1])
{
len[i] = abs(a[i] - a[i-1]);
}
else
{
len[i] = a[i-1]+N-a[i];
}

sumlen += len[i];
if(i != NUM-1)
{
printf("%3d+",len[i]);
}
else
{
printf("%3d=%d",len[i],sumlen);
}
}
 printf("\n\n");
 }
 
 void sort_uni_before(int a[])
 {
 int i,j,tmp;
 
 for(i = 0;i < NUM;i++)
 {
 if(a[i] > begin)
 {
 a[i] -= N;
}
}

for(i = 0;i < NUM-1;i++)
{
for(j = i+1;j < NUM;j++)
{
if(a[i] < a[j])
{
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}

for(i = 0;i < NUM;i++)
{
if(a[i] <= 0)
{
a[i] += N;
}
//printf("%d ",a[i]);
}
 }
 
 void sort_uni(int a[])
 {
 int i,j,tmp;
 
 for(i = 0;i < NUM;i++)
 {
 if(a[i] < begin)
 {
 a[i] += N;
}
}

for(i = 0;i < NUM-1;i++)
{
for(j = i+1;j < NUM;j++)
{
if(a[i] > a[j])
{
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}

for(i = 0;i < NUM;i++)
{
if(a[i] >= N)
{
a[i] -= N;
}
//printf("%d ",a[i]);
}
 }
 
 void elevator(int arr[])
 {
 if(begin > before)
 {
 elevator_later(arr);
}
else
{
elevator_before(arr);
}
 }
 
 void elevator_later(int arr[])
 {
 int i;
 int a[NUM];
 int len[NUM],sumlen = 0; 
 
 for(i = 0;i < NUM;i++)
 {
 a[i] = arr[i];
}
sort_elevator(a);

printf("電梯排程\t");
for(i = 0;i < NUM;i++)
{
if(i != NUM-1)
{
printf("%3d->",a[i]);
}
else
{
printf("%3d\t",a[i]);
}
}

for(i = 0;i < NUM;i++)
{
if(i ==0)
{
len[i] = a[0]-begin;
}
else if(a[i] > a[i-1])
{
len[i] = a[i] - a[i-1];
}
else
{
len[i] = a[i-1]-a[i];
}

sumlen += len[i];
if(i != NUM-1)
{
printf("%3d+",len[i]);
}
else
{
printf("%3d=%d",len[i],sumlen);
}
}

printf("\n\n");
 }
 
 void elevator_before(int arr[])
 {
 int i;
 int a[NUM];
 int len[NUM],sumlen = 0; 
 
 for(i = 0;i < NUM;i++)
 {
 a[i] = arr[i];
}
sort_elevator_before(a);

printf("電梯排程\t");
for(i = 0;i < NUM;i++)
{
if(i != NUM-1)
{
printf("%3d->",a[i]);
}
else
{
printf("%3d\t",a[i]);
}
}

for(i = 0;i < NUM;i++)
{
if(i ==0)
{
len[i] = abs(a[0]-begin);
}
else if(a[i] < a[i-1])
{
len[i] = a[i-1] - a[i];
}
else
{
len[i] = a[i]-a[i-1];
}

sumlen += len[i];
if(i != NUM-1)
{
printf("%3d+",len[i]);
}
else
{
printf("%3d=%d",len[i],sumlen);
}
}

printf("\n\n");
 }
 
 void sort_elevator(int a[])
 {
 int i,j,tmp,tmp_i;
 
 for(i = 0;i < NUM;i++)
 {
 if(a[i] < begin)
 {
 a[i] += N;
}
}

for(i = 0;i < NUM-1;i++)
{
for(j = i+1;j < NUM;j++)
{
if(a[i] > a[j])
{
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}

for(i = 0;i < NUM;i++)
{
if(a[i] >= N)
{
a[i] -= N;
}
}
i = 0 ;
while(a[i]>begin)
{
i++;
}
tmp_i = i;
for(i = tmp_i;i < NUM-1;i++)
{
for(j = i+1;j < NUM;j++)
{
if(a[i] < a[j])
{
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}
 }
 
 void sort_elevator_before(int a[])
 {
 int i,j,tmp,tmp_i;
 
 for(i = 0;i < NUM;i++)
 {
 if(a[i] > begin)
 {
 a[i] -= N;
}
}

for(i = 0;i < NUM-1;i++)
{
for(j = i+1;j < NUM;j++)
{
if(a[i] < a[j])
{
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}

for(i = 0;i < NUM;i++)
{
if(a[i] < 0)
{
a[i] += N;
}
}

i = 0 ;
while(a[i]<begin)
{
i++;
}

tmp_i = i;
for(i = tmp_i;i < NUM-1;i++)
{
for(j = i+1;j < NUM;j++)
{
if(a[i] > a[j])
{
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}



 }