免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 972 | 回复: 0
打印 上一主题 下一主题

电梯调度算法(ms InterView) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-12 16:57 |只看该作者 |倒序浏览

               
移臂调度算法包括以下四种:
1) 先来先服务算法; (根据访问者提出访问请求的先后次序来决定执行次序。
2) 最短寻找时间优先调度算法;(从等待的访问者中挑选寻找时间最短的那个请求执行,而不管访问者的先后次序。
3) 电梯调度算法;(从移动臂当前位置沿移动方向选择最近的那个柱面的访问者来执行,若该方向上无请求访问时,就改变移动方向再选择。)
4) 单向扫描调度算法。 (从0柱面开始往里单向扫描,扫到哪个执行哪个。
 
               
               
               
                    
  */   
  //   t1.cpp   :   定义控制台应用程序的入口点。   
  //      
  #include   "stdafx.h"   
  #include"math.h"   
  #include"stdlib.h"   
  #include"string.h"   
  struct   Head   
  {   
          int   nPosition;   
          bool   bVisited;   
  };   
  void   Visit(struct   Head   *pHead)   
  {   
      printf("visite   cy:%d\n",pHead->nPosition);   
      pHead->bVisited=true;   
  }   
  int   ReadInputKeyboard(struct   Head   *pHead,int   *pCurrentPosition,int   nMaxNumber)   
  {   
      int   i;   
      printf("please   input   Current   position:");   
      scanf("%d",pCurrentPosition);   
      printf("please   input   will   visit   position:");   
      for(i=0;inMaxNumber;i++)   
      {   
          scanf("%d",&pHead.nPosition);   
          pHead.bVisited=false;   
          if(pHead.nPosition0)   
          break;   
      }   
      return   i;   
  }   
  int   ReadInputFile(struct   Head   *pHead,int   *pCurrentPosition,int   nMaxNumber)   
  {   
      int   i;   
      char   szFileName[256],*q,*p,szTemp[20];   
      printf("please   input   filename:");   
      scanf("%s",szFileName);   
    
      FILE   *pFile=fopen(szFileName,"r");   
      if(pFile==NULL)   
      {   
          printf("open   file   %s   error",szFileName);   
          return   -1;   
      }   
    
      for(i=0;!feof(pFile)   &&inMaxNumber;)   
      {   
          p=szFileName;   
          fgets(p,256,pFile);   
          while(q=strchr(p,','))   
          {   
              memset(szTemp,0,sizeof(szTemp)*sizeof(char));   
              strncpy(szTemp,p,q-p);   
              p=q+1;   
              if(i==0)   
                  *pCurrentPosition=atoi(szTemp);   
              else   
              {   
                  pHead[i-1].nPosition=atoi(szTemp);   
                  pHead[i-1].bVisited=false;   
              }   
              i++;   
          }   
          memset(szTemp,0,sizeof(szTemp)*sizeof(char));   
          pHead[i-1].nPosition=atoi(p);   
          pHead[i-1].bVisited=false;   
          //i++;      
      }   
      fclose(pFile);   
      return   i;   
  }   
    
  int   FifoVisit(int   nCurrentPosition,struct   Head   *pHead,int   nNumber)   
  {   
      //先来先服务   
      int   nHaveVisited=0;   
      int   nMoveDistance=0;   
      int   i;   
      while(nHaveVisitednNumber)   
      {   
          for(i=0;inNumber;i++)   
          {   
              if(pHead.bVisited)   
              continue;   
              Visit(&pHead);   
              nHaveVisited++;   
              nMoveDistance+=abs(nCurrentPosition-pHead.nPosition);   
              nCurrentPosition=pHead.nPosition;   
          }   
      }   
      printf("the   sum   of   move   distance:%d\n",nMoveDistance);   
      return   nMoveDistance;   
  }      
    
  int   SsfoVisit(int   nCurrentPosition,struct   Head   *pHead,int   nNumber)   
  {   
  //   最短寻找时间优先   
      int   nHaveVisited=0;   
      int   nMoveDistance=0;   
      int   nMinDistance=0;   
      int   nMinIndex=0;   
      int   i;   
      while(nHaveVisitednNumber)   
      {   
          nMinDistance=0xffff;   
          nMinIndex=0;   
          //找最小值   
          for(i=0;inNumber;i++)   
          {   
              if(pHead.bVisited)   
              continue;   
              if(nMinDistance>abs(pHead.nPosition-nCurrentPosition))   
              {   
                  nMinDistance=abs(pHead.nPosition-nCurrentPosition);   
                  nMinIndex=i;   
              }   
          }   
          //访问   
          Visit(&pHead[nMinIndex]);   
          nHaveVisited++;   
          nMoveDistance+=nMinDistance;   
          nCurrentPosition=pHead[nMinIndex].nPosition;   
      }   
      printf("the   sum   of   move   distance:%d\n",nMoveDistance);   
      return   nMoveDistance;   
  }   
  int   DtVisit(int   nCurrentPosition,bool   bOut,struct   Head   *pHead,int   nNumber)   
  {   
  //电梯调度算法   
      int   nHaveVisited=0;   
      int   nMoveDistance=0;   
      int   nMinDistance=0;   
      int   nMinIndex=0;   
      int   i;   
      while(nHaveVisitednNumber)   
      {   
          nMinDistance=0xffff;   
          nMinIndex=0;   
          //找最小值   
          for(i=0;inNumber;i++)   
          {   
              if(pHead.bVisited)   
              continue;   
              if(bOut&&pHead.nPositionnCurrentPosition||!bOut&&pHead.nPosition>nCurrentPosition)   
              {   
                  if(nMinDistance>abs(pHead.nPosition-nCurrentPosition))   
                  {   
                      nMinDistance=abs(pHead.nPosition-nCurrentPosition);   
                      nMinIndex=i;   
                  }   
              }      
          }   
          if(nMinDistance==0xffff)   
          {   
              bOut=!bOut;   
              continue;   
          }   
    
          //访问   
          Visit(&pHead[nMinIndex]);   
          nHaveVisited++;   
          nMoveDistance+=nMinDistance;   
          nCurrentPosition=pHead[nMinIndex].nPosition;   
      }   
         printf("the   sum   of   move   distance:%d\n",nMoveDistance);   
         return   nMoveDistance;   
  }   
  int   DxVisit(int   nCurrentPosition,struct   Head   *pHead,int   nNumber)   
  {   
          //单向调度算法   
      int   nHaveVisited=0;   
      int   nMoveDistance=0;   
      int   nMinDistance=0;   
      int   nMinIndex=0;   
      int   i;   
      while(nHaveVisitednNumber)   
      {   
          nMinDistance=0xffff;   
          nMinIndex=0;   
          //找最小值   
          for(i=0;inNumber;i++)   
          {   
              if(pHead.bVisited)   
              continue;   
              if(pHead.nPosition>nCurrentPosition   )   
              {   
                  if(nMinDistance>abs(pHead.nPosition-nCurrentPosition))   
                  {   
                      nMinDistance=abs(pHead.nPosition-nCurrentPosition);   
                      nMinIndex=i;   
                  }   
                  }      
          }   
         if(nMinDistance==0xffff)   
      {   
          nMoveDistance+=199-nCurrentPosition;   
          nCurrentPosition=0;   
          continue;   
      }   
    
      //访问   
          Visit(&pHead[nMinIndex]);   
      nHaveVisited++;   
      nMoveDistance+=nMinDistance;   
      nCurrentPosition=pHead[nMinIndex].nPosition;   
      }   
      printf("the   sum   of   move   distance:%d\n",nMoveDistance);   
      return   nMoveDistance;   
  }   
  int   main(int   argc,   char*   argv[])   
  {   
  //p114   
  struct   Head   mylist[20];//={98,false,183,false,37,false,122,false,14,false,124,false,65,false,67,false};   
  //int   nCurrentPosition=53;   
  //int   nRealNumber=8;   
    
  int   nCurrentPosition=0;   
  int   nRealNumber=ReadInputFile(mylist,&nCurrentPosition,20);   
  // FifoVisit(nCurrentPosition,mylist,nRealNumber);   
  // SsfoVisit(nCurrentPosition,mylist,nRealNumber);   
  //DtVisit(nCurrentPosition,false,mylist,nRealNumber);   
  DxVisit(nCurrentPosition,mylist,nRealNumber);   
    
  return   0;   
  }   
    
    
   


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/1586/showart_1860531.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP