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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    767,71 Кб
  • Опубликовано:
    2013-05-28
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

Введение

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

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

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

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

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

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. Построение имитационной модели системы массового обслуживания


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

.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. Моделирование случайных независимых величин


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

 

.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. Моделирование случайных процессов

 

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

 

.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. Оптимизация системы массового обслуживания


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

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

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

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

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

,

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

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

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

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

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

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

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

Заключение


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

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

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

unit Unit1;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, Menus, XPMan, StdCtrls;= class(TForm): TButton;: TButton;: TButton;: TButton;: TXPManifest;: TButton;N5Click(Sender: TObject);Button5Click(Sender: TObject);Button1Click(Sender: TObject);Button2Click(Sender: TObject);Button3Click(Sender: TObject);Button4Click(Sender: TObject);

{ Private declarations }

{ Public declarations };: TForm1;Unit2, Unit3, Unit4, Unit5;

{$R *.dfm}TForm1.N5Click(Sender: TObject);.Close;;TForm1.Button5Click(Sender: TObject);.Close;;TForm1.Button1Click(Sender: TObject);.Show;.Hide;;TForm1.Button2Click(Sender: TObject);.Show;;TForm1.Button3Click(Sender: TObject);.Show;;TForm1.Button4Click(Sender: TObject);.Show;;.

unit Unit2;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, Grids, Buttons;= class(TForm): TEdit;: TLabel;: TEdit;: TLabel;: TEdit;: TLabel;: TEdit;: TLabel;: TEdit;: TLabel;: TEdit;: TLabel;: TEdit;: TLabel;: TButton;: TEdit;: TLabel;: TStringGrid;: TButton;: TSaveDialog;: TEdit;: TLabel;: TEdit;: TLabel;: TBitBtn;: TButton;: TButton;GetTime();FillTableDate();Button1Click(Sender: TObject);Init();FormCreate(Sender: TObject);Button2Click(Sender: TObject);BitBtn1Click(Sender: TObject);FormClose(Sender: TObject; var Action: TCloseAction);Button3Click(Sender: TObject);Button4Click(Sender: TObject);

{ Private declarations }

{ Public declarations };= array[1..2, 1..50000] of integer;= array [1..3] of extended;: TForm2;

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

//сколько в буфере байт занято,SizeBuf2,SizeBuf3,SizeBuf4 : real;

//макс размер буфера,maxSizeBuf2,maxSizeBuf3 : real;

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

flInput, flObr, flOut, flEr : boolean;

//номер обрабатываемого задания в буфере,NumberB2,NumberB3,NumberB4 : integer;

//сколько в буфере находится заданий,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;: integer;, theHour, theMin : integer;

 CountDelEx : integer;

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

Buf_1or4 : integer;

V_1or4 : integer;

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

ver_err : real;

is_4_Buffer : boolean;

iswithError : boolean;Unit1;

{$R *.dfm}TForm2.GetTime ;

begin

theDay := trunc(timeAbs / 1440);

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

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

end;

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

procedure TForm2.FillTableDate;

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б';.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);;;TForm2.Button1Click(Sender: TObject);

i : integer;

k : integer;

error : real;:= 0;:= 0;:= 0;:= false;:= 0;:= 0;:=0;.RowCount := 11519;;:= 0;:= 0;:= t1;(timeAbs < TimeOut) do

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

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;

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

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

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 + 1;:= iteration +1;;

//if (iswithError) then Label8.caption:=Label8.Caption+'1';:= false;;.Text:= IntToStr(CountDelEx);;TForm2.Init;: integer;

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;;TForm2.FormCreate(Sender: TObject);

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';;TForm2.Button2Click(Sender: TObject);

F : TextFile;

i,j : integer;

tempString,temp : string;

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);;TForm2.BitBtn1Click(Sender: TObject);

//Form2.Button3Click(Form2);

Form2.Close;

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

Form1.Show;;TForm2.Button3Click(Sender: TObject);

i:integer;

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;;TForm2.Button4Click(Sender: TObject);

Form2.Button3Click(Form2);

Form2.Close;

Form1.Close;;.

unit Unit3;

interface

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

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

Grids, StdCtrls, Math, Buttons;

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;Nn = 2000;

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;Unit6, Unit1;

{$R *.dfm}

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

Procedure TForm3.Clear;i:integer;

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;;

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

Function TForm3.NormZ:real;

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

//процедура сортировкиTForm3.Sorting;

i, j : integer;

b : real;

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;;TForm3.Interv;

i,j, int : integer;

dl : real;

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;;TForm3.btnGenerationClick(Sender: TObject);

