package com.company;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Scanner;
class BankersAlgorithm {
private final int sourceKinds; //系统资源种类数
private final int proNums; //系统进程数目
private final int[] source; //初始资源数量
private final int[][] Max; //线程需要的最大资源数矩阵
private final int[][] Allocation; //已分配给线程的资源矩阵
private final int[][] Need; //需求矩阵
private final int[] Available; //资源剩余矩阵
private final int[] Work; //系统可提供给进程继续运行所需的各类资源数目
private final boolean[] finish; //判断状态
private final ArrayList<String> result; //输出结果
private final int[] reneed;
public BankersAlgorithm(int proNums, int sourceKinds, int[] source) { //对数组进行初始化
this.proNums = proNums;
this.sourceKinds = sourceKinds;
this.Available = source;
this.Max = new int[proNums][sourceKinds];
this.Allocation = new int[proNums][sourceKinds];
this.Need = new int[proNums][sourceKinds];
finish = new boolean[proNums];
this.reneed = new int[sourceKinds];
for (int i = 0; i < proNums; i++) {
this.Max[i] = new int[sourceKinds];
this.Allocation[i] = new int[sourceKinds];
this.Need[i] = new int[sourceKinds];
finish[i] = false;
}
this.source = new int[sourceKinds];
Work = new int[sourceKinds];
result = new ArrayList<>();
}
public void setMax(Scanner inMax) { //设置进程需要最大资源数
for (int i = 0; i < proNums; i++)
for (int j = 0; j < sourceKinds; j++) {
Max[i][j] = inMax.nextInt();
}
}
public void setAllocation(Scanner inAllo) { //设置初始已分配资源
for (int i = 0; i < proNums; i++)
for (int j = 0; j < sourceKinds; j++) {
Allocation[i][j] = inAllo.nextInt();
}
}
private void setNeed() { //计算need矩阵
for (int i = 0; i < proNums; i++) {
for (int j = 0; j < sourceKinds; j++) {
Need[i][j] = Max[i][j] - Allocation[i][j]; //需求矩阵
//System.out.print(Need[i][j] + " ");
}
// System.out.println();
}
for (int i = 0; i < sourceKinds; i++) { //计算剩余资源矩阵
int sum = 0;
for (int j = 0; j < proNums; j++)
sum += Allocation[j][i];
source[i] = Available[i] + sum;
}
// for (int i = 0; i < sourceKinds; i++)
// System.out.println(source[i]);
System.arraycopy(Available, 0, Work, 0, Available.length);
}
public void setreneed(Scanner inAli) {
int i = inAli.nextInt();
i = i-1;
for (int k = 0; k < sourceKinds; k++) {
reneed[k] = inAli.nextInt();
}
for (int k = 0; k < sourceKinds; k++) {
Allocation[i][k] += reneed[k];
Available[k] -=reneed[k];
}
for (int k = 0; k < sourceKinds; k++){
System.out.print("占有:"+Allocation[i][k]);
System.out.println("资源剩余"+Available[k]);
}
}
private void findSafeSequence(int k, JTextArea out_result) {
//找所有的安全序列算法
if (k == proNums) { //当遍历到深度为proNums,表示找到安全序列,进行输出
for (int i = 0; i < result.size(); i++)
out_result.append("P" + result.get(i) + " ");
out_result.append("\n");
return;
}
for (int i = 0; i < proNums; i++) {
if (!finish[i]) {
boolean task = true;
for (int j = 0; j < sourceKinds; j++) {
if (Need[i][j] > Work[j])
task = false;
}
if (task) { //满足要求,对数据修改
for (int j = 0; j < sourceKinds; j++)
Work[j] += Allocation[i][j];
finish[i] = true;
result.add(i + "");
findSafeSequence(k + 1, out_result); //递归进入下一层
result.remove((result.size() - 1)); //回退该层,并进行数据还原
for (int j = 0; j < sourceKinds; j++)
Work[j] -= Allocation[i][j];
finish[i] = false;
}
}
}
}
public void initInput(Scanner inMax, Scanner inAllo, JTextArea out_result) { //将初始化以及寻找安全序列函数整合到一起
setMax(inMax);
setAllocation(inAllo);
setNeed();
findSafeSequence(0, out_result);
int num = out_result.getLineCount();
out_result.append("安全序列个数:" + String.valueOf(num - 2) + "\n");
}
public void initInput_2(Scanner inMax, Scanner inAllo, JTextArea out_result,Scanner inAli){
setMax(inMax);
setAllocation(inAllo);
setreneed(inAli);
setNeed();
findSafeSequence(0, out_result);
int num = out_result.getLineCount();
out_result.append("安全序列个数:" + String.valueOf(num - 2) + "\n");
}
}
class Pframe { //界面
JFrame frame;
JButton start;
JTextArea in_souNum, in_souInit, in_proNum, in_Max, in_Allo, out_result, in_Ali;
JLabel l_souNum, l_souInit, l_proNum, l_Max, l_Allo, l_result, l_Ali;
JScrollPane scroll;
JButton work, work1;
JPanel panel;
Pframe(String title) { //简单界面及其布局
frame = new JFrame(title);
frame.setSize(720, 480);
frame.setLayout(null);
in_souNum = new JTextArea(5, 20); //资源类别数
in_souInit = new JTextArea(6, 20); //每类资源的个数
in_proNum = new JTextArea(6, 20); //进程数目
in_Max = new JTextArea(6, 20); //最大需求矩阵
in_Allo = new JTextArea(6, 20); //分配矩阵
in_Ali = new JTextArea(5, 20);
out_result = new JTextArea(6, 20);
l_souNum = new JLabel("请输入资源类别数:");
l_souInit = new JLabel("请输入可用资源矩阵(空格隔开):");
l_proNum = new JLabel("请输入进程数目:");
l_Max = new JLabel("请输入最大需求矩阵(空格隔开):");
l_Allo = new JLabel("请输入已经分配矩阵(空格隔开):");
l_Ali = new JLabel("输入进程号和请求(空格隔开):");
l_result = new JLabel("运行结果如下:");
work = new JButton("开始执行");
work1 = new JButton("改动后执行");
scroll = new JScrollPane(out_result);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
frame.add(l_souNum);
l_souNum.setBounds(30, 25, 180, 25);
frame.add(in_souNum);
in_souNum.setBounds(30, 50, 180, 25);
frame.add(l_souInit);
l_souInit.setBounds(30, 75, 180, 25);
frame.add(in_souInit);
in_souInit.setBounds(30, 100, 180, 25);
frame.add(l_proNum);
l_proNum.setBounds(240, 75, 180, 25);
frame.add(in_proNum);
in_proNum.setBounds(