Джава - Java
Формулировка задачи:
Помогите въехать в код и напишите пожалуйста комментарии к коду
Вот само задание:
1.выполнить по тактовую визуализацию системы обслуживания заявок с распределенным ресурсом, параметрами системы является диапазон весов заявок, диапазон интервалов возникновения следующей заявки (интенсивность входящего потока), диапазон приоритетов (для приоритетных дисциплин обслуживания). В систему может поступать любое количество заявок.
2. Если система обслуживания с очередями, то количество очередей не больше 32. Если система обслуживания с приоритетами, то число приоритетов не более 32.
3. Построить графики зависимости среднего времени ожидания от интенсивности входящего потока заявок и зависимость процента простой ресурса от интенсивности входящего потока заявок.
4. Для приоритетных систем построить график зависимости среднего времени ожидания от приоритета при фиксированной интенсивности входящего потока заявок.
Вот код программы:import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class Request {
private int weight;
private int priority;
private int processed;
private int inTime;
private int outTime;
public Request(int weight, int priority, int inTime) {
this.weight = weight;
this.priority = priority;
this.inTime = inTime;
processed=0;
}
public int getWeight() {
return weight;
}
public int getPriority() {
return priority;
}
public void incProcessed() {
processed++;
}
public int getProcessed() {
return processed;
}
public void setInTime(int inTime) {
this.inTime = inTime;
}
public void setOutTime(int outTime) {
this.outTime = outTime;
}
public int getInTime() {
return inTime;
}
public int getOutTime() {
return outTime;
}
}
public class Queue {
private int n;
private Request[] queue;
private int defaultPriority;
public Queue(int defaultPriority, int n) {
this.defaultPriority=defaultPriority;
this.n=n;
queue = new Request[n];
}
public void addRequest(Request request) {
int i=n;
do {
i--;
}
while ((i>0)&(queue[i]!=null));
if ((i==0)&(queue[i]!=null)) {
ExtendQueue(2*n);
i=n/2-1;
}
queue[i]=request;
}
public String getQueue() {
String res = "";
for (int i=n-1;i>=0;i--) {
if (queue[i]!=null) {
res=res+queue[i].getProcessed()+"/"+queue[i].getWeight()+ " ";
}
}
return res;
}
public boolean isEmpty() {
if (queue[n-1]==null) {
return true;
}
else
return false;
}
public Request ExtractRequest() {
Request request;
request=queue[n-1];
for (int i=n-2;i>=0; i--) {
queue[i+1]=queue[i];
}
queue[0]=null;
return request;
}
public void ExtendQueue(int n) {
Request[] newQueue = new Request[n];
for (int i=this.n-1; i>=0;i--) {
newQueue[i+n-this.n]=queue[i];
}
queue=newQueue;
this.n=n;
}
}
public class QueueBlock {
private Queue[] queueBlock;
private int number;
private int minPriority;
public QueueBlock(int n, int minPriority) {
number = n+1;
this.minPriority = minPriority;
queueBlock = new Queue[number];
BlockInitialization();
}
private void BlockInitialization() {
for (int i=0;i<number;i++) {
queueBlock[i] = new Queue(i+minPriority,1);
}
}
public void addRequestWithFilter(Request request) {
queueBlock[request.getPriority()-minPriority].addRequest(request);
}
public void addRequestDirectly(Request request, int queueNumber) {
queueBlock[queueNumber].addRequest(request);
}
public String getBlock() {
String res = "";
for (int i=0;i<number;i++) {
res=res+("Приоритет: "+(i+minPriority)+" | ");
res=res+queueBlock[i].getQueue()+"\n";
}
return res;
}
public Request ExtractMaxPriorityRequest() {
int i = -1;
do {
i++;
}
while ((i<number-1)&(queueBlock[i].isEmpty()));
if (queueBlock[number-1]!=null) {
if (i!=number-1)
return queueBlock[i].ExtractRequest();
else
return queueBlock[number-1].ExtractRequest();
}
else
return null;
}
public int getMinPriority() {
return minPriority;
}
public int getQueueNumber() {
return number;
}
}
public class Resource {
private Request currentRequest;
private int processingTime;
private int quant;
private int idleTime = 0;
private boolean occupied = false;
private QueueBlock queue;
private int counter = 0;
private Form form;
private int[] priorities;
private short[] number;
public Resource(Form form, QueueBlock queue, int quant) {
this.form = form;
this.queue = queue;
this.quant = quant;
priorities = new int[queue.getMinPriority()+queue.getQueueNumber()+1];
number = new short[queue.getMinPriority()+queue.getQueueNumber()+1];
for (int i=0;i<priorities.length;i++) {
priorities[i]=0;
number[i] = 0;
}
}
public void setRequest(Request request) {
currentRequest = request;
processingTime = 0;
if (request!=null) {
occupied = true;
}
else
occupied = false;
}
public void processOneTact() {
if (occupied) {
currentRequest.incProcessed();
processingTime++;
if (currentRequest.getProcessed()>=currentRequest.getWeight()) {
currentRequest.setOutTime(form.getTime());
form.addWaitingTime(currentRequest.getOutTime()-currentRequest.getInTime()-currentRequest.getWeight());
int waitingTime=(form.getTime()-currentRequest.getInTime()-currentRequest.getWeight());
priorities[currentRequest.getPriority()]+=waitingTime;
number[currentRequest.getPriority()]++;
setRequest(queue.ExtractMaxPriorityRequest());
form.setRequestsNumber(form.getRequestsNumber()-1);
counter++;
}
if (processingTime>=quant) {
queue.addRequestDirectly(currentRequest, currentRequest.getPriority()-queue.getMinPriority());
setRequest(queue.ExtractMaxPriorityRequest());
}
}
else {
idleTime++;
setRequest(queue.ExtractMaxPriorityRequest());
}
}
public Request getCurrentRequest() {
return currentRequest;
}
public int getQuant() {
return quant;
}
public int getProcessingTime() {
return processingTime;
}
public int getIdleTime() {
return idleTime;
}
public void setIdleTime(int time) {
idleTime = time;
}
public int getProcessedNumber() {
return counter;
}
public void setQueue(QueueBlock queue) {
this.queue=queue;
}
public int[] getPriorityArray() {
return priorities;
}
public short[] getProcessedNumberWithPriorities() {
return number;
}
}
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.*;
public class Graph extends JFrame{
protected short[] value;
protected Form form;
protected String x,y;
public Graph(Form form, short[] value, String x, String y) {
super("График");
this.form=form;
setSize(510, 600);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setResizable(false);
this.value = value;
this.x=x;
this.y=y;
setVisible(true);
}
public void paint(Graphics g) {
g.setColor(Color.BLACK);
DrawAxises(g);
g.drawOval(50, 580-value[1]*2,1,1);
if ((580-value[1]*2)<30) {
g.drawString(String.valueOf(value[1]),70,60);
}
g.drawString(String.valueOf(value[1]),60,580-value[1]*2);
for (int i=form.getIMin()+1; i<=form.getIMax(); i++) {
g.setColor(Color.BLACK);
if ((value[i]!=32767)) {
g.drawOval(40+i*10, 580-value[i]*2, 1, 1);
}
g.setColor(Color.RED);
if (value[i-1]!=32767) {
g.drawLine(40+(i-1)*10, 580-value[i-1]*2, 40+(i)*10, 580-value[i]*2);
}
}
}
public void DrawAxises(Graphics g) {
g.drawString(y,10,40);
g.drawString(x,410,593);
g.drawLine(40, 40, 40, 580);
g.drawLine(40, 580, 480, 580);
for (int i=0; i<27;i++) {
g.drawString(String.valueOf(i*10),15,580-i*20);
g.drawLine(38,580-i*20,42,580-i*20);
}
for (int i=0; i<9; i++) {
g.drawString(String.valueOf(i*4),40+i*40,593);
g.drawLine(40+i*40, 582, 40+i*40, 578);
}
for (int i=9; i<12;i++) {
g.drawString(String.valueOf(i*4),40+i*40, 578);
g.drawLine(40+i*40, 582, 40+i*40, 578);
}
}
}
import java.awt.Color;
import java.awt.Graphics;
public class Graph2 extends Graph {
public Graph2(Form form,short[] value, String x, String y) {
super(form,value,x,y);
setSize(510,300);
}
public void paint(Graphics g) {
g.setColor(Color.BLACK);
DrawAxises(g);
g.drawOval(50, 280-value[1]*2,1,1);
g.drawString(String.valueOf(value[form.getIMax()-1]),40+(form.getIMax()-1)*10,280-value[form.getIMax()-1]*2);
for (int i=form.getIMin()+1; i<form.getIMax(); i++) {
g.setColor(Color.BLACK);
g.drawOval(40+i*10, 280-value[i]*2, 1, 1);
g.setColor(Color.RED);
g.drawLine(40+(i-1)*10, 280-value[i-1]*2, 40+(i)*10, 280-value[i]*2);
}
}
public void DrawAxises(Graphics g) {
g.drawString(y,10,40);
g.drawString(x,410,293);
g.drawLine(40, 40, 40, 280);
g.drawLine(40, 280, 480, 280);
for (int i=0; i<11;i++) {
g.drawString(String.valueOf(i*10),15,280-i*20);
g.drawLine(38,280-i*20,42,280-i*20);
}
for (int i=0; i<9; i++) {
g.drawString(String.valueOf(i*4),40+i*40,293);
g.drawLine(40+i*40, 282, 40+i*40, 278);
}
for (int i=9; i<12;i++) {
g.drawString(String.valueOf(i*4),40+i*40, 278);
g.drawLine(40+i*40, 282, 40+i*40, 278);
}
}
}Решение задачи: «Джава»
textual
Листинг программы
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class Graph3 extends JFrame {
protected int value[];
protected Form form;
protected String x,y;
public Graph3(Form form, int[] value, String x, String y) {
super("График зависимости ср. времени ожидания от приоритета заявок");
this.form=form;
this.x=x;
this.y=y;
this.value=value;
setSize(700, 610);
setVisible(true);
}
public void paint(Graphics g) {
g.setColor(Color.BLACK);
DrawAxises(g);
g.drawOval(40+form.getPrMin()*20, 580-value[form.getPrMin()],1,1);
g.drawString(String.valueOf(value[form.getPrMin()]),38+20, 578-value[form.getPrMin()]);
for (int i=form.getPrMin()+1; i<=form.getPrMax(); i++) {
g.setColor(Color.BLACK);
g.drawOval(40+i*20, 580-value[i], 1, 1);
g.setColor(Color.RED);
g.drawLine(40+(i-1)*20, 580-value[i-1], 40+(i)*20, 580-value[i]);
g.setColor(Color.BLACK);
g.drawString(String.valueOf(value[i]),38+i*20, 578-value[i]);
}
}
public void DrawAxises(Graphics g) {
g.drawString(y,10,40);
g.drawString(x,610,593);
g.drawLine(40, 40, 40, 580);
g.drawLine(40, 580, 680, 580);
for (int i=0; i<27;i++) {
g.drawString(String.valueOf(i*20),15,580-i*20);
g.drawLine(38,580-i*20,42,580-i*20);
}
for (int i=0; i<13; i++) {
g.drawString(String.valueOf(2*i),40+i*40,593);
g.drawLine(40+i*40, 582, 40+i*40, 578);
}
for (int i=13; i<16;i++) {
g.drawString(String.valueOf(2*i),40+i*40, 578);
g.drawLine(40+i*40, 582, 40+i*40, 578);
}
}
}
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.LineBorder;
public class Form extends JFrame {
private JLabel iminLabel = new JLabel("Мин. t поступления: ");
private JLabel imaxLabel = new JLabel("Макс. t поступления: ");
private JTextField imin = new JTextField(5);
private JTextField imax = new JTextField(5);
private JLabel wminLabel = new JLabel("Мин. вес: ");
private JLabel wmaxLabel = new JLabel("Макс. вес: ");
private JTextField wmin = new JTextField(5);
private JTextField wmax = new JTextField(5);
private JLabel prminLabel = new JLabel("Мин. приоритет: ");
private JLabel prmaxLabel = new JLabel("Макс. приоритет: ");
private JTextField prmin = new JTextField(5);
private JTextField prmax = new JTextField(5);
private JPanel iPanel = new JPanel();
private JPanel wPanel = new JPanel();
private JPanel prPanel = new JPanel();
private JPanel fieldsPanel = new JPanel();
private JPanel buttonsPanel = new JPanel();
private JPanel textPanel = new JPanel();
private JTextArea area = new JTextArea(20,50);
private JScrollPane scroll = new JScrollPane(area);
private JButton tact = new JButton("Выполнить такт");
private JButton graph1 = new JButton("График Тож(I)");
private JButton graph2 = new JButton("График idle(I)");
private JButton graph3 = new JButton("График Тож(Pr)");
private JButton graphs = new JButton("Построение графиков");
private JButton init = new JButton("Задать значения");
private JTextField quant = new JTextField(5);
private JLabel quantLabel = new JLabel("Квант времени: ");
private JPanel quantPanel = new JPanel();
private JButton values = new JButton("Задать новые значения");
private JLabel nLabel = new JLabel("Кол-во тактов: ");
private JTextField nField = new JTextField(5);
//------------------------------------------------------------------//
private int iminValue;
private int imaxValue;
private int wminValue;
private int wmaxValue;
private int prminValue;
private int prmaxValue;
private int time = 0;
private int waitingTime;
private int quantValue;
private int waitingTime_all=0;
private int requestsNum = 0;
private QueueBlock queue;
private Resource resource;
public Form() {
super("Lab3");
setSize(600,500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Interface();
setVisible(true);
init.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
Init();
setFieldsEditable(false);
init.setVisible(false);
tact.setVisible(true);
graphs.setVisible(true);
values.setVisible(true);
}
});
tact.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
ExecuteOneTact(queue, resource);
Visualisation(queue, resource);
}
});
values.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
values.setVisible(false);
setFieldsEditable(true);
graph1.setVisible(false);
graph2.setVisible(false);
graph3.setVisible(false);
graphs.setVisible(false);
tact.setVisible(false);
init.setVisible(true);
}
});
graphs.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
tact.setVisible(false);
nField.setEditable(true);
graphs.setVisible(false);
graph1.setVisible(true);
graph2.setVisible(true);
graph3.setVisible(true);
values.setVisible(true);
}
});
graph1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
int min = iminValue;
int max = imaxValue;
short[] array = new short[imaxValue+iminValue+1];
for (int i=1;i<=max;i++) {
imaxValue=i;
iminValue=i;
QueueBlock testBlock = new QueueBlock(prmaxValue-prminValue,prminValue);
resource.setQueue(testBlock);
resource.setRequest(null);
for (short j=0;j<Integer.parseInt(nField.getText());j++) {
ExecuteOneTact(testBlock, resource);
}
array[iminValue]=(short)(waitingTime_all/resource.getProcessedNumber());
waitingTime_all=0;
}
iminValue=min;
imaxValue=max;
resource.setQueue(queue);
Init();
new Graph(Form.this, array, "Тпоступления","Tожидания");
}
});
graph2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
int min = iminValue;
int max = imaxValue;
short[] array = new short[imaxValue+iminValue+1];
for (int i=1;i<max;i++) {
imaxValue=i;
iminValue=i;
QueueBlock testBlock = new QueueBlock(prmaxValue-prminValue,prminValue);
resource.setQueue(testBlock);
resource.setRequest(null);
for (short j=0;j<Integer.parseInt(nField.getText());j++) {
ExecuteOneTact(testBlock, resource);
}
array[iminValue]=(short)(((float)resource.getIdleTime()/time)*100);
time=0;
resource.setIdleTime(0);
}
iminValue=min;
imaxValue=max;
resource.setQueue(queue);
Init();
new Graph2(Form.this, array, "Тпоступления","% простоя");
}
});
graph3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
Init();
QueueBlock testBlock = new QueueBlock(prmaxValue-prminValue,prminValue);
resource.setQueue(testBlock);
resource.setRequest(null);
for (short j=0;j<Integer.parseInt(nField.getText());j++) {
ExecuteOneTact(testBlock, resource );
}
int[] array = resource.getPriorityArray();
short[] numbers = resource.getProcessedNumberWithPriorities();
Request r;
while ((r = testBlock.ExtractMaxPriorityRequest())!=null) {
numbers[r.getPriority()]++;
array[r.getPriority()]+=getTime()-r.getInTime()-r.getProcessed();
}
for (int i=1;i<array.length; i++) {
if (numbers[i]!=0) {
array[i]/=numbers[i];
}
}
resource.setQueue(queue);
new Graph3(Form.this, array, "Приоритет","Тожидания");
}
});
}
public void Interface() {
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
getContentPane().add(fieldsPanel);
getContentPane().add(buttonsPanel);
getContentPane().add(textPanel);
fieldsPanel.setBorder(new LineBorder(Color.BLACK));
fieldsPanel.add(iPanel);
fieldsPanel.add(wPanel);
fieldsPanel.add(prPanel);
fieldsPanel.add(quantPanel);
iPanel.setLayout(new BoxLayout(iPanel, BoxLayout.Y_AXIS));
wPanel.setLayout(new BoxLayout(wPanel, BoxLayout.Y_AXIS));
prPanel.setLayout(new BoxLayout(prPanel, BoxLayout.Y_AXIS));
quantPanel.setLayout(new BoxLayout(quantPanel, BoxLayout.Y_AXIS));
iPanel.add(iminLabel);
iPanel.add(imin);
iPanel.add(imaxLabel);
iPanel.add(imax);
wPanel.add(wminLabel);
wPanel.add(wmin);
wPanel.add(wmaxLabel);
wPanel.add(wmax);
prPanel.add(prminLabel);
prPanel.add(prmin);
prPanel.add(prmaxLabel);
prPanel.add(prmax);
quantPanel.add(quantLabel);
quantPanel.add(quant);
quantPanel.add(nLabel);
quantPanel.add(nField);
nField.setText("30000");
nField.setEditable(false);
buttonsPanel.setBorder(new LineBorder(Color.BLUE));
buttonsPanel.add(init);
tact.setVisible(false);
graphs.setVisible(false);
values.setVisible(false);
graph1.setVisible(false);
graph2.setVisible(false);
graph3.setVisible(false);
buttonsPanel.add(tact);
buttonsPanel.add(graphs);
tact.setToolTipText("Выполнить один такт");
graph1.setToolTipText("Построить график зависимости среднего времени ожидания от интенсивности поступления заявок");
graph2.setToolTipText("Построить график зависимости процента простоя ресурса от интенсивности поступления заявок");
graph3.setToolTipText("Построить график зависимости среднего времени ожидания от приоритета");
buttonsPanel.add(graph1);
buttonsPanel.add(graph2);
buttonsPanel.add(graph3);
buttonsPanel.add(values);
textPanel.add(scroll);
area.setEditable(false);
setVisible(true);
}
private void Init() {
time = 0;
requestsNum = 0;
iminValue = Integer.parseInt(imin.getText());
imaxValue = Integer.parseInt(imax.getText());
wminValue = Integer.parseInt(wmin.getText());
wmaxValue = Integer.parseInt(wmax.getText());
prminValue = Integer.parseInt(prmin.getText());
prmaxValue = Integer.parseInt(prmax.getText());
quantValue = Integer.parseInt(quant.getText());
queue = new QueueBlock(prmaxValue-prminValue, prminValue);
waitingTime = iminValue+(int)(Math.round(Math.random()*(imaxValue-iminValue)));
resource = new Resource(this, queue, quantValue);
resource.setRequest(null);
}
public void ExecuteOneTact(QueueBlock queue, Resource resource) {
resource.processOneTact();
time++;
waitingTime--;
if (waitingTime == 0) {
queue.addRequestWithFilter(new Request(wminValue+(int)(Math.round(Math.random()*(wmaxValue-wminValue))),prminValue+(int)(Math.round(Math.random()*(prmaxValue-prminValue))),time));
requestsNum+=1;
waitingTime = iminValue+(int)(Math.round(Math.random()*(imaxValue-iminValue)));
}
}
public void Visualisation(QueueBlock queue, Resource resource) {
area.setText(queue.getBlock());
if (resource.getCurrentRequest()!=null) {
area.append("Обработка текущей заявки: "+resource.getCurrentRequest().getProcessed()+"/"+resource.getCurrentRequest().getWeight()+ "(Приоритет: "+ resource.getCurrentRequest().getPriority()+") \n");
area.append("Квант: "+String.valueOf(resource.getQuant())+ "\n");
area.append("Время пребывания текущей заявки на ресурсе "+String.valueOf(resource.getProcessingTime())+"\n");
}
else {
area.append("Ресурс простаивает. Общее время простоя: "+String.valueOf(resource.getIdleTime())+ "\n");
area.append("Процент простоя: "+ ((float)resource.getIdleTime()/time)*100 +"\n");
}
area.append("Общее время работы системы: "+getTime()+" \n");
area.append("Текущее кол-во заявок в системе: "+getRequestsNumber()+"\n");
area.append("Заявок обработано: "+resource.getProcessedNumber()+"\n");
}
public void addWaitingTime(int time) {
waitingTime_all+=time;
}
public int getRequestsNumber() {
return requestsNum;
}
public void setRequestsNumber(int num) {
requestsNum = num;
}
public int getTime() {
return time;
}
public int getIMin() {
return iminValue;
}
public int getIMax() {
return imaxValue;
}
public void setFieldsEditable(boolean value) {
imin.setEditable(value);
imax.setEditable(value);
wmin.setEditable(value);
wmax.setEditable(value);
prmin.setEditable(value);
prmax.setEditable(value);
quant.setEditable(value);
}
public int getPrMin() {
return prminValue;
}
public int getPrMax() {
return prmaxValue;
}
public static void main(String[] args) {
new Form();
}
}