i : integer;

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;TForm3.BuildDiagram;

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;;Func(Ri : real) : real;

step : real;

begin

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

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

end;TForm3.FormCreate(Sender: TObject);

Randomize;

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

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

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

Pirs : real;

i, k : integer;

temp,dl : real;

P : real;

for i :=0 to m - 1 do

begin

Hit[i] := 0;

Hit2[i] := 0;

end;

Interv;

k := 1;

i := 0;

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;;

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

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);;TForm3.BitBtn1Click(Sender: TObject);

//Form3.BitBtn2Click(Form3);

Form3.Close;;TForm3.BitBtn2Click(Sender: TObject);:integer;

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;;TForm3.Button1Click(Sender: TObject);

Form6.Show;;TForm3.Zoom(Sender: TChart);

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;;TForm3.Zoom1(Sender: TDBChart);

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;;TForm3.Chart1DblClick(Sender: TObject);

Zoom(Chart1);;TForm3.DBChart1DblClick(Sender: TObject);

Zoom1(DBChart1);;TForm3.Button2Click(Sender: TObject);

Form3.BitBtn2Click(Form3);

Form3.Close;

Form1.Close;;.

unit Unit4;

interface

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

Dialogs, StdCtrls, Buttons, Grids;

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;

Form4: TForm4;

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

{$R *.dfm}TForm4.FormCreate(Sender: TObject);

i,j,k,v:integer;

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

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;;TForm4.BitBtn1Click(Sender: TObject);

i,v,k:integer;

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

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

arrayParetoOptimal;;TForm4.arrayParetoOptimal;

J, K, M, L: Word;

F: TextFile;

CountPokazateliRaboti, CountarrayPareto: Word;

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);;TForm4.BitBtn2Click(Sender: TObject);

Form4.Button1Click(Form4);

Form4.Close;;TForm4.Button1Click(Sender: TObject);:integer;

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;;TForm4.Button2Click(Sender: TObject);

Form4.Button1Click(Form4);

Form4.Close;

Form1.Close;;.

unit Unit5;

interface

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

Dialogs, StdCtrls, ExtCtrls;

TForm5 = class(TForm)

Image1: TImage;

private

{ Private declarations }

public

{ Public declarations }

end;

Form5: TForm5;

{$R *.dfm}.

unit Unit6;

interface

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

Dialogs, StdCtrls;

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;

Form6: TForm6;Unit3, Unit1;

{$R *.dfm}

Iter: Cardinal;

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

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

I: Word;

Memo1.Clear;

Memo2.Clear;

Memo3.Clear;

Iter := StrToInt(Edit1.Text);

for I := 1 to Iter do

arrayY[I] := 0;;TForm6.NormalLow(Sigma, MatOzhidanie: Real): Real;

X1, X2, Y: Real;

X1 := Random;

X2 := Random;

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

NormalLow := Y;;TForm6.Estimate;

I: Word;

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

Dst,tst : Extended;

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);;TForm6.Button1Click(Sender: TObject);

I, J: Word;

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

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

Sechenie: Extended;

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;;TForm6.FormActivate(Sender: TObject);

Initialize;TForm6.FormCreate(Sender: TObject);

Randomize;;TForm6.Button2Click(Sender: TObject);

Memo1.Clear;

Memo2.Clear;

Memo3.Clear;

Edit3.Clear;

Edit4.Clear;

Edit5.Clear;

Edit6.Clear;

Edit7.Clear;

Edit8.Clear;;TForm6.Button3Click(Sender: TObject);

//Form3.BitBtn2Click(Form3);

//Form6.Button2Click(Form6);

Form6.Close;

Form3.Close;;TForm6.Button5Click(Sender: TObject);

//Form6.Button2Click(Form6);

Form6.Close;;TForm6.Button4Click(Sender: TObject);

Form3.BitBtn2Click(Form3);

Form6.Button2Click(Form6);

Form6.Close;

Form3.Close;

Form1.Close;;.Unit7;

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

Dialogs, StdCtrls, Grids, Buttons;

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;

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

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

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;Unit1, Unit2, Unit3;

{$R *.dfm}TForm7.GetTime ;

begin

theDay := trunc(timeAbs / 1440);

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

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

end;

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

procedure TForm7.FillTableDate;

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);;;TForm7.Button1Click(Sender: TObject);

i : integer;

k : integer;

error : real;:= 0;:= 0;:= 0;:= false;:= 0;:= 0;:=0;.RowCount := 11519;;:= 0;:= 0;:= t1;(timeAbs < TimeOut) do

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

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;

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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!