Имитационная модель участка обрабатывающего цеха

Построение имитационной модели системы массового обслуживания в среде Borland Delphi 7.0 с учетом того, что параметры модели – детерминированные величины. Моделирование случайных независимых величин и процессов. Оптимизация системы массового обслуживания.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 28.05.2013
Размер файла 1,4 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Введение

Исследование АСУ на всех этапах разработки, начиная с составления технического задания на проектирование по результатам обследования объектов управления и заканчивая внедрением АСУ в эксплуатацию, невозможно без использования методов моделирования на ЭВМ.

Реальные сложные системы, к числу которых относятся и современные АСУ, можно исследовать с помощью двух типов моделей: аналитических и имитационных. В аналитических моделях поведение сложных систем записывается в виде некоторых функциональных отношений или логических условий.

Когда явления в сложных системах настолько сложны и многообразны, что аналитическая модель становится слишком грубым приближением к действительности, то исследователь должен использовать имитационное моделирование. В имитационной модели поведение компонент сложной системы описывается набором алгоритмов, которые затем реализуют ситуации, возникающие в реальной системе.

Разработка хорошей имитационной модели часто обходится дороже создания аналитической модели и требует больше временных затрат, ее построение как правило себя оправдывает. Это объясняется тем, что такая модель позволяет гораздо точнее отразить протекание процессов в реальной сложной системе и описать поведение компонент сложной системы на высоком уровне детализации; исследовать динамику взаимодействия компонент во времени и пространстве параметров системы; изучить новые явления в системе, поведение которой имитируется.

Таким образом, имитационное моделирование является одним из наиболее широко используемых методов при решении задач анализа и синтеза сложных систем.

1. Постановка задачи

На ВЦ через интервалы времени t1 (мин) поступают задания длиной N (байт). Скорость ввода, вывода и обработки заданий - V (байт/мин). Задания проходят последовательно: ввод, обработку и вывод. Перед каж-дой операцией производится буферизация заданий в буферах К1 (байт), K2(байт), K3(байт). Задание, не вмещающееся в буфер, уничтожается. После вывода М заданий, все выведенные М заданий проверяются, и выясняется, что (%) из них оказывается выполнено неправильно вследствие сбоев. Все неправильно выполненные задания возвращаются на ввод и проходят вне очереди. Смоделировать работу ВЦ в течение недели.

Данные для детерминированной модели СМО: N=500, t1 =30, V = 100, М=10, = 10, К1 =2000, К2=2000, К3=2000.

Данные для стохастической модели СМО: t , V , N распределены нор-мально с параметрами mt =30 ,, mv = 100, , mN = 500 , ; возмущение является стационарным случайным процессом с нормальным законом распределения и интервалом разброса [0.. .20].

Варьируемые параметры: К1, К2, К3.

Показатели работы: количество уничтоженных заданий, средняя ем-кость пустующего пространства каждого из буферов.

2. Построение имитационной модели системы массового обслуживания

Данный раздел курсовой работы отведён для построение имитационной модели системы массового обслуживания, параметры которой являются детерминированными величинами

2.1 Графическая схема системы массового обслуживания

Определим сначала состав обслуживающих устройств и выясним, что является заявками.

Обслуживающими устройствами в представленной системе будут модули ввода, обработки и вывода, каждый из которых имеет свой буфер определенного объема. Заявками в данном случае являются поступающие задания, которые необходимо обработать.

Дисциплина обслуживания представляет собой живую очередь (список FIFO, первым пришел, первым ушёл (см. рис.1)).

Составим графическую схему вычислительной системы с указанием потока движения заявок. Графическая схема СМО поможет провести декомпозицию системы, исследовать функциональные действия и события, происходящие в системе, определить их последовательность и взаимосвязь и на основании этого сопоставить список активностей имитационной модели заданного объекта рис.2.

Рис.2. Графическая схема работы вычислительной системы

В качестве способа моделирования выберем просмотр активностей.

В качестве метода изменения модельного времени выберем пошаговое моделирование. Для потактового способа моделирования надо задать величину шага изменения модельного времени, который рекомендуется выбирать на порядок меньше самого малого временного интервала в условии задачи, следовательно, принимая во внимания, данные для детерминированной модели, приведенные в постановке задачи, зададимся шагом равным 1 мин.

Структура детерминированной модели СМО.

Активность 1 - Поступление задания.

Условие запуска - t'>t0+T, где t' - текущее время, t0 - последнее время поступления задания, T - промежуток времени между поступлением заданий.

Операторы: В1 - увеличивает количество пакетов в буфере, если есть достаточно места. В2 - фиксирует время (t0) t0=t'

Активность 2 - Обработка пакетов на вводе.

Начало

Условие запуска - ввод свободен

Буфер ввода или 4 буфер не пуст

Операторы:

Выборка задания из буфера

обработка задания на вводе

отправка задания в буфер ВЦ

- запись задания в буфер ВЦ, если там есть достаточно места

- иначе, уничтожение задания.

Конец

Условие запуска - прошло время обработки задания на вводе.

TimeInput <= TimeAbs

Т'обробр+(N/V)

где Т'обр- время начала обработки Т'обр- время конца обработки

Активность 3 - Обработка пакетов на ВЦ.

Условие запуска - ВЦ свободен

Буфер ВЦ не пуст

Операторы:

Выборка задания из буфера

обработка задания на ВЦ

отправка задания в буфер вывода

- запись задания в буфер вывода, если там есть достаточно места

- иначе, уничтожение задания.

Конец

Условие запуска - прошло время обработки задания на вводе.

TimeObr <= TimeAbs

Т'обробр+(N/V)

где Т'обр- время начала обработки Т'обр- время конца обработки

Активность 4 - Обработка пакетов на Выводе.

Условие запуска - Вывод свободен

Буфер Вывода не пуст

Операторы:

Выборка задания из буфера

- обработка задания на Выводе

- отправка задания в на проверку

Конец

Условие запуска - прошло время обработки задания на вводе.

TimeOutput <= TimeAbs

Т'обробр+(N/V)

где Т'обр- время начала обработки Т'обр- время конца обработки

Активность 4 - Выполнение проверки

Условие запуска - пришло время окончание обработки задания на выходе

Операторы:

Проверка задания на правильность выполнения

- Если с ошибкой - отправка задания на повторную обработку (запись задания в 4 буфер)

- Если без ошибки - вывод задания из системы.

2.2 Блок-схема алгоритма моделирования

Рис.3. Блок-схема алгоритма моделирования

2.3 Моделирование

Окно моделирования - таблица, где при различных величинах модельного времени выводятся текущие значения параметров системы, по которым можно судить о ее функционировании: длины очередей перед приборами, состояние приборов (занят, свободен), поступление и уничтожение заявок и.т.д. Фрагмент моделирования для детерминированной модели приведен на рис.4.

Количество уничтоженных заданий - 0.

Рис.4. Фрагмент моделирования для детерминированной модели

3. Моделирование случайных независимых величин

Данный раздел курсового проекта отведен для уточнение имитационной модели СМО посредством моделирования случайных величин, характеризующих параметры заявок и режимы функционирования устройств их обработки в реальной сложной системе.

3.1 Аналитическая запись заданных законов распределения случайных величин

Программная реализация случайной величины с законом распределения, отличным от равномерного, производится методом обратной функции. Если - это последовательность, равномерно распределенная на интервале [0..1], а - это последовательность, имеющая плотность распределения вероятности , то .

Для показательного распределения:

,

откуда .

Для нормального распределения с плотностью распределения

,

