銀行家演算法
封裝類: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
- 作業系統綜合題之“銀行家演算法,畫出試分配後的資源分配狀態圖”作業系統演算法
- “銀行家演算法”大揭祕!在前端表格中利用自定義公式實現“四捨六入五成雙”演算法前端公式
- 作業系統綜合題之“銀行家演算法,計算各資源總數和Need還需要數量”作業系統演算法
- 新馬耳他銀行家協會主席稱讚區塊鏈技術區塊鏈
- 銀行家們將貿易融資視為區塊鏈的最佳選擇區塊鏈
- 家庭銀行家 v2b53 破解、跟蹤和序號產生器(MASM32)ASM
- 做銀行家裡的資料專家:ING探索大資料時代下的金融最佳實踐大資料
- 許多瑞士銀行家和金融監管機構退出傳統金融行業加入加密貨幣領域行業加密
- 急急急!百萬獎金急求技術行家
- 作業系統(5) 死鎖的概念 死鎖產生的必要條件 死鎖的處理策略 預防死鎖 避免死鎖 死鎖的檢測和解除 銀行家演算法作業系統演算法
- 只有行家才懂得客服行業內幕,快來get!行業
- 「金三銀四」| 手撕排序演算法(JavaScript 實現)(上)排序演算法JavaScript
- 銀聯標準之MAC演算法實現(POS終端加密)Mac演算法加密
- PHP中關於銀行卡號通用校驗演算法總結PHP演算法
- 水銀回收處理,淘砂金專用水銀,水銀有什麼用,金礦淘金水銀,鎦金水銀汞出廠現貨水銀銷售水銀價格
- 電商爬蟲機器人大戰:防止被刺探情報 亞馬遜是行家QJ爬蟲機器人亞馬遜
- 中國銀行業協會:2014中國銀行家調查行業
- 儀器儀表水銀,水銀溫度計,水銀體溫計,水銀鍍金,汞的價格,水銀回收處理,淘砂金專用水銀
- 金礦為什麼用水銀提煉黃金,水銀有什麼用,金礦淘金水銀,水銀回收處理,淘砂金專用水銀
- 汞批發,水銀銷售價格,淘砂金專用水銀,廢水銀回收,回收處理汞,水銀回收
- 銀行存款
- 行家 | 如何跨領域成為一位人工智慧工程師?人工智慧工程師
- 評估統計演算法在銀行偽造鈔票檢測中的價值演算法
- Java:銀行利率Java
- 巴黎銀行面試面試
- 百度愛採購專業知識問答:知識營銷新行家ZKN
- 銀行swift code(銀行國際程式碼)簡介 (zt)Swift
- “資料+演算法”雙輪驅動,自助分析平臺助銀行實現“智慧轉型”演算法
- 水銀生產廠家銷售價格,淘砂金專用水銀,汞回收處理,分析純水銀,回收廢水銀,Hg:99.999%
- 直銷銀行將發展向何處?美國直銷銀行和整體銀行業對比行業