銀行家演算法
封裝類:BankArithmetic
package bank;
import java.io.File;
import java.io.FileInputStream;
import java.util.*;
public class BankArithmetic {
private static List<Integer> defaultAvailable;
private static Map<Integer, List<Integer>> need;
private static Map<Integer, List<Integer>> allocation;
private static Map<Integer, List<Integer>> max;
private static int Pi,Ri;
/**
* init
*/
public static void openArithmetic() throws Exception {
Properties pt = new Properties();
pt.load(new FileInputStream(new File(BankArithmetic.class
.getResource("/").getPath()+ "/bank/BankInput.properties")));
// input Pi and Ri split by space
Pi = Integer.valueOf(pt.getProperty("pi"));
Ri = Integer.valueOf(pt.getProperty("ri"));
// input Pi allocation
allocation = new HashMap<Integer, List<Integer>>();
for(int i=0; i<Pi; i++){
List<Integer> ri = new ArrayList<Integer>();
for(int j=0; j<Ri; j++){
ri.add(Integer.valueOf(pt.getProperty("p"+i+"allocation").split(",")[j]));
}
allocation.put(i,ri);
}
// input Pi max
max = new HashMap<Integer, List<Integer>>();
for(int i=0; i<Pi; i++){
List<Integer> ri = new ArrayList<Integer>();
for(int j=0; j<Ri; j++){
ri.add(Integer.valueOf(pt.getProperty("p"+i+"max").split(",")[j]));
}
max.put(i,ri);
}
// input Ri residue
List<Integer> available = new ArrayList<Integer>();
for(int i=0; i<Ri; i++){
available.add(Integer.valueOf(pt.getProperty("available").split(",")[i]));
}
defaultAvailable = new ArrayList<Integer>(available);
invokeArithmetic(available);
}
/**
* prepare to execute
*/
private static void invokeArithmetic(List<Integer> available){
need = new HashMap<Integer, List<Integer>>();
Map<Integer,Boolean> isVisited = new HashMap<Integer,Boolean>();
// calculate pi need
List<Integer> piNeed,piMax,piAllocation;
for(int pi=0; pi<Pi; pi++){
isVisited.put(pi,false);
piNeed = new ArrayList<Integer>();
piMax = max.get(pi);
piAllocation = allocation.get(pi);
for(int ri = 0; ri < Ri; ri++){
// need_i = max_i - allocation_i
piNeed.add(piMax.get(ri)-piAllocation.get(ri));
}
need.put(pi,piNeed);
}
Queue<Integer> array = new LinkedList<Integer>();
// execute
executeArithmetic(available,array,isVisited);
}
/**
* bank arithmetic real method
*/
private static void executeArithmetic(List<Integer> work,Queue<Integer> array
,Map<Integer,Boolean> isVisited){
List<Integer> allow = new ArrayList<Integer>();
// find allow
for(int pi = 0; pi<Pi; pi++){
boolean isBig = false;
for(int ri = 0; ri<Ri; ri++){
// ri > worki
if(need.get(pi).get(ri) > work.get(ri)){
isBig = true;
break;
}
}
if(!isBig && !isVisited.get(pi)){
allow.add(pi);
}
}
int allowSize = allow.size();
if(allowSize == 0){
displayArray(array);
}
//
for(int i=0; i<allowSize; i++){
int pi = allow.get(i);
// for(int ri = 0; ri)
List<Integer> cwork = new ArrayList<Integer>();
for (int ri=0; ri<Ri; ri++){
// work_i = work_i + allocation_i
cwork.add(allocation.get(pi).get(ri)+work.get(ri));
}
Queue<Integer> carray = new LinkedList<Integer>(array);
carray.add(pi);
Map<Integer,Boolean> cisVisited = new HashMap<Integer,Boolean>(isVisited);
cisVisited.put(pi,true);
executeArithmetic(cwork,carray,cisVisited);
}
}
/**
* display the process
*/
private static void displayArray(Queue<Integer> array){
int arraySize = array.size();
int pi,workSize,needSize,allocationSize;
List<Integer> work = new ArrayList<Integer>(defaultAvailable);
System.out.println("Start");
for(int i=0; i<arraySize; i++){
pi = array.remove();
System.out.println("P"+pi+": ");
System.out.print("work: "+work+" "+"need: "+need.get(pi)+" "+"allocation: "+allocation.get(pi));
System.out.print(" ");
System.out.print("work+allocation: [");
List<Integer> tempWork = new ArrayList<Integer>(work);
workSize = tempWork.size();
work.clear();
for(int j=0; j<workSize; j++){
System.out.print(tempWork.get(j)+allocation.get(pi).get(j));
if(j != workSize-1)
System.out.print(", ");
work.add(tempWork.get(j)+allocation.get(pi).get(j));
}
System.out.println("]");
}
System.out.println("END\n");
}
}
properties檔案
# pi = $pi 表示有$pi個程式
pi = 5
# ri = $i 表示有$ri個資源
ri = 4
# p(i)allocation = $r0,$r1,$r2,$r3,... 表示pi已經分配了r0資源$r0,r1資源$r1,....
p0allocation = 3,0,1,4
p1allocation = 2,2,1,0
p2allocation = 3,1,2,1
p3allocation = 0,5,1,0
p4allocation = 4,2,1,2
# p(i)max = $r0,$r1,$r2,$r3,... 表示pi最多分配r0資源$r0,r1資源$r1,....
p0max = 5,1,1,7
p1max = 3,2,1,1
p2max = 3,3,2,1
p3max = 4,6,1,2
p4max = 6,3,2,5
# available = $r0,$r1,$r2,$r3,... 表示r0資源還剩下$r0,r1資源還剩下$r1,...
available = 1,0,0,2
目錄結構:
執行:
結果:
相關文章
- 【作業系統】銀行家演算法作業系統演算法
- [作業系統]銀行家演算法作業系統演算法
- 作業系統實驗:銀行家演算法(C語言)作業系統演算法C語言
- 【作業系統】銀行家演算法實現(C語言)作業系統演算法C語言
- 用java語言,模擬實現作業系統的銀行家演算法。Java作業系統演算法
- java中的四捨五入-銀行家舍入法Java
- 中國人民銀行:2021年第三季度銀行家問卷調查
- 中國銀行業協會&普華永道:2019中國銀行家調查報告行業
- 車行家
- 作業系統綜合題之“銀行家演算法,畫出試分配後的資源分配狀態圖”作業系統演算法
- “銀行家演算法”大揭祕!在前端表格中利用自定義公式實現“四捨六入五成雙”演算法前端公式
- 普華永道:2020年中國銀行家調查報告
- 中國人民銀行:2020年第三季度銀行家問卷調查報告
- 作業系統綜合題之“銀行家演算法,計算各資源總數和Need還需要數量”作業系統演算法
- 中國人民銀行:2019年第一季度銀行家問卷調查報告
- 中國人民銀行:2023年第一季度銀行家問卷調查報告
- 新馬耳他銀行家協會主席稱讚區塊鏈技術區塊鏈
- 銀行家們將貿易融資視為區塊鏈的最佳選擇區塊鏈
- 央行:2019年第四季度銀行家問卷調查報告
- 做銀行家裡的資料專家:ING探索大資料時代下的金融最佳實踐大資料
- 許多瑞士銀行家和金融監管機構退出傳統金融行業加入加密貨幣領域行業加密
- 急急急!百萬獎金急求技術行家
- 作業系統(5) 死鎖的概念 死鎖產生的必要條件 死鎖的處理策略 預防死鎖 避免死鎖 死鎖的檢測和解除 銀行家演算法作業系統演算法
- 只有行家才懂得客服行業內幕,快來get!行業
- 「金三銀四」| 手撕排序演算法(JavaScript 實現)(上)排序演算法JavaScript
- PHP中關於銀行卡號通用校驗演算法總結PHP演算法
- 回收水銀,淘砂金水銀,淘沙金水銀
- 淘金水銀,水銀價格,回收廢舊水銀
- 洗金水銀用途,批發淘金水銀,沙金水銀
- 水銀求購價格,求購水銀,工業水銀,水銀價錢,購買水銀,購買水銀價格,水銀哪裡有賣,水銀報價多少錢
- 洗金水銀用途,批發淘金水銀,藥用水銀,水銀生產廠家
- 淘砂金水銀,淘沙金水銀,儀器儀表水銀,水銀溫度計,水銀體溫計
- 優質水銀,水銀價格,廢舊水銀回收
- 水銀價格,藥用水銀,水銀生產廠家
- 水銀有什麼用途,優質水銀價格,優質水銀,水銀價格,廢舊水銀回收
- 水銀回收處理,淘砂金專用水銀,水銀有什麼用,金礦淘金水銀,鎦金水銀汞出廠現貨水銀銷售水銀價格
- 行家 | 如何跨領域成為一位人工智慧工程師?人工智慧工程師
- 金礦用水銀提煉黃金,金礦水銀,水銀回收,淘金水銀價格