,

где и - это две независимые последовательности, равномерно распределенные на интервале [0..1].

Таким образом, любой генератор последовательности случайных чисел, распределенных по некоторому закону, отличному от равномерного, в основе своей содержит минимум один генератор базовой последовательности, равномерно распределенной на интервале [0..1].

Для каждой случайной величины были разработаны генераторы, отличающиеся методом генерации базовой последовательности: метод серединных квадратов, метод иррационального числа и конгруэнтный метод

3.2 Блок-схемы алгоритмов моделирования случайных величин

Рис.5 Блок-схема алгоритма генерирования равномерно распределенных случайных величин (а - метод серединных квадратов, б - метод иррационального числа)

3.3 Результаты тестирования процедур моделирования

случайных величин

Любой программный генератор выдает последовательность не случайных, а псевдослучайных чисел, поэтому для достоверности получаемых при моделировании результатов необходимо: во-первых, использовать в генераторах разных случайных величин независимые базовые генераторы, во-вторых, все генераторы случайных чисел должны пройти предварительное тестирование, которое заключается в следующем.

3.3.1 Тестирование по гистограмме

Гистограмма - это кусочно-непрерывная функция плотности распределения статистического ряда. На рис.6 изображены гистограммы тестирования случайных независимой величин с показательным и нормальным распределением с использованием конгруэнтного метода, числе испытаний 2000, число точек дискретизации 30.

Рис.6. Пример гистограммы

Гистограмма плотности распределения статистического ряда должна максимально приближаться к теоретической кривой плотности распределения. Степень рассогласования можно оценить по среднеквадратичному отклонению графиков (СКО).

3.3.2 Тестирование по критериям согласия

Позволяет оценить степень соответствия гистограммы и теоретической плотности распределения с точки зрения проверки статистической гипотезы об их идентичности. При использовании критерия согласия Колмогорова по гистограмме на графике теоретической функции распределения строится кусочно-непрерывная статистическая функция распределения. Для критерия Пирсона используется гистограмма распределения вероятностей.

В таблице 1 приведены данные тестирования независимых случайных величин с нормальным законом распределения.

Результаты тестирования независимых случайных величин

Таблица 1.

m

у

Число точек дискритизации

xmin

xmax

Критерий

Пирсона

P

60

4

20

46,47

74,19

10,15

Генератор возьмем на основе конгруэнтного метода.

3.3.3 Тестирование по корреляционному моменту

Позволяет проверить независимость элементов случайной последова-тельности. Это необходимо, поскольку программный генератор случайных чисел может “зацикливаться” с некоторым интервалом апериодичности. В таблице 4 приведены вероятности независимости последовательности элементов при различных методах генерирования случайной величины для разных математических ожиданий и дисперсий.

В результате тестирования по корреляционному моменту было замечено что генерируемые случайные величины независимы с вероятностью не менее чем 0,858.

Таким образом, на основании результата тестирования генераторов случайных независимых величин можно заключить, что наиболее приемлемым является генератор в котором для генерирования равномерно распределенной случайной величины используется конгруэнтный метод. Этот вид генератора будет в дальнейшем использован в имитационной модели.

Рис.7. Тестирование генератора случайных величин с нормальным законом распределения

3.4 Моделирование СМО в условиях случайных

изменений параметров

Фрагмент моделирования для модели, работающей в условиях случайных изменений параметров, приведен в таблице 2.

моделирование имитационный тестирование оптимизация

Таблица 2

4. Моделирование случайных процессов

В данном разделе курсовой работы делаем уточнение имитационной модели СМО посредством моделирования возмущающих воздействий, действующих на реальную сложную систему.

4.1 Корреляционная функция стационарного случайного процесса

Для моделирования случайного стационарного процесса надо прежде всего задать корреляционную функцию процесса, которая отражает степень статистической зависимости между сечениями стационарного случайного процесса, отстоящими друг от друга во времени на величину ф. Пусть корреляционная функция имеет вид , где a, b - параметры, которые определяются исходя из условия задания:

Выбираем параметры из постановки задачи Ymax=20 и Ymin=0. Зададимся Дt исходя из того, что возмущением является количество неправильно выполненных заданий Д (%) вследствие сбоев ВЦ, а время обработки задания которого четко не определено, то Дt примем равным приращению модельного времени - 1 мин. Исходя из этого получим что a= 11,11; b= 0,998.

Корреляционная функция для таких параметров имеет вид, приведенный на рис.8.

Рис.8. Корреляционная функция стационарного случайного процесса

Получив аналитически корреляционную функцию, описывающую стационарный случайный процесс, воспользуемся для его моделирования методом скользящего суммирования.

4.2 Решение системы уравнений

Для вычисления значения возмущения на очередном шаге моделирования необходимо найти константы C0, C1, C2,… Cm, которые определяются из системы уравнений (m+1)-го порядка:

Для упрощения примем, что сечения случайного процесса, отстоящие друг от друга во времени более, чем на три шага моделирования, считаются некоррелированными, т.е. m=3. Тогда:

Далее, согласно методу скользящего суммирования, значения стационарного случайного процесса Y(t) с заданной корреляционной функцией KY(ф) находятся по формулам:

где y(iДt) - значения значение возмущения на очередном i-ом шаге моделирования, qi - случайные нормально распределенные величины с нулевым математическим ожиданием и единичной дисперсией, - математическое ожидание стационарного случайного процесса, C0, C1, C2,… Cm - константы, найденные выше.

В рассматриваемой задачи возмущение имеет разброс [0…20] В результате вычисления коэффициентов С необходимых для вычисления случайных величин по методу скользящего суммирования были получены следующие результаты.

С интервалом разброса [0…20] : ,

Решение системы уравнений:

> restart;

> a:=evalf((20-0)/6)^2;

> b:=-ln(0.05)/3/1;

> k1:=c0^2+c1^2+c2^2+c3^2=a;

> k2:=c0*c1+c1*c2+c2*c3=a*exp(-b*1);

> k3:=c0*c2+c1*c3=a*exp(-b*2);

> k4:=c0*c3=a*exp(-b*3);

> solve({k1,k2,k3,k4},{c0,c1,c2,c3});

4.3 Блок-схема метода скользящего суммирования

Рис.9. Блок-схема алгоритма генерирования стационарного случайного процесса методом скользящего суммирования

4.4 Тестирование генератора стационарного случайного процесса

Для оценки качества работы генератора стационарного случайного процесса используются критерии согласия Смирнова, Фишера и Стьюдента. Результаты одного из тестов приведены на рисунке ниже.

Рис.10. Результаты тестирования генератора стационарного случайного процесса

Как видно из рисунка, результаты теста приемлемы. Поэтому добавим генератор стационарного случайного процесса к существующей уже модели, тем самым сделав процесс случайным стационарным процессом.

4.5 Моделирование СМО в условиях воздействия возмущающих случайных процессов

Отличие моделирования СМО в условиях воздействия возмущающих случайных процессов от моделирования СМО в условиях случайных изменений параметров будет заключаться в том, что процент брака каждого из станков изменяется случайным образом.

Количество уничтоженных заданий - 0

Рис.11. Моделирование СМО в условиях воздействия возмущающих случайных процессов

5. Оптимизация системы массового обслуживания

Пользуясь разработанной имитационной моделью, произвести оптимизацию системы массового обслуживания.

5.1 Постановочная часть оптимизационной задачи

Варьируя параметры модели, можно оптимизировать показатели работы моделируемой системы массового обслуживания.

