⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 银行家算法改进版.txt

📁 银行家算法的改进
💻 TXT
字号:
银行家算法改进版
/*程序中有几点值得注意的地方:
1、数据initial应该放在checkData()方法中,程序每次调用该方法是应该初始化数据,
    由于时间紧张所以没有写读数据的方法

2、程序只根据老师给的例子来写,不能灵活的适应资源种类数不同、进程数不同的情况

3、如果要对程序进行改写应该把注意力放在下面几点上:
   ⑴:增加一个函数用来求出没有重复数字的序列,参数只能是一个进程个数的整数,配合only()方法使用;
   ⑵:only()方法应该只传递一个整数序列,由程序自动分离数据并判断
   ⑶:该算法中可以用线程模拟进程的运行情况来获取资源,使该算法具有更大的适应性
   10.27:
   通过这两天的改进,对筛选所有进程排序的组合可以采用“全排列算法”,使程序可一通过pMax.length()
   获得进程数,然后把进程数传递进方法内就能得到所要的所有进程排列组合,然后再把这些组合一一的传递进
   另一个方法中,用与判断其安全性。
   
   10.28  全排列算法已改进到程序中
*/
public class Banker{
Banker()
{
  initArray();
  array(proSeq,0,pMax.length);
  if(sum>0)System.out.println("There are "+sum+" legality!");
}
public static int sum=0;
private int[][] pMax={
   {7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}
};

    int pr.length;//获取进程数
    
    int[] proSeq=new int[pMax.length];
    
    void initArray()
    {
     for(int i=0;i<pMax.length;i++) proSeq[ i ]=i;
    }

public static boolean checkData(int[] procs)
{
  //initial data
  int[][] pAllocation={
    {0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2} 
  };
  
  int[][] pNeed={
    {7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}
  };
  
  int[] Available={3,3,2};
  int[] ps;
  ps=procs;
  int i;
  for(i=0;i<5;i++)
  {
   if(Available[0]<pNeed[ps[ i ]][0]) return false;
   else if(Available[1]<pNeed[ps[ i ]][1]) return false;
   else if(Available[2]<pNeed[ps[ i ]][2]) return false;
   else{
    Available[0]=Available[0]+pAllocation[ps[ i ]][0];
    Available[1]=Available[1]+pAllocation[ps[ i ]][1];
    Available[2]=Available[2]+pAllocation[ps[ i ]][2];
    }
  }
  return true;
}

public static void array(int arr[],int count,int max)//cout表示第几位数排列完成max表示有几个数参与排列
{
  int a[]=arr;
  boolean put;
  if(count==max-1) //若数组中全部排完时
  {
   put=checkData(a);
   if(put){
    sum++;
    System.out.println("p"+a[0]+",p"+a[1]+",p"
     +a[2]+",p"+a[3]+",p"+a[4]+" is legality!");
    }
      }else{
       int b[]=new int[max]; //创建新数组,用于递归
          for(int i=0;i<count;i++) b[ i ]=a[ i ]; 
          int k=count;
          for(int i=count;i<max;i++)
          {
           b[k++]=a[ i ]; 
              for(int j=count;j<max;j++)
              {
                  if(i!=j) b[k++]=a[j];
                  }
              k=count;
                 array(b,count+1,max); 
           }
        }
}
/**
  * @param args
  */
public static void main(String[] args) {
  // TODO Auto-generated method stub
  Banker bankObj=new Banker();
}
}

来源:http://blog.csai.cn/user1/27650/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -