48594 (608669), страница 2
Текст из файла (страница 2)
System.out.println("Время моделирования:" +d);
}
}
2.Queue1.java.
package DEJaView.modelLibs.a;
import DEJaView.core.*;
import java.util.*;
/** Класс, реализующий работу очереди сообщений (требований) */
public class Queue1 extends AtomicPDEVS {
/**Счётчик, подсчитывающий число пакетов в очереди*/
public int numOfMessages = 0;
/** Флаг, показывающий свободен ли сервер */
private boolean serverIsFree = true;
public int vozvrat;
public int skvoz=0;
public int num=0;
public int max=0;
/** Создает объект Queue с заданным именем
* @param name имя создаваемого объекта ксласса Client */
protected Queue1(String name) {
super(name);
/* Объекты класса Queue могут находится в одном из 5-тии
* состояний, в зависимости от количесва сообщений в очереди
*/
addState("free");
addState("full");
}
/** Инициализация компонента */
protected void init() {
/* Описание системного порта */
Port p;
/* Задание начального времени */
this.setLastTime(0);
/* Задание начального состояния */
this.setPresentState(findState("free"));
/* Далее генерируем начальное системное сообщение */
MessagePDEVS init_m = new MessagePDEVS("", Double.POSITIVE_INFINITY, this.getLastTime());
/* Далее передаем системное сообщение сообщение в очередь сообщений
* мультикомпонента, непосредственно содержащего данный компонент: */
/* 1. Назначение порта */
p = resolveOutPort("system");
/* 2. Назначение сообщения */
p.setMessage(init_m);
/* 3. Собственно передача сообщения */
this.getParentMULC().getProcessor().PassMessage(this.getName(), p.getName());
}
/** Функция продвижения времени */
protected double ta() {
return Double.POSITIVE_INFINITY;
}
/** Внутренняя функция транзакции */
protected State delta_int() {
return this.getPresentState();
}
/** Внешняя функция транзакции */
protected State delta_ext() {
State newState = null;
/* Если сообщение пришло от сервера, то оно означает, что сервер готов обслуживать
* следующее сообщение (требование). В таком случае, если в очереди есть сообщения
* (требования), переходим в очереди новое состояние: уменьшаем количество сообщений
* (требований), ожидающих в обслуживания очереди на 1. */
if (this.getCurrentPort().getName().equals("fromNext")) {
serverIsFree = true;
/* Если в очереди было одно сообщение (требование), то теперь там не будет ни одного */
if (this.getPresentState().getName().equals("full")) {
newState = this.getPresentState();
if(numOfMessages==1)
newState = findState("free");
}
else
/* Если в очереди было два сообщения (требования), то теперь там будет одно */
if (this.getPresentState().getName().equals("free")) {
newState = this.getPresentState();
}
}
else
/* Если сообщение (требование) пришло от клиента, то если очередь не заполнена,
* "вставляем" это сообщение (требование) в очередь, переходя в новое состояние */
if (this.getCurrentPort().getName().equals("fromMessageGenerator")){
num++;
if(!serverIsFree){
/* Если в очереди было пять сообщений (требований), то их там и останется пять */
if (this.getPresentState().getName().equals("full")){
numOfMessages++;
newState=this.getPresentState();
}
else
/* Если в очереди не было сообщений (требований), то теперь там будет одно */
if (this.getPresentState().getName().equals("free")) {
numOfMessages++;
newState=findState("full");
}
}
else
if(serverIsFree){
/*проверить ещё надо*/
newState=findState("free");
/* serverIsFree=false;*/
/*serverIsFree=false;*/
}
}
else
if(this.getCurrentPort().getName().equals("Vozvrat")){
num++;
if(!serverIsFree){
/* Если в очереди было пять сообщений (требований), то их там и останется пять */
if (this.getPresentState().getName().equals("full")){
numOfMessages++;
newState=this.getPresentState();
}
else
/* Если в очереди не было сообщений (требований), то теперь там будет одно */
if (this.getPresentState().getName().equals("free")) {
numOfMessages++;
newState=findState("full");
}
}
else
if(serverIsFree){
/*проверить ещё надо*/
newState=findState("free");
}
}
else newState = this.getPresentState();
return newState;
}
/** Выходная функция (создания списка выходных событий) */
protected LinkedList lambda() {
LinkedList list = new LinkedList();
MessagePort mp1 = new MessagePort();
MessagePDEVS msg1 = new MessagePDEVS();
/* System.out.println("Очередь 1");*/
/* Реакция на сообщения от клиента */
if (this.getCurrentPort().getType().equals("fromMessageGenerator")) {
/* Если сообщение от клиента приходит в тот момент, когда очередь была пуста, а сервер
* свободен, тогда формируется и отправляется на обработку сообщение серверу */
if ((this.getPresentState().getName().equals("free")))
{
if(serverIsFree) {
/* Занимаем сервер */
serverIsFree = false;
skvoz++;
/* Установка метки времени */
msg1.setTimeStamp(this.getCurrentPort().getMessage().getTimeStamp());
/* Назначение выходного порта */
mp1.setPort("toNext");
/* Текст для отладки и трассировки */
msg1.setData("from Queue to Server");
/* Назначение сообщения на выходной порт */
mp1.setMessage(msg1);
/* Добавление в список выходных событий */
list.add(mp1);
return list;
}
}
}
else
/* Реакция на сообщение от сервера. Очередь реагирует на сообщения от сервера о том,
* что сервер свободен, только тогда, когда очередь не пуста */
if(this.getCurrentPort().getType().equals("fromNext")) {
if(this.getPresentState().getName().equals("full") || (numOfMessages==1)){
/* Занимаем сервер */
serverIsFree = false;
/* Установка метки времени */
msg1.setTimeStamp(this.getCurrentPort().getMessage().getTimeStamp());
/* Назначение выходного порта */
mp1.setPort("toNext");
/* Текст для отладки и трассировки */
msg1.setData("from Queue to Server");
/* Назначение сообщения на выходной порт */
mp1.setMessage(msg1);
/* Добавление в список выходных событий */
list.add(mp1);
numOfMessages--;
return list;
}
}
else
if(this.getCurrentPort().getType().equals("Vozvrat")) {
vozvrat++;
/* Если сообщение от клиента приходит в тот момент, когда очередь была пуста, а сервер
* свободен, тогда формируется и отправляется на обработку сообщение серверу */
if ((this.getPresentState().getName().equals("free")) && (serverIsFree)) {
/* Занимаем сервер */
serverIsFree = false;
skvoz++;
/* Установка метки времени */
msg1.setTimeStamp(this.getCurrentPort().getMessage().getTimeStamp());
/* Назначение выходного порта */
mp1.setPort("toNext");
/* Текст для отладки и трассировки */
msg1.setData("from Queue to Server");
/* Назначение сообщения на выходной порт */
mp1.setMessage(msg1);
/* Добавление в список выходных событий */
list.add(mp1);
return list;
}
}
if(max max=numOfMessages; return list; } /** Конфликтная функция транзакции (пуста) */ protected String confluent() { return "external"; } } 3.Server1.java. package DEJaView.modelLibs.a; import DEJaView.core.*; import java.util.*; import java.util.Random; /** Класс, реализующий работу сервера, обрабатывающего сообщения (требования) */ public class Server1 extends AtomicPDEVS { /** Параметр распределения, интенсивность потока */ private final static double sigma = 1.0; private final static double P = 0.95; private double V; public int vozvrat; /** Вспомогательная переменная */ private double ta; Random ra = new Random(); /** Создает объект Server с заданным именем * @param name имя создаваемого объекта ксласса Server */ protected Server1(String name) { super(name); /* Объекты класса Server могут находиться в одном из двух состояний, в зависимости * от того, занят сервер обработкой сообщения (требования) или нет */ addState("busy"); addState("free"); } /** Инициализация компонента */ protected void init() { /* Описание системного порта */ Port p; /* Задание начального времени */ this.setLastTime(0); /* Задание начального состояния */ this.setPresentState(findState("free")); /* Далее генерируем начальное системное сообщение */ MessagePDEVS init_m = new MessagePDEVS("", Double.POSITIVE_INFINITY, this.getLastTime()); /* Далее передаем системное сообщение сообщение в очередь сообщений * мультикомпонента, непосредственно содержащего данный компонент: */ /* 1. Назначение порта */ p = resolveOutPort("system"); /* 2. Назначение сообщения */ p.setMessage(init_m); /* 3. Собственно передача сообщения */ this.getParentMULC().getProcessor().PassMessage(this.getName(), p.getName()); } protected double ta() { if (this.getPresentState().getName().equals("busy")) { ta = Generator.genExp(sigma); return ta; } else return Double.POSITIVE_INFINITY; } protected State delta_int() { return this.getPresentState(); } protected State delta_ext() { State newState = findState("busy"); return newState; } protected LinkedList lambda() { LinkedList list = new LinkedList(); MessagePort mp1 = new MessagePort(); MessagePort mp2 = new MessagePort(); MessagePDEVS msg1 = new MessagePDEVS(); MessagePDEVS msg2 = new MessagePDEVS(); /* System.out.println("Сервер 1");*/ if (this.getCurrentPort().getType().equals("fromPrev")) { V=ra.nextDouble(); if((V msg1.setTimeStamp(this.getLastTime() + ta); mp1.setPort("toNext"); msg1.setData("from Server to Client: Message have being processing from" + this.getLastTime() + " till " + msg1.getTimeStamp()); mp1.setMessage(msg1); list.add(mp1); msg2.setTimeStamp(this.getLastTime()+ ta); msg2.setPriority(1); mp2.setPort("toPrev"); msg2.setData("from Server to Queue: Server is free"); mp2.setMessage(msg2); list.add(mp2); } else if(V>P){ msg1.setTimeStamp(this.getLastTime() + ta); mp1.setPort("Vozvrat"); vozvrat++; /* System.out.println("Возврат с первого сервера" +V);*/ msg1.setData("from Server to Queue1"); mp1.setMessage(msg1); list.add(mp1); msg2.setTimeStamp(this.getLastTime()+ ta); msg2.setPriority(1); mp2.setPort("toPrev"); msg2.setData("from Server to Queue: Server is free"); mp2.setMessage(msg2); list.add(mp2); } } return list; } protected String confluent() { return "external"; } } Вывод В ходе проделанной работы были изучены основы моделирования. Также мы получили практические навыки имитационного моделирования. Подробно был изучен PDEVS-формализм и пакет моделирования систем с дискретными событиями DEJaView. Исследованы принципы функционирования простейших моделей теории массового обслуживания. Разработан и реализован алгоритм функционирования одной из моделей теории массового обслуживания, описанной в терминах PDEVS под DEJaView.