Процессы в сложных системах можно достаточно полно оценить только совокупностью различных показателей качества, поэтому для их оптимизации необходимо выбирать несколько частных критериев качества функционирования системы.

Для решения задачи рассматривается критерием оптимальности

,

где -частный критерий оптимальности.

По заданию, варьируемым параметрам являются К- математическое ожидание Объемов памяти буферов. Таким образом, нельзя представить критерии оптимальности в виде обобщенного показателя, несмотря на то что они не являются противоречивыми, но тем не менее они имеют различную «природу». Для решения оптимизационной задачи воспользуемся методом Парето-оптимизации.

5.2 Блок-схема реализующая Парето-оптимизацию

Рис.12 Блок-схема алгоритма реализующего Парето-оптимизацию

5.3 Результаты Парето-оптимизации

В результате применение Парето-оптимизации получим, при заданных параметрах оптимизации, следующую таблицу Паретто-оптимальных альтернатив (рис.13)

Рис.13 Результаты оптимизации

Заключение

Cоздана имитационная модель участка обрабатывающего цеха. Полученная модель является абстрактной математической моделью. Моделирование системы осуществлялось в среде разработке приложений Borland Delphi 7.0. Результатом является программа в виде exe файла, имитирующая работу участка обрабатывающего цеха.

Имитационная программа, прилагаемая к записке, кроме своей непосредственной задачи (имитационное моделирование системы), позволяет тестировать рассмотренные во втором пункте генераторы случайных величин, тестировать стационарный случайный процесс, полученный при использовании метода скользящего суммирования, а также позволяет производить эксперименты с готовой моделью и оптимизировать параметры системы по полученным результатам.

Приложение: Программная реализация

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Menus, XPMan, StdCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

XPManifest1: TXPManifest;

Button5: TButton;

procedure N5Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

uses Unit2, Unit3, Unit4, Unit5;

{$R *.dfm}

procedure TForm1.N5Click(Sender: TObject);

begin

Form1.Close;

end;

procedure TForm1.Button5Click(Sender: TObject);

begin

Form1.Close;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Form2.Show;

Form1.Hide;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Form3.Show;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

Form4.Show;

end;

procedure TForm1.Button4Click(Sender: TObject);

begin

Form5.Show;

end;

end.

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, Buttons;

type

TForm2 = class(TForm)

Edit1: TEdit;

Label1: TLabel;

Edit2: TEdit;

Label2: TLabel;

Edit3: TEdit;

Label3: TLabel;

Edit4: TEdit;

Label4: TLabel;

Edit5: TEdit;

Label5: TLabel;

Edit6: TEdit;

Label6: TLabel;

Edit7: TEdit;

Label7: TLabel;

Button1: TButton;

Edit9: TEdit;

Label9: TLabel;

strgrOut: TStringGrid;

Button2: TButton;

SaveDialog1: TSaveDialog;

Edit10: TEdit;

Label110: TLabel;

Edit11: TEdit;

Label111: TLabel;

BitBtn1: TBitBtn;

Button3: TButton;

Button4: TButton;

procedure GetTime();

procedure FillTableDate();

procedure Button1Click(Sender: TObject);

procedure Init();

