移動臂排程演算法
阿新 • • 發佈:2018-12-26
#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;
}
}
}
}
#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;
}
}
}
}