1. 这段代码那里错了
首先你的排序函数是不对的,具体错在你的交换a[i]和a[small]的值上,下面是我改的代码:
void SelectSort(int a[],int n)
{
int i,j,small;
int temp;//temp是需要的。
for(i=0;i<n-1;i++)
{
small=i;//设第i个数据元素关键字最小
for(j=i+1;j<n;j++)//寻找关键字最小的数据元素
if(a[j]<a[small]) small=j;//记住最小元素的下标
if(small!=i)//当前最小元素的下标不为i是交换位置
{
temp = a[i]; //楼主错在这里
a[i]=a[small];
a[small]=temp;
}
}
}
其次电梯调度部分写得很混乱,错误很多,这里先来指出楼主的错误。
void SCAN(int a[],int m,int direction){
int k=0,j=0,i;
int temp[m];//存放磁道的调度顺序号
//int cur;//临时变量,用于记录调度的起始磁道位置
if(direction==0)//磁头向磁道号增加的方向移动
{
for(;k<m;k++)
{
if(b[k]>=StartTrack)
{
//下面楼主开始犯错误了
//for(;k==m-1;k++)temp[k]=b[k];//楼主的源代码,这里他犯了2个错误
//1、是for循环的条件,他写的k==m-1,如果是这样的话,那么循环一次也不会进行。
//2、直接把b[k]上的值赋给了temp[k],注意此时k不是0...
//下面是修改后的代码
for(i=0;k+1<m;i++)
{
temp[i]=b[k+i];
}
//在这里程序是不完整的,电梯这里只是走到了序号最大的地点,楼主的想法是想直接转到else部分,其实他没有理解if else到底是什么意思。。。
}
else if(k==m-1)//楼主此处假设初始位置到顶了
{
direction=1;//省略部分代码//这里不知道楼主省了什么代码,不过单是一个direction=1是无法完成算法的,程序不会转到else部分
int n;
for(n=i;i>0;i--,n++)
{
temp[n]=b[i];
}
}
}
}
else//磁头向磁道号减少的方向移动
{
for(;k<m;k++)
{
if(b[k]>StartTrack)
{
//这里楼主犯错了for(;k==0;k--)temp[k]=b[k];//省略部分代码//理由同上
for(i=0;k>0;i++){
temp[i]=b[k-1-i]; //修改好的代码
}
//理由同上面相应部分
}
else if(k==m-1)
{
direction=0;//省略部分代码
//此处理由同前相应部分
}
}
}
}
总结一下,楼主对 交换2个参量的值,条件判断语句, for循环方面的知识需要加强。
下面贴出正确的电梯调度代码:
本人使用的C++写的,使用C语言的话,需要替换相应的代码,如cout 换成相应的 printf()
经测试可以通过。
#include<iostream>
int StartTrack=143;
void SelectSort(int[],int);
void SCAN(int[],int,int);
void display(int[],int);
int get_Position(int[],int,int);
int scanUP(int[] , int , int[] , int , int );
int scanDOWN(int[] , int , int[] , int , int);
void main()
{
int a[10] = {11,99,200,176,56,33,188,210,34,46};
SelectSort( a , 10 );
SCAN( a , 10 , 1);
}
void SelectSort(int a[] , const int a_size)
{
int i,j,small;
int temp;
for(i=0;i<a_size-1;i++)
{
small=i;//设第i个数据元素关键字最小
for( j = i + 1 ; j < a_size ; j++)//寻找关键字最小的数据元素
if( a[j] < a[small] ) small = j;//记住最小元素的下标
if( small != i)//当前最小元素的下标不为i是交换位置
{
temp = a[i];
a[i] = a[small];
a[small] = temp;
}
}
}
void display(int a[] ,const int a_size)
{
using namespace std;
for (int i = 0; i < a_size ; i++)
{
cout<<a[i]<<" ";
}
cout<<"\n";
cin.get();
cin.get();
}
void SCAN(int a[] ,const int a_size , int direction)
{
int result_Array[10];
int channel_number = StartTrack;
int current_pos = get_Position( a , a_size , channel_number );
if( direction == 0){
int pos = scanUP( a , a_size , result_Array , 0 , current_pos);
scanDOWN( a , a_size ,result_Array , pos , current_pos );
}
else {
int pos = scanDOWN( a , a_size , result_Array , 0 , current_pos);
scanUP( a , a_size ,result_Array , pos , current_pos );
}
display(result_Array , a_size);
}
/*
get_Position
This function return the position that the value
of this position in array a[] is larger than the StartTrack
*/
int get_Position(int a[] ,int a_size , int channel_number)
{
for(int i = 0 ; i < a_size ; i++ )
{
if( a[i] > channel_number) return i;
}
return a_size;
}
/*
Scan up
a[] is the array to be scaned.
a_size is the size of the array.
result[] is the array to store the result.
result_tear is the last position that the position of result[] is empty.
*/
int scanUP(int a[] , int a_size , int result[] , int result_tear , int start_position)
{
int i = 0;
for( ; start_position + i < a_size ;i++)
{
result[ result_tear + i] = a [start_position + i];
}
return i + result_tear;
}
/*
Scan down
a[] is the array to be scaned.
a_size is the size of the array.
result[] is the array to store the result.
result_tear is the last position that the position of result[] is empty.
*/
int scanDOWN(int a[] , int a_size , int result[] , int result_tear , int start_position)
{
int i = 0 ;
for( ; start_position - i > 0 ;i++)
{
result[i + result_tear] = a [start_position - 1 - i];
}
return i + result_tear;
}
2. 操作系统模拟电梯调度算法C语言程序
多级反馈队列调度算法 多级反馈队列调度算法是一种CPU处理机调度算法,UNIX操作系统采取的便是这种调度算法。 多级反馈队列调度算法即能使高优先级的作业得到响应又能使短作业(进程)迅速完成。(对比一下FCFS与高优先响应比调度算法的缺陷)。 多级(假设为N级)反馈队列调度算法可以如下原理: 1、设有N个队列(Q1,Q2....QN),其中各个队列对于处理机的优先级是不一样的,也就是说位于各个队列中的作业(进程)的优先级也是不一样的。一般来说,优先级Priority(Q1) > Priority(Q2) > ... > Priority(QN)。怎么讲,位于Q1中的任何一个作业(进程)都要比Q2中的任何一个作业(进程)相对于CPU的优先级要高(也就是说,Q1中的作业一定要比Q2中的作业先被处理机调度),依次类推其它的队列。 2、对于某个特定的队列来说,里面是遵循时间片轮转法。也就是说,位于队列Q2中有N个作业,它们的运行时间是通过Q2这个队列所设定的时间片来确定的(为了便于理解,我们也可以认为特定队列中的作业的优先级是按照FCFS来调度的)。 3、各个队列的时间片是一样的吗?不一样,这就是该算法设计的精妙之处。各个队列的时间片是随着优先级的增加而减少的,也就是说,优先级越高的队列中它的时间片就越短。同时,为了便于那些超大作业的完成,最后一个队列QN(优先级最高的队列)的时间片一般很大(不需要考虑这个问题)。 多级反馈队列调度算法描述: 1、进程在进入待调度的队列等待时,首先进入优先级最高的Q1等待。 2、首先调度优先级高的队列中的进程。若高优先级中队列中已没有调度的进程,则调度次优先级队列中的进程。例如:Q1,Q2,Q3三个队列,只有在Q1中没有进程等待时才去调度Q2,同理,只有Q1,Q2都为空时才会去调度Q3。 3、对于同一个队列中的各个进程,按照时间片轮转法调度。比如Q1队列的时间片为N,那么Q1中的作业在经历了N个时间片后若还没有完成,则进入Q2队列等待,若Q2的时间片用完后作业还不能完成,一直进入下一级队列,直至完成。 4、在低优先级的队列中的进程在运行时,又有新到达的作业,那么在运行完这个时间片后,CPU马上分配给新到达的作业(抢占式)。 我们来看一下该算法是如何运作的: 假设系统中有3个反馈队列Q1,Q2,Q3,时间片分别为2,4,8。 现在有3个作业J1,J2,J3分别在时间 0 ,1,3时刻到达。而它们所需要的CPU时间分别是3,2,1个时间片。 1、时刻0 J1到达。于是进入到队列1 , 运行1个时间片 , 时间片还未到,此时J2到达。 2、时刻1 J2到达。 由于时间片仍然由J1掌控,于是等待。 J1在运行了1个时间片后,已经完成了在Q1中的 2个时间片的限制,于是J1置于Q2等待被调度。现在处理机分配给J2。 3、时刻2 J1进入Q2等待调度,J2获得CPU开始运行。 4、时刻3 J3到达,由于J2的时间片未到,故J3在Q1等待调度,J1也在Q2等待调度。 5、时刻4 J2处理完成,由于J3,J1都在等待调度,但是J3所在的队列比J1所在的队列的优先级要高,于是J3被调度,J1继续在Q2等待。 6、时刻5 J3经过1个时间片,完成。 7、时刻6 由于Q1已经空闲,于是开始调度Q2中的作业,则J1得到处理器开始运行。 8、时刻7 J1再经过一个时间片,完成了任务。于是整个调度过程结束。
3. 电梯调度算法...
不管你是在北上广还是在港澳台,甚至三四线城市,凡是有规模的地区,高楼比比皆是。不管是写字楼,还是大型商城,让你最头痛的就是乘电梯,尤其是在赶时间的时候。
每天早上,那些差5分钟就迟到的程序员,在等电梯时,一般会做两件事:
前者可能是写字楼里上班族惯有的精神类疾病,但后者肯定是程序员的职业病。本文对“骂电梯”不给予任何指导性建议。
但说起电梯调度算法,我觉得还是可以给大家科普一下,好为大家在等电梯之余,打发时间而做出一点贡献。
(电梯调度算法可以参考各种硬盘换道算法,下面内容整理自网络)
先来先服务(FCFS-First Come First Serve)算法,是一种随即服务算法,它不仅仅没有对寻找楼层进行优化,也没有实时性的特征,它是一种最简单的电梯调度算法。
它根据乘客请求乘坐电梯的先后次序进行调度。此算法的 优点是公平、简单,且每个乘客的请求都能依次地得到处理,不会出现某一乘客的请求长期得不到满足的情况 。
这种方法在载荷较轻松的环境下,性能尚可接受,但是在载荷较大的情况下,这种算法的性能就会严重下降,甚至恶化。
人们之所以研究这种在载荷较大的情况下几乎不可用的算法,有两个原因:
最短寻找楼层时间优先(SSTF-Shortest Seek Time First)算法,它注重电梯寻找楼层的优化。最短寻找楼层时间优先算法选择下一个服务对象的原则是 最短寻找楼层的时间。
这样请求队列中距当前能够最先到达的楼层的请求信号就是下一个服务对象。
在重载荷的情况下,最短寻找楼层时间优先算法的平均响应时间较短,但响应时间的方差较大 ,原因是队列中的某些请求可能长时间得不到响应,出现所谓的“ 饿死”现象 。
扫描算法(SCAN) 是一种按照楼层顺序依次服务请求,它让电梯在最底层和最顶层之间连续往返运行,在运行过程中响应处在于电梯运行方向相同的各楼层上的请求。
它进行寻找楼层的优化,效率比较高,但它是一个 非实时算法 。扫描算法较好地解决了电梯移动的问题,在这个算法中,每个电梯响应乘客请求使乘客获得服务的次序是由其发出请求的乘客的位置与当前电梯位置之间的距离来决定的。
所有的与电梯运行方向相同的乘客的请求在一次电向上运行或向下运行的过程中完成, 免去了电梯频繁的来回移动 。
扫描算法的平均响应时间比最短寻找楼层时间优先算法长,但是响应时间方差比最短寻找楼层时间优先算法小, 从统计学角度来讲,扫描算法要比最短寻找楼层时间优先算法稳定 。
LOOK 算法是扫描算法(SCAN)的一种改进。对LOOK算法而言,电梯同样在最底层和最顶层之间运行。
但 当 LOOK 算法发现电梯所移动的方向上不再有请求时立即改变运行方向 ,而扫描算法则需要移动到最底层或者最顶层时才改变运行方向。
SATF(Shortest Access Time First)算法与 SSTF 算法的思想类似,唯一的区别就是 SATF 算法将 SSTF 算法中的寻找楼层时间改成了访问时间。
这是因为电梯技术发展到今天,寻找楼层的时间已经有了很大地改进, 但是电梯的运行当中等待乘客上梯时间却不是人为可以控制 。
SATF 算法考虑到了电梯运行过程中乘客上梯时间的影响 。
最早截止期优先(EDF-Earliest Deadline First)调度算法是最简单的实时电梯调度算法,它的 缺点就是造成电梯任意地寻找楼层,导致极低的电梯吞吐率。
它与 FCFS 调度算法类似,EDF 算法是电梯实时调度算法中最简单的调度算法。 它响应请求队列中时限最早的请求,是其它实时电梯调度算法性能衡量的基准和特例。
SCAN-EDF 算法是 SCAN 算法和 EDF 算法相结合的产物。SCAN-EDF 算法先按照 EDF 算法选择请求列队中哪一个是下一个服务对象,而对于具有相同时限的请求,则按照 SCAN 算法服务每一个请求。它的效率取决于有相同 deadline 的数目,因而效率是有限的。
PI(Priority Inversion)算法将请求队列中的请求分成两个优先级,它首先保证高优先级队列中的请求得到及时响应,再搞优先级队列为空的情况下在相应地优先级队列中的请求。
FD-SCAN(Feasible Deadline SCAN)算法首先从请求队列中找出时限最早、从当前位置开始移动又可以买足其时限要求的请求,作为下一次 SCAN 的方向。
并在电梯所在楼层向该请求信号运行的过程中响应处在与电梯运行方向相同且电梯可以经过的请求信号。
这种算法忽略了用 SCAN 算法相应其它请求的开销,因此并不能确保服务对象时限最终得到满足。
以上两结介绍了几种简单的电梯调度算法。
但是并不是说目前电梯调度只发展到这个层次。目前电梯的控制技术已经进入了电梯群控的时代。
随着微机在电梯系统中的应用和人工智能技术的发展,智能群控技术得以迅速发展起来。
由此,电梯的群控方面陆续发展出了一批新方法,包括:基于专家系统的电梯群控方法、基于模糊逻辑的电梯群控方法、基于遗产算法的电梯群控方法、基于胜景网络的电梯群控方法和基于模糊神经网络的电梯群控方法。
本人设置的电梯的初始状态,是对住宅楼的电梯的设置。
(1)建筑共有21层,其中含有地下一层(地下一层为停车场)。
(2)建筑内部设有两部电梯,编号分别为A梯、B梯。
(3)电梯内部有23个按钮,其中包括开门按钮、关门按钮和楼层按钮,编号为-1,1,2,3,4……20。
(4)电梯外部含有两个按钮,即向上运行按钮和向下运行按钮。建筑顶层与地下一层例外,建筑顶层只设置有向下运行按钮,地下一层只设置有向上运行按钮。
(5)电梯开关门完成时间设定为1秒。电梯到达每层后上下人的时间设定为8秒。电梯从静止开始运行到下一层的时间设置为2秒,而运行中通过一层的时间为1秒。
(6)在凌晨2:00——4:30之间,如若没有请求信号,A梯自动停在14层,B梯自动停在6层。
(7)当电梯下到-1层后,如果没有请求信号,电梯自动回到1层。
每一架电梯都有一个编号,以方便监控与维修。每一架电梯都有一实时监控器,负责监控电梯上下,向电梯升降盒发送启动、制动、加速、减速、开关电梯门的信号。若电梯发生故障,还应向相应的电梯负责人发送求救信号。
电梯内部的楼层按钮:
这样就表示乘客将要去往此层,电梯将开往相应层。当电梯到达该层后,按钮恢复可以使用状态。
电梯内部开门按钮:
如若电梯到了乘客曾经按下的楼层,但是无乘客按开门按钮,电梯将自动在停稳后1秒后自动开门。
电梯内部关门按钮:
电梯外部向上按钮:
电梯外部向下按钮:
你肯能意识到 哪个算法都不是一个最佳方案,只是它确实解决了一定情况的问题 。但是对一个优秀的程序员而言,研究各种算法是无比快乐的。也许你下一次面试,就有关于调度算法的问题。
4. 电梯调度算法
(1)电梯调度算法的处理次序为:
58143627
(2)最短寻找时间优先算法的处理次序为:
58627143
5. 电梯调度算法
(1)电梯调度算法的处理次序为:
5
8
1
4
3
6
2
7
(2)最短寻找时间优先算法的处理次序为:
5
8
6
2
7
1
4
3
6. 求一个电梯的调度管理程序,c++的
/*建立一座两层楼,一部电梯的模拟程序。为简化起见,每部电梯限乘一人,电梯每天在一楼关门等待
模拟程序包括一个时钟,每天从零开始。模拟程序得调度器组件随机设置每一层第一个人到来的时间,当时钟的时间等于第一个人到来的时间时,模拟程序生成一个新到的人将该人放到这一层。然后这个人按下按钮,请求电梯开门。这个人的目的地楼层不能与他上电梯的楼层相同。
如果第一个人到达第一层,则可以在按下按钮、等待电梯开门之后立即进入电梯。如果第一个人在第2层,则电梯要升到第2层去接他。电梯从1层移到2层需要5秒。
电梯到达一层时,打开电梯门上的灯,并在电梯内发出铃声,该层的按钮和电梯中表示该层的按钮复位,电梯门打开,乘客走出电梯(如果有到该层的乘客)。另一乘客(如果该层有人等待)进入电梯按下目的层按钮,电梯们关上。电梯移动前确定移动方向(两层很容易判断),为简单起见,电梯到达一层直到关门所花时间为0。
任何时间每层最多只能有一人等待,如果新到的人(不在电梯中)要到达该层时该层被占用,则一秒后才能安排新到达者。假设每隔5到20秒人们随机到达每层*/
#include < iostream >
#include < ctime >
#include < iomanip >
#include < string >
#include <stdlib.h>
#include < windows.h >
using namespace std;
class person
{
public:
string sex; //定义人员类
person();
void newset();
};
person::person()
{ sex="man"; }
void person::newset()
{
int i;
srand((unsigned)time(NULL));
for(i=0;;i++)
{
if(rand()==1)
{sex="man"; break; }
if(rand()==2)
{sex="woman"; break; }
}
}
class elevator
{
public:
int now; //定义电梯类
elevator();
};
elevator::elevator()
{ now=1; }
class Time
{
public:
static void outtime() //定义时间类,用于输出电梯每次运行时的时间
{
SYSTEMTIME t;
GetLocalTime(& t);
cout<<" //"<<t.wYear<<"."<<t.wMonth<<"."<<t.wDay<<". "<<t.wHour<<":"<<t.wMinute<<":"<<t.wSecond<<endl;
}
};
void last(long n) //用于等待时输出.的函数
{
long i;
i=n/500;
for(i=0;i<n/500;i++)
{
cout<<'.'; Sleep(500);
}
cout<<endl;
}
void waiting()
{ long m; //模拟随机等待的时间函数
srand((unsigned)time(NULL));
cout<<"elevator waiting";
for(int i=0;i<1000;i++)
m=rand()%(20000-5000+1)+5000;
last(m);
}
void output(long t,person & p,elevator & e) //电梯模拟函数
{
static n=1; //定义乘客的个数
if( t==1) //有人在一楼按铃
{
p.newset();
if(e.now!=1) //但是此时电梯停留在二楼
{
cout<<"person "<<n<<"(a "<<setw(5)<<p.sex<<") arrived floor 1."; //输出有人到达一楼
Time::outtime(); //输出此时的准确时间
cout<<"elevator running";
last(5000);
cout<<"person "<<n<<"(a "<<setw(5)<<p.sex<<") enters elevator."; //输出乘客进入电梯
Time::outtime(); //输出此时的准确时间
cout<<"elevator running";
last(5000);
cout<<"person "<<n<<"(a "<<setw(5)<<p.sex<<") arrives floor 2."; //输入乘客到达二楼
Time::outtime(); //输出此时的准确时间
e.now=2;
n++;
system("color 0C"); waiting(); system("color 0F");
}
else //此时电梯就是一楼
{
cout<<"person "<<n<<"(a "<<setw(5)<<p.sex<<") arrives floor 1."; //输出有人到达一楼
Time::outtime(); //输出此时的准确时间
cout<<"person "<<n<<"(a "<<setw(5)<<p.sex<<") enters elevator."<<endl;
cout<<"elevator running";
last(5000);
cout<<"person "<<n<<"(a "<<setw(5)<<p.sex<<") arrives floor 2.";
Time::outtime();
e.now=2;
n++;
system("color 0C"); waiting(); system("color 0F");
}
}
if(t==2) //有人在二楼按铃
{
if(e.now!=2) //但是电梯此时不在二楼
{
cout<<"person "<<n<<"(a "<<setw(5)<<p.sex<<") arrived floor 2.";
Time::outtime();
cout<<"elevator running";
last(5000);
cout<<"person "<<n<<"(a "<<setw(5)<<p.sex<<") enters elevator.";
Time::outtime();
cout<<"elevator running";
last(5000);
cout<<"person "<<n<<"(a "<<setw(5)<<p.sex<<") arrives floor 1.";
Time::outtime();
e.now=1;
n++;
system("color 0C"); waiting(); system("color 0F");
}
else //此时电梯就是二楼
{
cout<<"person "<<n<<"(a "<<setw(5)<<p.sex<<") arrives floor 2.";
Time::outtime();
cout<<"person "<<n<<"(a "<<setw(5)<<p.sex<<") enters elevator.";
Time::outtime();
cout<<"elevator running";
last(5000);
cout<<"person "<<n<<"(a "<<setw(5)<<p.sex<<") arrives floor 1.";
Time::outtime();
e.now=1;
n++;
system("color 0C"); waiting(); system("color 0F");
}
}
}
int main()
{
cout.fill('*');
cout<<setw(80)<<'*';
cout.fill(' ');
system("color 0C");
cout<<setw(50)<<"***欢迎使用电梯模拟程序***"<<endl; //输出头菜单
cout.fill('*');
cout<<setw(80)<<'*';
cout.fill(' ');
int i;
person p;
elevator e;
srand((unsigned)time(NULL)); //定义随机数种
waiting();
system("color 0F");
for(i=0;;i++)
output(rand(),p,e); //调用电梯模拟函数
return 0;
}
7. 20分!求助大神,帮忙编个小程序。。。电梯调度算法模拟(用c语言编写)
可以做做看!
8. 求关于 多部电梯调度算法研究
这里是我 一些 想法 LZ可以看看 在这里 主要告诉你的是 C程序设计里面很重要的一个思想那就是 增量开发
首先设计 一个MAIN函数 确定要调用的函数 在函数里面 尽量使用指针变量,这是第一块
第二快: 电梯的初始化
第三快: RUNNING电梯的运行
第四快: 电梯的移动
第五快: 上和下
第六快: 用户的要求 也就是说 电梯到底是上 还是下的设计
第七快 延迟程序 也就说 等待的时间
第八块:STOP
按照这个思路的话,代码加起来有100多行的样子吧
还有就是 LZ在采用这个思路的时候 一定要对函数的运用 很上手啊
要不在调试的时候很容易出BUG的!
希望能帮到你!
9. 求大神帮忙,现有5个电梯,求如何调度电梯,实现最优化,求C语言代码求算法~~
只能告诉你原则性的东西
一 以时间最短为原则,哪台电梯响应某个呼梯所需时间最短,就派哪台电梯,还要考虑轿厢载荷情况
二 以目的层为前提控制,这是目前比较先进的派梯系统,每个乘客选择自己的目的层,系统收集所有的目的层和数量,计算各台电梯运行的组合,选择时间最短的。
10. 操作系统模拟电梯调度算法C语言程序
这是数学建模的题目,太难了。
只能给点提示,希望有用。一,用到随机函数。二,调度算法为FIFO和电梯调度。参考操作系统。三,文件io用到#include
<fstream>头文件