procedure FormCreate(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type

Buffer = array[1..2, 1..50000] of integer;

myT= array [1..3] of extended;

var

Form2: TForm2;

//абсолютное время в системе

timeAbs : real;

//сколько в буфере байт занято

SizeBuf1,SizeBuf2,SizeBuf3,SizeBuf4 : real;

//макс размер буфера

maxSizeBuf1,maxSizeBuf2,maxSizeBuf3 : real;

//если флаг в true, то буфер свободен

flInput, flObr, flOut, flEr : boolean;

//номер обрабатываемого задания в буфере

NumberB1,NumberB2,NumberB3,NumberB4 : integer;

//сколько в буфере находится заданий

CountB1,CountB2,CountB3,CountB4 : integer;

N : integer;

V : integer;

M : integer;

MI : integer;

ERcount: integer;

//Время окончания функционирования

TimeOut : real;

t1 : real;

//время, когда будет генерироваться задание

timeGenerate : real;

Buf1, Buf2, Buf3, Buf4 : Buffer;

//время, когда закончится обрабатываться задание на данном элементе

timeInput : real;

timeObr : real;

timeOutput :real;

timeEr :real;

//число выполненных заданий на данный момент

tempCountOutEx : integer;

iteration : integer;

theDay, theHour, theMin : integer;

CountDelEx : integer;

//когда неизвестно, с кого буфера пришло

Buf_1or4 : integer;

V_1or4 : integer;

//вероятность ошибки

ver_err : real;

is_4_Buffer : boolean;

iswithError : boolean;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.GetTime ;

begin

theDay := trunc(timeAbs / 1440);

theHour := trunc((timeAbs - theDay*1440)/(60));

theMin := trunc((timeAbs - theDay*1440) - theHour * 60);

end;

//процедура заносит всю статистику в таблицу

procedure TForm2.FillTableDate;

begin

GetTime;

strgrOut.Cells[0,iteration] := IntToStr(theDay);

strgrOut.Cells[1,iteration] := IntToStr(theHour);

strgrOut.Cells[2,iteration] := IntToStr(theMin);

if (timeGenerate = timeAbs) then

strgrOut.Cells[3,iteration] := 'Генерация';

strgrOut.Cells[4,iteration] := FloatToStr(SizeBuf1);

if (not(flInput) and is_4_Buffer) then

strgrOut.Cells[5,iteration] := '+4б';

if (not(flInput) and not(is_4_Buffer)) then

strgrOut.Cells[5,iteration] := '+1б';

strgrOut.Cells[6,iteration] := FloatToStr(SizeBuf2);

if not(flObr) then

strgrOut.Cells[7,iteration] := '+';

strgrOut.Cells[8,iteration] := FloatToStr(SizeBuf3);

if {(not(flOut)) and} (iswithError)

then strgrOut.Cells[9,iteration] := '+ош';

if (not(flOut) and not(iswithError)) then

strgrOut.Cells[9,iteration] := '+';

strgrOut.Cells[10,iteration] := FloatToStr(SizeBuf4);;

end;

procedure TForm2.Button1Click(Sender: TObject);

var

i : integer;

k : integer;

error : real;

begin

MI := 0;

Ercount := 0;

CountDelEx := 0;

iswithError := false;

SizeBuf1 := 0;

SizeBuf2 := 0;

SizeBuf3 :=0;

strgrOut.RowCount := 11519;

Init;

iteration := 0;

timeAbs := 0;

timeGenerate := t1;

while (timeAbs < TimeOut) do

begin

//пришло время генерации задания

if (timeGenerate <= timeAbs) then

begin

N := StrToInt(Edit9.Text);

V := StrToInt(Edit3.Text);

//если можем записать 1-й в буфер

if ((SizeBuf1 + N) <= maxSizeBuf1) then

begin

//записываем в буфер

SizeBuf1 := SizeBuf1 + N;

inc(CountB1);

Buf1[1,CountB1] := N;

Buf1[2,CountB1] := V;

end

//не удалось записать в буфер1

else

begin

inc(CountDelEx);

end;

timeGenerate := timeGenerate + t1;

end;

//---------пришло время генерации задания

////////////////////////////////////////////////////////////////////

//если на вводе ничего не выполняется

if flInput = true then

begin

//и 4-ый буфер не пустой

//начинаем обработку с 4-го буфера на ввод

if (Buf4[1,NumberB4] <> 0) then

begin

flInput := false;

timeInput := timeAbs + (Buf4[1,NumberB4]/Buf4[2,NumberB4]);

inc(NumberB4);

is_4_Buffer := true;

end

else

if (Buf1[1,NumberB1] <> 0) then

//если 4-ый свободен и первый тоже, можем брать из первого

begin

flInput := false;

timeInput := timeAbs + (Buf1[1,NumberB1]/Buf1[2,NumberB1]);

inc(NumberB1);

end;

end;

//если задание выполнилось на вводе

if ((timeInput <= timeAbs) and (timeInput <> 0) and ((sizebuf1<>0)or(sizebuf4<>0))) then

//if ((timeInput <= timeAbs) and (timeInput <> 0) ) then

begin

flInput := true;

//если задание пришло с 4-го буфера

if is_4_Buffer = true then

begin

SizeBuf4 := SizeBuf4 - Buf4[1,NumberB4-1];

Buf_1or4 := Buf4[1,NumberB4-1];

V_1or4 := Buf4[2,NumberB4-1];

is_4_Buffer := false;

end

//иначе с 1-го буфера

else

begin

SizeBuf1 := SizeBuf1 - Buf1[1,NumberB1-1];

Buf_1or4 := Buf1[1,NumberB1-1];

V_1or4 := Buf1[2,NumberB1-1];

end;

//если можно записать во второй буфер

if (SizeBuf2 + Buf_1or4 <= maxSizeBuf2) then

begin

inc(CountB2);

SizeBuf2 := SizeBuf2 + Buf_1or4;

Buf2[1,CountB2] := Buf_1or4;

Buf2[2,CountB2] := V_1or4;

end

//не удалось записать в буфер2

else

begin

inc(CountDelEx);

end;

end;

//тест2

//началась обработка на "обработке"

if ((SizeBuf2 <> 0) and (flObr = true) and (Buf2[1,NumberB2]<>0)) then

begin

flObr := false;

timeObr := timeAbs + (Buf2[1,NumberB2]/Buf2[2,NumberB2]);

inc(NumberB2);

end;

//---------началась обработка на "обработке"

//если задание выполнилось на "обработке"

if ((timeObr <= timeAbs)and (timeObr <> 0)and (SizeBuf2<>0)) then

begin

SizeBuf2 := SizeBuf2 - Buf2[1,NumberB2-1];

flObr := true;

//если можно записать в третий буфер

if (SizeBuf3 + Buf2[1,NumberB2-1] <= maxSizeBuf3) then

begin

inc(CountB3);

SizeBuf3 := SizeBuf3 + Buf2[1,NumberB2-1];

Buf3[1,CountB3] := Buf2[1,NumberB2-1];

Buf3[2,CountB3] := Buf2[2,NumberB2-1];

end

//не удалось записать в буфер3

else

begin

inc(CountDelEx);

end;

end;

//тест3

//началась обработка на "выводе"

if ((SizeBuf3 <> 0) and (flOut = true)and (Buf3[1,NumberB3]<>0)) then

begin

flOut := false;

timeOutput := timeAbs + (Buf3[1,NumberB3]/Buf3[2,NumberB3]);

inc(NumberB3);

end;

//---------началась обработка на "выводе"

//если задание выполнилось на "выводе"

if ((timeOutput <= timeAbs) and (TimeOutput <> 0) and (sizebuf3<>0)) then

begin

flOut := true;

SizeBuf3 := SizeBuf3 - Buf3[1,NumberB3-1];

inc(MI);

if (Ercount<round(ver_err*M)) then

begin

if (round(random)=1) then iswithError := true;

if (Ercount+M-MI<round(ver_err*M)) then iswithError := true;

end;

if (MI=M)then begin MI:=0; ERcount:=0 end;

if iswithError then

begin

inc(CountB4);

Buf4[1,CountB4] := Buf3[1,CountB3-1];

Buf4[2,CountB4] := Buf3[2,CountB3-1];

SizeBuf4 := SizeBuf4 + Buf3[1,CountB3-1];

end;

inc(tempCountOutEx);

end;

timeAbs := timeAbs + 1;

iteration := iteration +1;

FillTableDate;

//if (iswithError) then Label8.caption:=Label8.Caption+'1';

iswithError := false;

end;

edit11.Text:= IntToStr(CountDelEx);

end;

procedure TForm2.Init;

var

i : integer;

begin

for i := 1 to 50000 do

begin

Buf1[1,i] := 0;

Buf1[2,i] := 0;

Buf2[1,i] := 0;

Buf2[2,i] := 0;

Buf3[1,i] := 0;

Buf3[2,i] := 0;

Buf4[1,i] := 0;

Buf4[2,i] := 0;

end;

//!!!!!!!!!!!!!!!!!!!!!!!CountDelEx := 0;

SizeBuf1 := 0;

SizeBuf2 := 0;

SizeBuf3 := 0;

SizeBuf4 := 0;

maxSizeBuf1 := StrToInt(Edit4.Text);

maxSizeBuf2 := StrToInt(Edit5.Text);

maxSizeBuf3 := StrToInt(Edit6.Text);

flInput := true;

flObr := true;

flOut := true;

flEr := true;

NumberB1 := 1;

NumberB2 := 1;

NumberB3 := 1;

NumberB4 := 1;

CountB1 := 0;

CountB2 := 0;

CountB3 := 0;

CountB4 := 0;

N := StrToInt(Edit9.Text);

V:= StrToInt(Edit3.Text);

TimeOut := StrToFloat(Edit1.Text);

t1 := StrToFloat(Edit2.Text);

M :=StrToInt(Edit7.text);

ver_err := StrToFloat(Edit10.text);

is_4_Buffer := false;

end;

procedure TForm2.FormCreate(Sender: TObject);

begin

Randomize;

strgrOut.RowCount := 10080;

strgrOut.ColWidths[0] := 40;

strgrOut.ColWidths[1] := 40;

strgrOut.ColWidths[2] := 40;

strgrOut.Cells[0,0] := 'День';

strgrOut.Cells[1,0] := 'Час';

strgrOut.Cells[2,0] := 'Мин';

strgrOut.Cells[3,0] := 'Ген. зад';

strgrOut.Cells[4,0] := 'Буфер1';

strgrOut.Cells[5,0] := 'Ввод';

strgrOut.Cells[6,0] := 'Буфер2';

strgrOut.Cells[7,0] := 'Обработка';

strgrOut.Cells[8,0] := 'Буфер3';

strgrOut.Cells[9,0] := 'Вывод';

strgrOut.Cells[10,0] := 'Буфер4';

end;

procedure TForm2.Button2Click(Sender: TObject);

var

F : TextFile;

i,j : integer;

tempString,temp : string;

begin

if SaveDialog1.Execute then

begin

// str := Format('%-5s++++%-5s%-5s%-5s%-5s%-5s%-5s',['Дата','Время','Деталей на','Детали','Детали, поступившие','Лишние','Активность']);

AssignFile(F,Form2.SaveDialog1.FileName);

Rewrite(F);

tempString := Format('%65s',['Протокол моделирования']);

writeln(F,tempString);

writeln(F);

tempString := Format('%6s%6s%8s%12s%10s%10s%10s%10s%10s%10s',['День','Час','Минут','Ген. здния','Буф_1','Ввод','Буф_2','Обр','Буф_3','Вывод']);

writeln(F,tempString);

tempString := '';

for i :=1 to strgrOut.RowCount-1 do

begin

for j := 0 to strgrOut.ColCount do

begin

tempString := strgrOut.Cells[j,i];

case j of

0: temp := temp + Format('%6s',[tempString]);

1: temp := temp + Format('%6s',[tempString]);

2: temp := temp + Format('%8s',[tempString]);

3: temp := temp + Format('%12s',[tempString]);

4: temp := temp + Format('%10s',[tempString]);

5: temp := temp + Format('%10s',[tempString]);

6: temp := temp + Format('%10s',[tempString]);

7: temp := temp + Format('%10s',[tempString]);

8: temp := temp + Format('%10s',[tempString]);

9: temp := temp + Format('%10s',[tempString]);

10 : temp := temp + Format('%10s',[tempString]);

end;

end;

write(F,temp);

tempString := '';

temp :='';

writeln(F);

end;

end;

writeln(F);

writeln(F,'Количество уничтоженных заданий - ' + IntToStr(CountDelEx));

CloseFile(F);

end;

procedure TForm2.BitBtn1Click(Sender: TObject);

begin

//Form2.Button3Click(Form2);

Form2.Close;

Form1.Show;

end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Form1.Show;

end;

procedure TForm2.Button3Click(Sender: TObject);

var

i:integer;

begin

Edit11.Clear;

For i:=1 to Form2.strgrOut.RowCount-1 do

Begin

strgrOut.Cells[0,i]:=' ';

strgrOut.Cells[1,i]:=' ';

strgrOut.Cells[2,i]:=' ';

strgrOut.Cells[3,i]:=' ';

strgrOut.Cells[4,i]:=' ';

strgrOut.Cells[5,i]:=' ';

strgrOut.Cells[6,i]:=' ';

strgrOut.Cells[7,i]:=' ';

strgrOut.Cells[8,i]:=' ';

strgrOut.Cells[9,i]:=' ';

strgrOut.Cells[10,i]:=' ';

end;

end;

procedure TForm2.Button4Click(Sender: TObject);

begin

Form2.Button3Click(Form2);

Form2.Close;

Form1.Close;

end;

end.

unit Unit3;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, TeEngine, TeeFunci, Series, ExtCtrls, TeeProcs, Chart, DbChart,

Grids, StdCtrls, Math, Buttons;

type

TForm3 = class(TForm)

DBChart1: TDBChart;

Series1: TBarSeries;

edM: TEdit;

lblPopulationMean: TLabel;

edSigma: TEdit;

lblSigma: TLabel;

btnGeneration: TButton;

edPopulationMean: TEdit;

Label5: TLabel;

edStep: TEdit;

Label6: TLabel;

edCriterionPirs: TEdit;

Label7: TLabel;

Edit2: TEdit;

Label8: TLabel;

Edit1: TEdit;

Label9: TLabel;

btnTesting: TButton;

BitBtn1: TBitBtn;

StringGrid1: TStringGrid;

Chart1: TChart;

Series2: TLineSeries;

BitBtn2: TBitBtn;

Button1: TButton;

Label1: TLabel;

strgrRandomVariables: TStringGrid;

Button2: TButton;

Function NormZ:real;

Procedure Clear;

Procedure Interv;

Procedure Sorting;

Procedure BuildDiagram;

procedure btnGenerationClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure btnTestingClick(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Zoom(Sender:TChart);

procedure Zoom1(Sender:TDBChart);

procedure Chart1DblClick(Sender: TObject);

procedure DBChart1DblClick(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

const Nn = 2000;

var

Form3: TForm3;

Xi, X_i, Y : real;

Sigma, PopulationMean : real;

Accuracy : Extended;

m : byte;

SumProbabilities : real;

sv:array[0..Nn] of real; //случ величины

interval_n : array[0..40] of real; //нач интервала

interval_k : array[0..40] of real; //конец интервала

Hit:array[0..Nn] of real; //вероятн попадания

Hit2: array[0..100] of integer;

w:array [0..100] of real;

h:array[0..100] of double;

kol_sv,kol_sv_posl:integer; //количесвто св в интервале...и в последнем

sum : real;

MathOgid : real;

CKO : real;

zoomOn : boolean;

implementation

uses Unit6, Unit1;

{$R *.dfm}

//процедура очистки таблицы случайных величин

Procedure TForm3.Clear;

var i:integer;

begin

for i := 1 to strgrRandomVariables.rowCount do

strgrRandomVariables.Cells[0,i] := '';

for i := 0 to 40 do

interval_n[i] := 0;

for i := 0 to 40 do

interval_k[i] := 0;

end;

//функция получения случайных величин

Function TForm3.NormZ:real;

begin

NormZ := sigma * cos(2*Pi*Random) * sqrt(-2 * Ln(Random)) + PopulationMean;

end;

//процедура сортировки

Procedure TForm3.Sorting;

var

i, j : integer;

b : real;

begin

for j := 0 to Nn-1 do

for i := j+1 to Nn-1 do

if sv[i] < sv[j] then

begin

b := sv[j];

sv[j] := sv[i];

sv[i] := b;

end;

for i := 0 to Nn-1 do

begin

strgrRandomVariables.Cells[0,i] := floattostr(sv[i]);

Chart1.Series[0].AddXY(sv[i],i);

end;

end;

Procedure TForm3.Interv;

var

i,j, int : integer;

dl : real;

begin

Sorting;

dl := (sv[Nn-1] - sv[0])/ m;

edStep.Text := FloatToStrF(dl,FFFixed,6,6);

// interval_n[0] := sv[0];

// interval_k[0] := sv[0] + dl;

for int := 0 to m-1 do

begin

interval_n[int] := sv[0]+int*dl;

interval_k[int] := sv[0]+(int+1)*dl;

end;

for j:=0 to m-1 do

Hit2[j]:=0;

for i:=Nn-1 downto 0 do

begin

for j:=m-1 downto 0 do

if sv[i]>=interval_n[j] then

begin

inc(Hit2[j]);

break;

end;

end;

SumProbabilities := 0.0;

for int := 0 to m - 1 do

begin

Hit[int] := Hit2[int] / Nn;

SumProbabilities := SumProbabilities + Hit[int];

end;

end;

procedure TForm3.btnGenerationClick(Sender: TObject);

var

i : integer;

begin

sum := 0.0;

Cko := 0.0;

Clear;

PopulationMean := strtofloat(edPopulationMean.Text);

Sigma := strtofloat(edSigma.Text);

Accuracy := power(10,6);

m := StrToInt(edM.Text);

strgrRandomVariables.RowCount := Nn + 1;

for i := 0 to Nn-1 do

begin

sv[i] := NormZ;

sv[i] := Trunc(sv[i] * Accuracy) / Accuracy;

sum := sum + sv[i];

MathOgid := sum / Nn;

Edit1.Text := FloatToStr(MathOgid);

end;

Sorting;

for i := 0 to Nn-1 do

Cko := Cko + ((sv[i]- MathOgid) * (sv[i]- MathOgid));

Cko := sqrt(Cko * (1 /(Nn - 1)));

Edit2.Text := FloatToStr(Cko);

btnTesting.Click

end;

Procedure TForm3.BuildDiagram;

var

i : integer;

per : string;

begin

Series1.Clear;

for i := 0 to m - 1 do

begin

per := floattostr(round(interval_n[i] * 1000) / 1000) + ' - '+

floattostr(round(interval_k[i]*1000)/1000);

Series1.Add(Hit[i],per);

end;

end;

function Func(Ri : real) : real;

var

step : real;

begin

step := -(Ri-PopulationMean)*(Ri-PopulationMean)/(2*Sigma*Sigma);

Func := exp(step) / (Sigma*Sqrt(2*3.1415));

end;

procedure TForm3.FormCreate(Sender: TObject);

begin

Randomize;

StringGrid1.Cells[0,0]:='Начало';

StringGrid1.Cells[1,0]:='Конец';

StringGrid1.Cells[2,0]:='Вероятность попадания';

end;

procedure TForm3.btnTestingClick(Sender: TObject);

var

Pirs : real;

i, k : integer;

temp,dl : real;

P : real;

begin

for i :=0 to m - 1 do

begin

Hit[i] := 0;

Hit2[i] := 0;

end;

Interv;

k := 1;

i := 0;

while i <= m do

begin

if interval_n[i] <> interval_k[i] then

begin

{StringGrid2.Cells[0,k] := floattostrf(interval_n[i],Fffixed,6,6);

StringGrid2.Cells[1,k] := floattostrf(interval_k[i],Fffixed,6,6);

StringGrid2.Cells[2,k] := floattostrf(Hit[i],Fffixed,5,4);}

StringGrid1.Cells[0,k] := floattostrf(interval_n[i],Fffixed,6,6);

StringGrid1.Cells[1,k] := floattostrf(interval_k[i],Fffixed,6,6);

StringGrid1.Cells[2,k] := floattostrf(Hit[i],Fffixed,5,4);

k := k + 1;

end;

i := i + 1;

end;

StringGrid1.RowCount := k;

BuildDiagram;

//критерий Пирсона

Pirs := 0;

P := 0;

dl:=(sv[Nn-1]-sv[0])/m;

for i :=0 to m-2 do

begin

P := Func((interval_n[i+1] + interval_n[i])/2)*dl;

Temp := (Hit[i] - P)*(Hit[i] - P)/P;

Pirs := Pirs + temp;

end;

Pirs := Pirs * Nn;

edCriterionPirs.Text := FloatToStr(Pirs);

end;

procedure TForm3.BitBtn1Click(Sender: TObject);

begin

//Form3.BitBtn2Click(Form3);

Form3.Close;

end;

procedure TForm3.BitBtn2Click(Sender: TObject);

var

i:integer;

begin

Form3.DBChart1.Series[0].Clear;

Form3.Chart1.Series[0].Clear;

Form3.Edit1.Clear;

Form3.Edit2.Clear;

Form3.edCriterionPirs.Clear;

Form3.edStep.Clear;

For i:=1 to Form3.StringGrid1.RowCount-1 do

Begin

StringGrid1.Cells[0,i]:=' ';

StringGrid1.Cells[1,i]:=' ';

StringGrid1.Cells[2,i]:=' ';

end;

end;

procedure TForm3.Button1Click(Sender: TObject);

begin

Form6.Show;

end;

procedure TForm3.Zoom(Sender: TChart);

begin

If zoomOn=true

then

begin

Sender.Width:=330;

Sender.Height:=240;

Sender.BringToFront;

ZoomOn:=false

end

else if zoomOn=false then

begin

Sender.Width:=500;

Sender.Height:=500;

Sender.BringToFront;

zoomOn:=true;

end;

end;

procedure TForm3.Zoom1(Sender: TDBChart);

begin

If zoomOn=true

then

begin

Sender.Top:=270;

Sender.Width:=330;

Sender.Height:=240;

Sender.BringToFront;

ZoomOn:=false

end

else if zoomOn=false then

begin

Sender.Top:=10;

Sender.Width:=500;

Sender.Height:=500;

Sender.BringToFront;

zoomOn:=true;

end;

end;

procedure TForm3.Chart1DblClick(Sender: TObject);

begin

Zoom(Chart1);

end;

procedure TForm3.DBChart1DblClick(Sender: TObject);

begin

Zoom1(DBChart1);

end;

procedure TForm3.Button2Click(Sender: TObject);

begin

Form3.BitBtn2Click(Form3);

Form3.Close;

Form1.Close;

end;

end.

unit Unit4;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Buttons, Grids;

type

TForm4 = class(TForm)

StringGrid1: TStringGrid;

StringGrid2: TStringGrid;

Label1: TLabel;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

Button1: TButton;

Button2: TButton;

procedure arrayParetoOptimal;

procedure FormCreate(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form4: TForm4;

allSolution, arrayPareto: array[1..343, 0..6] of Real;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm4.FormCreate(Sender: TObject);

var

i,j,k,v:integer;

n:array[0..6]of real;

begin

StringGrid1.Cells[1,0] := 'K1';

StringGrid1.Cells[2,0] := 'K2';

StringGrid1.Cells[3,0] := 'K3';

StringGrid1.Cells[4,0] := 'Y1';

StringGrid1.Cells[5,0] := 'Y2';

StringGrid1.Cells[6,0] := 'Y3';

StringGrid1.Cells[7,0] := 'Y4';

StringGrid2.Cells[1,0] := 'K1';

StringGrid2.Cells[2,0] := 'K2';

StringGrid2.Cells[3,0] := 'K3';

StringGrid2.Cells[4,0] := 'Y1(min)';

StringGrid2.Cells[5,0] := 'Y2(min)';

StringGrid2.Cells[6,0] := 'Y3(min)';

StringGrid2.Cells[7,0] := 'Y4(min)';

AssignFile(input,'input.txt');

reset(input);

k := 0;

while not eof(input) do

begin

inc(k);

StringGrid1.Cells[0,k] := IntToStr(k);

StringGrid1.RowCount := k+2;

for i := 0 to 6 do

begin

read(input,n[i]);

allSolution[k,i] := n[i];

StringGrid1.Cells[i+1,k] := format('%0.0f',[n[i]]);

end;

end;

CloseFile(input);

StringGrid1.RowCount := StringGrid1.RowCount - 1;

end;

procedure TForm4.BitBtn1Click(Sender: TObject);

var

i,v,k:integer;

n:array[0..6]of real;

m1,m2,dd1,dd2,d1,d2,tb:real;

begin

arrayParetoOptimal;

end;

procedure TForm4.arrayParetoOptimal;

var

J, K, M, L: Word;

F: TextFile;

CountPokazateliRaboti, CountarrayPareto: Word;

begin

AssignFile(output,'output.txt');

rewrite(output);

CountPokazateliRaboti := 29;

CountarrayPareto := CountPokazateliRaboti;

arrayPareto := allSolution;

J := 0;

while J < CountarrayPareto do begin

J := J + 1;

K := 0;

while K < CountarrayPareto do begin

K := K + 1;

if ((K <> J)

and (arrayPareto[J, 3] <= arrayPareto[K, 3])

and (arrayPareto[J, 4] <= arrayPareto[K, 4])

and (arrayPareto[J, 5] <= arrayPareto[K, 5])

and (arrayPareto[J, 6] <= arrayPareto[K, 6])) then begin

for M := K to (CountarrayPareto - 1) do

for L := 0 to 6 do

arrayPareto[M, L] := arrayPareto[M + 1, L];

CountarrayPareto := CountarrayPareto - 1;

K := K - 1;

if (J > K) then

J := J - 1;

end;

end;

end;

StringGrid2.RowCount := CountarrayPareto + 1;

Label1.Caption := 'Число Парето-оптимальных решений :' + IntToStr(CountarrayPareto);

for j :=1 to CountarrayPareto + 1 do

begin

StringGrid2.Cells[0,j] := IntToStr(j);

for k :=0 to 6 do

begin

StringGrid2.Cells[k+1,j] := FloatTostr(arrayPareto[j,k]);

write(output,format('%0.0f',[arrayPareto[j,k]]));

write(output,' ');

end;

writeln(output);

end;

CloseFile(output);

end;

procedure TForm4.BitBtn2Click(Sender: TObject);

begin

Form4.Button1Click(Form4);

Form4.Close;

end;

procedure TForm4.Button1Click(Sender: TObject);

var

i:integer;

begin

For i:=1 to Form4.StringGrid2.RowCount-1 do

Begin

StringGrid2.Cells[0,i]:=' ';

StringGrid2.Cells[1,i]:=' ';

StringGrid2.Cells[2,i]:=' ';

StringGrid2.Cells[3,i]:=' ';

StringGrid2.Cells[4,i]:=' ';

StringGrid2.Cells[5,i]:=' ';

StringGrid2.Cells[6,i]:=' ';

StringGrid2.Cells[7,i]:=' ';

end;

end;

procedure TForm4.Button2Click(Sender: TObject);

begin

Form4.Button1Click(Form4);

Form4.Close;

Form1.Close;

end;

end.

unit Unit5;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls;

type

TForm5 = class(TForm)

Image1: TImage;

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form5: TForm5;

implementation

{$R *.dfm}

end.

unit Unit6;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm6 = class(TForm)

Button1: TButton;

Memo1: TMemo;

Memo2: TMemo;

Memo3: TMemo;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Edit1: TEdit;

Label4: TLabel;

Edit7: TEdit;

Edit8: TEdit;

Edit6: TEdit;

Edit4: TEdit;

Edit5: TEdit;

Edit3: TEdit;

Edit2: TEdit;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

Label10: TLabel;

Label11: TLabel;

Label12: TLabel;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Button5: TButton;

function NormalLow(Sigma, MatOzhidanie: Real): Real;

procedure Button1Click(Sender: TObject);

procedure FormActivate(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

procedure Initialize;

procedure Estimate;

end;

var

Form6: TForm6;

implementation

uses Unit3, Unit1;

{$R *.dfm}

var

Iter: Cardinal;

arrayY: array[1..50000] of Extended;

arrayYX, arrayYY: array[1..25000] of Extended;

procedure TForm6.Initialize;

var

I: Word;

begin

Memo1.Clear;

Memo2.Clear;

Memo3.Clear;

Iter := StrToInt(Edit1.Text);

for I := 1 to Iter do

arrayY[I] := 0;

end;

function TForm6.NormalLow(Sigma, MatOzhidanie: Real): Real;

var

X1, X2, Y: Real;

begin

X1 := Random;

X2 := Random;

Y := Sigma * Sqrt(-2 * Ln(X1)) * Cos(2 * Pi * X2) + MatOzhidanie;

NormalLow := Y;

end;

procedure TForm6.Estimate;

var

I: Word;

MOx, Moy, Dx, Dy, S: Extended;

Dst,tst : Extended;

begin

Iter := Iter div 2;

MOx := 0;

for I := 1 to Iter do

MOx := MOx + arrayYX[I];

MOx := MOx / Iter;

Edit7.Text := FloatToStrF(MOx,ffFixed,5,4);

Dx := 0;

for I := 1 to Iter do

Dx := Dx + Sqr(arrayYX[I] - MOx);

Dx := Dx / (Iter - 1);

Edit6.Text := FloatToStrF(Dx,ffFixed,5,4);

S := Sqrt(Dx);

Edit8.Text := FloatToStrF(S,ffFixed,5,4);

MOy := 0;

for I := 1 to Iter do

MOy := MOy + arrayYY[I];

MOy := MOy / Iter;

Edit4.Text := FloatToStrF(MOy,ffFixed,5,4);

Dy := 0;

for I := 1 to Iter do

Dy := Dy + Sqr(arrayYY[I] - MOy);

Dy := Dy / (Iter - 1);

Edit3.Text := FloatToStrF(Dy,ffFixed,5,4);

S := Sqrt(Dy);

Edit5.Text := FloatToStrF(S,ffFixed,5,4);

Dst := 0;

Dst := ((Iter/2-1)*Dx+(Iter-1)*Dy)/(Iter/2+Iter/2-2);

tst := 0;

tst := sqr((MOx-MOy)*(MOx-MOy)*(Iter/2)*(Iter/2)/Dst/(Iter/2+Iter/2));

Edit2.Text := FloatToStrF(tst,ffFixed,6,5);

end;

procedure TForm6.Button1Click(Sender: TObject);

var

I, J: Word;

Q: array[0..3] of Extended;

C: array[0..3] of Extended;

Sechenie: Extended;

begin

Initialize;

C[0] := 1.224975026;

C[1] := 3.065225384;

C[2] := 0.09621139492;

C[3] := 0.4535239849;

for J := 0 to 3 do

Q[J] := NormalLow(1, 0);

for I := 1 to Iter do

begin

Sechenie := 0;

for J := 0 to 3 do

Sechenie := Sechenie + C[J]*Q[J];

Sechenie := Sechenie + 10;

arrayY[I] := round(Sechenie*1000)/1000;

for J := 0 to 2 do

Q[J] := Q[J + 1];

Q[3] := NormalLow(1, 0);

end;

for I := 1 to Iter do

if I mod 2 = 0 then

arrayYY[I div 2] := arrayY[I]

else

arrayYX[I div 2 + 1] := arrayY[I];

//вывод на форму

for I := 1 to Iter do

begin

Memo3.Lines.Add(FloatToStr(arrayY[I]));

if (i mod 2 = 0) then Memo2.Lines.Add(FloatToStr(arrayY[I]))

else Memo1.Lines.Add(FloatToStr(arrayY[I]));

end;

Estimate;

end;

procedure TForm6.FormActivate(Sender: TObject);

begin

Initialize

end;

procedure TForm6.FormCreate(Sender: TObject);

begin

Randomize;

end;

procedure TForm6.Button2Click(Sender: TObject);

begin

Memo1.Clear;

Memo2.Clear;

Memo3.Clear;

Edit2.Clear;

Edit3.Clear;

Edit4.Clear;

Edit5.Clear;

Edit6.Clear;

Edit7.Clear;

Edit8.Clear;

end;

procedure TForm6.Button3Click(Sender: TObject);

begin

//Form3.BitBtn2Click(Form3);

//Form6.Button2Click(Form6);

Form6.Close;

Form3.Close;

end;

procedure TForm6.Button5Click(Sender: TObject);

begin

//Form6.Button2Click(Form6);

Form6.Close;

end;

procedure TForm6.Button4Click(Sender: TObject);

begin

Form3.BitBtn2Click(Form3);

Form6.Button2Click(Form6);

Form6.Close;

Form3.Close;

Form1.Close;

end;

end.

unit Unit7;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, Buttons;

type

TForm7 = class(TForm)

Edit1: TEdit;

Label1: TLabel;

Edit2: TEdit;

Label2: TLabel;

Edit3: TEdit;

Label3: TLabel;

Edit4: TEdit;

Label4: TLabel;

Edit5: TEdit;

Label5: TLabel;

Edit6: TEdit;

Label6: TLabel;

Edit7: TEdit;

Label7: TLabel;

Button1: TButton;

Edit9: TEdit;

Label9: TLabel;

strgrOut: TStringGrid;

Button2: TButton;

SaveDialog1: TSaveDialog;

Edit10: TEdit;

Label110: TLabel;

Edit11: TEdit;

Label111: TLabel;

BitBtn1: TBitBtn;

Button3: TButton;

Button4: TButton;

procedure GetTime();

procedure FillTableDate();

procedure Button1Click(Sender: TObject);

procedure Init();

procedure FormCreate(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type

Buffer = array[1..2, 1..50000] of integer;

myT= array [1..3] of extended;

var

Form7: TForm7;

//абсолютное время в системе

timeAbs : real;

//сколько в буфере байт занято

SizeBuf1,SizeBuf2,SizeBuf3,SizeBuf4 : real;

//макс размер буфера

maxSizeBuf1,maxSizeBuf2,maxSizeBuf3 : real;

//если флаг в true, то буфер свободен

flInput, flObr, flOut, flEr : boolean;

//номер обрабатываемого задания в буфере

NumberB1,NumberB2,NumberB3,NumberB4 : integer;

//сколько в буфере находится заданий

CountB1,CountB2,CountB3,CountB4 : integer;

N : integer;

V : integer;

M : integer;

MI : integer;

ERcount: integer;

//Время окончания функционирования

TimeOut : real;

t1 : real;

//время, когда будет генерироваться задание

timeGenerate : real;

Buf1, Buf2, Buf3, Buf4 : Buffer;

//время, когда закончится обрабатываться задание на данном элементе

timeInput : real;

timeObr : real;

timeOutput :real;

timeEr :real;

//число выполненных заданий на данный момент

tempCountOutEx : integer;

iteration : integer;

theDay, theHour, theMin : integer;

CountDelEx : integer;

//когда неизвестно, с кого буфера пришло

Buf_1or4 : integer;

V_1or4 : integer;

//вероятность ошибки

ver_err : real;

is_4_Buffer : boolean;

iswithError : boolean;

implementation

uses Unit1, Unit2, Unit3;

{$R *.dfm}

procedure TForm7.GetTime ;

begin

theDay := trunc(timeAbs / 1440);

theHour := trunc((timeAbs - theDay*1440)/(60));

theMin := trunc((timeAbs - theDay*1440) - theHour * 60);

end;

//процедура заносит всю статистику в таблицу

procedure TForm7.FillTableDate;

begin

GetTime;

strgrOut.Cells[0,iteration] := IntToStr(theDay);

strgrOut.Cells[1,iteration] := IntToStr(theHour);

strgrOut.Cells[2,iteration] := IntToStr(theMin);

if (timeGenerate = timeAbs) then

strgrOut.Cells[3,iteration] := 'Генерация';

strgrOut.Cells[4,iteration] := FloatToStr(SizeBuf1);

if (not(flInput) and is_4_Buffer) then

strgrOut.Cells[5,iteration] := '+4б';

if (not(flInput) and not(is_4_Buffer)) then

strgrOut.Cells[5,iteration] := '+1б';

strgrOut.Cells[6,iteration] := FloatToStr(SizeBuf2);

if not(flObr) then

strgrOut.Cells[7,iteration] := '+';

strgrOut.Cells[8,iteration] := FloatToStr(SizeBuf3);

if {(not(flOut)) and} (iswithError)

then strgrOut.Cells[9,iteration] := '+';

if (not(flOut) and not(iswithError)) then

strgrOut.Cells[9,iteration] := '+';

strgrOut.Cells[10,iteration] := FloatToStr(SizeBuf4);;

end;

procedure TForm7.Button1Click(Sender: TObject);

var

i : integer;

k : integer;

error : real;

begin

MI := 0;

Ercount := 0;

CountDelEx := 0;

iswithError := false;

SizeBuf1 := 0;

SizeBuf2 := 0;

SizeBuf3 :=0;

strgrOut.RowCount := 11519;

Init;

iteration := 0;

timeAbs := 0;

timeGenerate := t1;

while (timeAbs < TimeOut) do

begin

//пришло время генерации задания

if (timeGenerate <= timeAbs) then

begin

N := StrToInt(Edit9.Text);

V := StrToInt(Edit3.Text);

//если можем записать 1-й в буфер

if ((SizeBuf1 + N) <= maxSizeBuf1) then

begin

//записываем в буфер

SizeBuf1 := SizeBuf1 + N;

inc(CountB1);

Buf1[1,CountB1] := N;

Buf1[2,CountB1] := V;

end

//не удалось записать в буфер1

else

begin

inc(CountDelEx);

end;

timeGenerate := timeGenerate + t1;

end;

//---------пришло время генерации задания

////////////////////////////////////////////////////////////////////

//если на вводе ничего не выполняется

if flInput = true then

begin

//и 4-ый буфер не пустой

//начинаем обработку с 4-го буфера на ввод

if (Buf4[1,NumberB4] <> 0) then

begin

flInput := false;

timeInput := timeAbs + (Buf4[1,NumberB4]/Buf4[2,NumberB4]);

inc(NumberB4);

is_4_Buffer := true;

end

else

if (Buf1[1,NumberB1] <> 0) then

//если 4-ый свободен и первый тоже, можем брать из первого


Подобные документы

  • Построение имитационной модели системы массового обслуживания, список и содержание ее активностей. Блок-схема алгоритма моделирования и текст процедуры. Моделирование случайных независимых величин и процессов. Оптимизация системы массового обслуживания.

    курсовая работа [4,0 M], добавлен 28.05.2013

  • Общая характеристика системы массового обслуживания, исходные данные для ее создания. Особенности построения алгоритма имитационной модели задачи о поступлении заявок (клиентов) в канал (парикмахерскую). Описание функционирования математической модели.

    курсовая работа [154,1 K], добавлен 19.05.2011

  • Определение назначения и описание функций имитационных моделей стохастических процессов систем массового обслуживания. Разработка модели описанной системы в виде Q-схемы и программы на языке GPSS и C#. Основные показатели работы имитационной модели.

    курсовая работа [487,4 K], добавлен 18.12.2014

  • Практические навыки системного исследования реальной динамической сложной системы на основе построения ее имитационной модели. Автоматизация работы по расчету эффективности системы массового обслуживания с понятным интерфейсом. Выбор алгоритма решения.

    курсовая работа [1,0 M], добавлен 18.08.2009

  • Создание математической модели системы массового обслуживания на примере банка. Разработка имитационной модели на языке программирования С++. Блок-схема программы, перевод модели на язык программирования. Верификация и валидация имитационной модели.

    курсовая работа [630,5 K], добавлен 01.06.2015

  • Методика системного исследования реальной динамической сложной системы посредством разработки ее имитационной модели. Разработка программы реализации алгоритма имитационного моделирования системы массового обслуживания "Интернет-провайдерская фирма".

    курсовая работа [2,0 M], добавлен 20.01.2010

  • Создание имитационной модели системы массового обслуживания с помощью языка имитационного моделирования GPSS/PC - моделирование обработки на участке 500 деталей. Определение загрузки второго станка на вторичной обработке и вероятности появления отходов.

    курсовая работа [602,3 K], добавлен 30.11.2010

  • Построение имитационной модели и метод решения задач, при использовании которого исследуемая система заменяется более простым объектом, описывающим реальную систему. Имитационная модель компьютерной программы, её значение при решении моделируемых задач.

    курсовая работа [343,1 K], добавлен 04.06.2012

  • Проблемы и этапы построения имитационной модели системы массового обслуживания. Оценка результатов схем, построенных на Visual Basic и GPSSV. Анализ исходных данных и выбор недостающих, составление таблицы определений и построение блок-схем и диаграмм.

    курсовая работа [204,1 K], добавлен 24.06.2011

  • Понятие, назначение и классы систем массового обслуживания. Создание имитационной модели вычислительного центра коллективного пользования в среде Matlab Simulink. Построение многоканальных СМО с отказами каналами; расчет показателей их эффективности.

    курсовая работа [864,6 K], добавлен 26.06.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.