Моделирование работы транспортного участка

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 15.05.2011
Размер файла 46,5 K

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

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

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

Содержание

Введение

1. Теоретические сведения

1.1 Понятие модель, компьютерное моделирование. Примеры

1.2 Использование алгоритмов и методов

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

2.1 Входная, выходная информация

2.2 Описание алгоритма

3. Описание программы

3.1 Логическая структура

3.2 Инструкция пользователя

3.3 Результаты расчетов

4. Листинг программ

Заключение

Список литературы

Введение

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

Целью выполнения работы является создание программы, моделирующей систему массового обслуживание. По введенным параметрам программа должна позволять производить анализ работы системы и выдавать результат. Целью программы также является приобретение знаний в моделировании, как общих систем, так и систем массового обслуживания в частности. Необходимо получить навыки системного исследования реальной динамической сложной системы на основе построения ее имитационной модели. Темой данного курсового проекта является моделирование работы транспортного участка. В качестве среды программирования была выбрана визуальная среда Delphi 7, которая удовлетворяет всем требованиям по созданию визуальных приложений для операционной среды Microsoft Windows.

1. Теоретические сведения

1.1 Понятие модель, компьютерное моделирование. Примеры

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

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

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

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

Как же происходит процесс компьютерного моделирования?

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

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

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

Начнем с того, что сформулируем задачу математическим языком. Итак, из эксперимента известно, что, если масса бактерий - X грамм, то за сутки появится AX и погибнет BX2 грамм бактерий. Коэффициенты A и B определяются опытным путем для каждого вида бактерий. Ежедневно забирается M грамм. Таким образом, к началу следующего дня масса будет равна

X+(AX-BX2)-M = X (A+1-BX)-M.

Этой формулы нам достаточно, чтобы рассчитать массу бактерий через день, если мы знаем начальную; затем - пользуясь этой же формулой - найдем массу через 2 дня; используя уже это значение как исходное - то, что будет через 3 дня и так далее. Такой способ вычисления последовательности называется рекуррентным.

Исходными данными будут:

X0 - начальная масса бактерий;

A, B - экспериментально определенные коэффициенты;

M - масса бактерий, забираемая ежедневно на нужды производства.

Результат - масса бактерий через 1, 2, 3... дня. Обозначим ее "X". Для определенности будем вести расчет для 100 дней.

Итак, модель построена. Что дальше?

На следующем этапе нужно разработать алгоритм ее исследования (либо подобрать готовый). Потом - составить программу, реализующую этот алгоритм.

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

это биомасса

спроси [Коэффициент А]

пусть “A ответ

спроси [Коэффициент B]

пусть “B ответ

спроси [Ежедневный расход M]

пусть “M ответ

спроси [Начальная масса X0]

пусть “X0 ответ

пусть “X :X0

повтори 100

[

пусть “X следующее значение :A :B :M :X

пиши :X

]

Конец

Для вычисления следующего значения воспользуемся выведенной нами формулой:

это следующее значение :A :B :M :X

пусть “Y :X * (:A + 1 - :B * :X) - :M

выход :Y

конец

Здесь используется так называемая "процедура-функция" (или просто функция). Последняя команда в ней - "выход" (вых, output, op) - указывает компьютеру, что нужно передать (или, как говорят программисты, "вернуть") основной программе.

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

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

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

Для полной остановки программы в Лого служит команда "останов" (stopall).

Внесем соответствующие изменения в функцию "следующее значение".

это следующее значение :A :B :M :X

пусть “Y :X * (:A + 1 - :B * :X) - :M

если иначе :Y > 0

выход :Y

сообщи [Все бактерии погибли!]

конец

Теперь модель будет работать корректно. Конечно, программу можно усовершенствовать, например, сделав вывод результатов не только в числовой форме, но и в виде графика. Можно совершенствовать и модель (если обнаружатся дополнительные факторы, оказывающие влияние на развитие бактерий, или удастся найти формулу, более точно описывающую этот процесс).

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

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

Первые два класса моделей применимы в случаях, когда нет сил, противодействующих выбранной цели. Реально же нередки ситуации, в которых различные участники имеют несовпадающие интересы. Яркими примерами являются игры "верю - не верю" или "камень-ножницы-бумага". Раздел математики, занимающийся моделированием таких ситуаций называется теорией игр, а соответствующие модели - игровыми. Однако, это не значит, что это нечто несерьезное. Использовать такие модели приходится и в весьма серьезных обстоятельствах.

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

1.2 Использование алгоритмов и методов

Методика получения случайных величин заключается в следующем:

1) разыгрывается случайное число из выборки чисел, равномерно распределенных в интервале [0;1];

2) полученное число некоторым образом преобразуется в эквивалентное ему значение в соответствии с заданным законом распределения.

Если говорить о распределениях данной задачи, то они следующие:

1) Экспоненциальное (показательное) распределение - абсолютно непрерывное распределение, моделирующее время между двумя последовательными свершениями одного и того же события. Случайная величина X имеет экспоненциальное распределение с параметром л > 0, если её плотность имеет вид:

Пример. Пусть есть магазин, в который время от времени заходят покупатели. При определённых допущениях время между появлениями двух последовательных покупателей будет случайной величиной с экспоненциальным распределением. Среднее время ожидания нового покупателя равно 1 / л. Сам параметр л тогда может быть интерпретирован, как среднее число новых покупателей за единицу времени.

Алгоритм:

1) Генерируем очередное значение х базовой последовательности.

2) Вычисляем

k=1/л ln х.

2) Нормальное (Гаусса) распределение - распределение вероятностей, которое задается функцией плотности распределения:

где параметр м - среднее значение (математическое ожидание) случайной величины и указывает координату максимума кривой плотности распределения, а уІ - дисперсия.

1) х1, х2 - независимая реализация чисел базовой последовательности.

v1=2*x-1; v2=2*x2-1

S=v12+v22

2) проверяется условие S<=1, если да, то выполняется пункт 4, если нет, возвращаемся в пункт 1.

N=m+уv1v-2 lnS/S

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

Говорят, что случайная величина имеет непрерывное равномерное распределение на отрезке [a,b], где , если её плотность fX(x) имеет вид:

Алгоритм:

3) Генерируем очередное значение х базовой последовательности.

4) Вычисляем результат по формуле:

r=a+(b-a)*x.

Метод Дэвиса используется в данной задачи для генерации базовой последовательности начальных значений х0 и х1.

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

Моделирование работы транспортного участка. Диспетчер управляет транспортом участка и имеет в своем распоряжении два грузовика. Заявки на перевозки поступают к диспетчер через случайные промежутки времени, имеющие плотность вероятности f(ф). С вероятностью 0,5 диспетчер запрашивает по радио один из грузовиков и передает ему заявку, если тот свободен. В противном случае он запрашивает другой грузовик и таким образом продолжает сеансы связи, пока один из грузовиков не освободится. Каждый сеанс связи длится отрезок времени, который является случайной величиной с плотностью вероятности ш(ф). Диспетчер допускает накопление у себя до пяти заявок, после чего вновь прибывшие заявки получают отказ. Время, за которое грузовики выполняют заявки на перевозку - случайная величина с плотностью вероятности ц(ф).

Смоделировать работу транспортного участка в течение 12 часов. Вероятность обслуживания заявки. Определить коэффициент загрузки грузовиков.

№ варианта

f(ф)

ц(ф)

ш(ф)

13

Норм.

Равн.

Экспоненц.

2.1 Входная, выходная информация

пп

Наименование реквизита

Условное обозначение

Тип данных

1

Минимальный промежуток поступления заявок

a

Single

2

Максимальный промежуток поступления заявок

b

Single

3

Мат. ожидание

m

Single

4

Отклонение от мат. ожидания

d

Single

5

Интенсивность поломок

L

Single

6

Количество прогонов

N

Single

7

Время моделирования

Tmod

Single

8

Время тех.перерыва

Ttech

Single

9

Среднее время ожидания

Rez1

Single

10

Средняя длина очереди

Rez2

Single

2.2 Описание алгоритма

1. Присвоение начальных значений х0 и х1 для генерации базовой последовательности методом Дэвиса.

2. Ввод параметров моделирования.

3. Организация циклов по числу прогонов.

4. Вызов основной подпрограммы.

5. Суммирование итогов всех прогонов.

6. Усреднение итогов.

7. Вывод усреднённых итогов моделирования.

1. Tsys - текущее время моделирования.

2. Och - длина очереди.

3. Koa - количество обслуживаемых станции.

4. Tosk - время освобождения канала.

5. Sto - среднее время обслуживания.

6. Kpo - количество поставок на обслуживание.

7. Ttp - время технического перерыва.

8. Вызов процедуры NormRasp.

9. Вычисление Tsys, Och, Kpo.

10. Проверка: достигнут ли конец интервала моделирования?

11. Если да, то вывод промежуточных итогов в отладочную печать.

12. Проверка, имеется ли очередь и не завершилось ли время моделирования?

13. Если да, то проверяем разницу между временем моделирования и временем технического перерыва.

14. Если время моделирования меньше времени тех. Перерыва, то выполняем суммирование расчетов.

15. Проверка, равна ли очередь 0?

16. Если да, то выполняем суммирование среднего времени обслуживания.

17. Если нет, то переходим к приему очередной заявки. Программа завершает работу после регистрации заявки за пределами интервала Tsys.

3. Описание программы

3.1 Логическая структура

Структура задачи включает в себя:

1) Function Devis(), т.е функция Дэвиса позволяет сгенерировать базовую последовательность.

2) В функциях ExpRasp (вычисляет экспоненциальное распределение), NormRasp (вычисляет нормальное распределение),RavRasp (вычисляет равномерное распределение) вызывается функция Дэвиса, для генерирования базовой последовательности.

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

3.2 Инструкция пользователя

Для вызова программы Delphi 7, нужно запустить Delphi 7 пуск программы Delphi 7. После запуска программы необходимо открыть рабочую Книгу1 (Module1), нажав на иконку Insert Module, на панели инструментов. В открывшейся Книге1 вводим данные для расчетов и смотрим результаты. Запуск просмотра результатов производится нажатием кнопки Run или клавишей F5.

моделирующий экспоненциальный имитационный системный

3.3 Результаты расчетов

пп

Наименование реквизита

Диапазон допустимых значений

1

Минимальный промежуток поступления загрузки

8

2

Максимальный промежуток поступления заявок

155

3

средняя длина очереди

-9,142857

4

Средняя длина ожидания

-0,0589861751152074

5

Средняя время пребывания в системе

-0,00737327188940092

6

Средняя число заявок

-1,14285714285714

4. Листинг программ

unit Unit1;

interface

uses

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

Grids;

type

TForm1 = class(TForm)

StringGrid1: TStringGrid;

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

word:string;

words:TStringList;

i:integer;

implementation

{$R *.DFM}

Form1.slString=TStringList.Create;

for i:=1 to 8 do

begin

word:=IntTostr(i);

words.add(word)

end

end.

unit TransTask;

interface

uses

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

StdCtrls, ExtCtrls, Grids, ComCtrls, Math;

type

TfmTransTask = class(TForm)

pgcTransTask: TPageControl;

tbsAbout: TTabSheet;

tbsData: TTabSheet;

tbsTarif: TTabSheet;

tbsSolve: TTabSheet;

Label1: TLabel;

edProviderCount: TEdit;

spnProviderCount: TUpDown;

Label2: TLabel;

stgProvider: TStringGrid;

Label3: TLabel;

Label4: TLabel;

edCustomerCount: TEdit;

spnCustomerCount: TUpDown;

stgCustomer: TStringGrid;

Label5: TLabel;

lblTypeTask: TLabel;

lblProviderGruz: TLabel;

lblCustomerGruz: TLabel;

stgTarif: TStringGrid;

stgSolve: TStringGrid;

rgMetod: TRadioGroup;

rbMinelem: TRadioButton;

rbFogel: TRadioButton;

rbTwoWall: TRadioButton;

btnSolve: TButton;

btnPrint: TButton;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

btnLoadData: TButton;

btnLoadDataC: TButton;

lblProvider: TLabel;

lblCustomer: TLabel;

lblTupeTask: TLabel;

lblMsg: TLabel;

Label10: TLabel;

lblZ: TLabel;

procedure FormCreate(Sender: TObject);

procedure edProviderCountChange(Sender: TObject);

procedure edCustomerCountChange(Sender: TObject);

procedure btnLoadDataClick(Sender: TObject);

procedure btnLoadDataCClick(Sender: TObject);

procedure btnSolveClick(Sender: TObject);

procedure btnPrintClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmTransTask: TfmTransTask;

a,b: array of integer;// наличие груза у поставщиков

// и спрос у потребителей

c: array of array of integer; // матрица тарифов перевозок

d: array of array of integer;// матрица перевозок (решение)

z,m,n:integer; //число поставщиков и потребителей

s:string;

implementation

{$R *.DFM}

procedure ShowSolve;

var

i,j:integer;

begin

for i:= 0 to m-1 do

for j:= 0 to n-1 do

fmTransTask.stgSolve.Cells[j+1,i+1]:=IntToStr(d[i,j]);

fmTransTask.lblZ.Caption:=IntToStr(z);

end;

procedure Minelem;

label

l1;

var

i,j,imin,jmin,cmin:integer;

set_i:set of 0..255;

set_j:set of 0..255;

begin

// создаем множество индексов

set_i:=[];

for i:=0 to m-1 do include(set_i,i);

set_j:=[];

for j:=0 to n-1 do include(set_j,j);

z:=0;

repeat

// поиск первоначального минимального элемента в матрице тарифов

for i:= 0 to m-1 do

for j:= 0 to n-1 do

if (i in set_i) and (j in set_j) then

begin

cmin:=c[i,j];

goto l1

end;

l1:

// поиск минимального элемента в

// в матрице тарифов c

for i:= 0 to m-1 do

for j:= 0 to n-1 do

if (i in set_i) and (j in set_j) then

if c[i,j]<=cmin then

begin

cmin:=c[i,j];

imin:=i;

jmin:=j

end;

// определение величины поставки

d[imin,jmin]:=min(a[imin],b[jmin]);

// определяем исключаемую строку столбец

a[imin]:=a[imin]-d[imin,jmin];

if a[imin]=0 then

exclude(set_i,imin);

b[jmin]:=b[jmin]-d[imin,jmin];

if b[jmin]=0 then

exclude(set_j,jmin);

z:=z+d[imin,jmin]*cmin

until (set_i=[]) and (set_j=[]);

ShowSolve

end;

procedure Fogel;

var

i,j:integer;

cminprev,cmin:integer;

SubCol,SubRow:array of array of integer;

set_i,set_j:set of 0..255;

imin,jmin:integer;

imax,jmax:integer;

SubRowMax,SubColMax:integer;

begin

// размещаем массивы

SetLength(SubRow,m);

for i:= 0 to m-1 do SetLength(SubRow[i],2);

SetLength(SubCol,n);

for j:= 0 to n-1 do SetLength(SubCol[j],2);

set_i:=[];

for i:=0 to m-1 do include(set_i,i);

set_j:=[];

for j:=0 to n-1 do include(set_j,j);

repeat

// цикл по строкам

for i:= 0 to m-1 do

if i in set_i then

begin

// ищем первоначальный минимальный элемент в строке

for j:= 0 to n-1 do

if j in set_j then

begin

cmin:=c[i,j];

break

end;

// ищем 1-ое наименьшее значение в строке

for j:= 0 to n-1 do

if j in set_j then

if c[i,j]<=cmin then

begin

cmin:=c[i,j];

SubRow[i,1]:=j

end;

cminprev:=cmin;

// ищем первоначальный минимальный элемент в строке

for j:= 0 to n-1 do

if (j in set_j) and (j<>SubRow[i,1]) then

begin

cminprev:=c[i,j];

break

end;

// ищем 2-ое наименьшее значение в строке

for j:= 0 to n-1 do

if (j in set_j) and (j<>SubRow[i,1]) then

if c[i,j]<=cminprev then

cminprev:=c[i,j];

// Вычисляем разность между двумя наименьшими

SubRow[i,0]:=cminprev-cmin;

end;

// цикл по столбцам

for j:= 0 to n-1 do

if j in set_j then

begin

// ищем первоначальный минимальный элемент в столбце

for i:= 0 to m-1 do

if i in set_i then

begin

cmin:=c[i,j];

break

end;

// ищем 1-ое наименьшее значение в столбце

for i:= 0 to m-1 do

if i in set_i then

if c[i,j]<=cmin then

begin

cmin:=c[i,j];

SubCol[j,1]:=i

end;

cminprev:=cmin;

// ищем первоначальный минимальный элемент в столбце

for i:= 0 to m-1 do

if (i in set_i) and (i<>SubCol[j,1]) then

begin

cminprev:=c[i,j];

break

end;

// ищем 2-ое наименьшее значение в столбце

for i:= 0 to m-1 do

if (i in set_i) and (i<>SubCol[j,1]) then

if c[i,j]<=cminprev then

cminprev:=c[i,j];

// Вычисляем разность между двумя наименьшими

SubCol[j,0]:=cminprev-cmin;

end;

//отыскиваем максимальное значение в строке

// сперва находим начальный наибольший элемент

for i:= 0 to m-1 do

if i in set_i then

begin

SubRowMax:=Subrow[i,0];

break

end;

// Теперь просматриваем всю строку

for i:= 0 to m-1 do

if i in set_i then

if SubRow[i,0]>=SubRowMax then

begin

SubRowMax:=SubRow[i,0];

imax:=i

end;

//отыскиваем максимальное значение в строке

// сперва находим начальный наибольший элемент

for j:= 0 to n-1 do

if j in set_j then

begin

SubColMax:=SubCol[j,0];

break

end;

// Теперь просматриваем всю строку

for j:= 0 to n-1 do

if j in set_j then

if SubCol[j,0]>=SubColMax then

begin

SubColMax:=SubCol[j,0];

jmax:=j

end;

// сравниваем максимальное значение разности по строкам и столбцам

if SubRowMax>SubColMax then

begin

d[imax,SubRow[imax,1]]:=min(a[imax],b[SubRow[imax,1]]);

a[imax]:=a[imax]-d[imax,SubRow[imax,1]];

b[SubRow[imax,1]]:=b[SubRow[imax,1]]-d[imax,SubRow[imax,1]];

if a[imax]=0 then Exclude(set_i,imax);

if b[SubRow[imax,1]]=0 then

Exclude(set_j,SubRow[imax,1]);

z:=z+d[imax,SubRow[imax,1]]*c[imax,SubRow[imax,1]];

if set_i=[] then set_j:=[];

if set_j=[] then set_i:=[]

end

else

begin

d[SubCol[jmax,1],jmax]:=min(a[SubCol[jmax,1]],b[jmax]);

a[SubCol[jmax,1]]:=a[SubCol[jmax,1]]-d[SubCol[jmax,1],jmax];

b[jmax]:=b[jmax]-d[SubCol[jmax,1],jmax];

if a[SubCol[jmax,1]]=0 then Exclude(set_i,SubCol[jmax,1]);

if b[jmax]=0 then

Exclude(set_j,SubCol[jmax,1]);

z:=z+d[SubCol[jmax,1],jmax]*c[SubCol[jmax,1],jmax];

if set_i=[] then set_j:=[];

if set_j=[] then set_i:=[]

end

until (set_i=[]) and (set_j = []);

ShowSolve

end;

procedure TwoWall;

var

RowMin,ColMin:integer;

i,j,jj,j0:integer;

imin,jmin:integer;

set_i,set_j:set of 0..255;

begin

set_i:=[];

for i:=0 to m-1 do include(set_i,i);

set_j:=[];

for j:=0 to n-1 do include(set_j,j);

repeat

// начинаем цикл по столбцам

for j:= 0 to n-1 do

if j in set_j then

begin

// находим начальный минимальный элемент строки

for i:= 0 to m-1 do

if i in set_i then

begin

RowMin:=c[i,j];

break

end;

// теперь просматриваем весь столбец

for i:=0 to m-1 do

if i in set_i then

if c[i,j]<=RowMin then

begin

RowMin:=c[i,j];

imin:=i

end;

// минимальный элемент в j-ом столбце найден

// проверяем , минимальный ли он в своей строке

j0:=j;

for jj:= 0 to n-1 do

if jj in set_j then

if c[imin,jj]< RowMin then

j0:=jj;

// проверяем по индексу не тот ли это элемент

if j=j0 then

begin

d[imin,j]:=min(a[imin],b[j]);

a[imin]:=a[imin]-d[imin,j];

b[j]:=b[j]-d[imin,j];

if a[imin]=0 then exclude(set_i,imin);

if b[j]=0 then exclude(set_j,j);

z:=z+d[imin,j]*c[imin,j];

end

end

until (set_i=[]) and (set_j=[]);

ShowSolve

end;

procedure TfmTransTask.FormCreate(Sender: TObject);

var

i,j:integer;

begin

m:=3;

n:=3;

SetLength(a,m);

for i:= 0 to m-1 do a[i]:=0;

SetLength(b,n);

for j:= 0 to n-1 do b[j]:=0;

SetLength(c,m);

for i:= 0 to m-1 do SetLength(c[i],n);

for i:= 0 to m-1 do

for j:= 0 to n-1 do

c[i,j]:=0;

SetLength(d,m);

for i:= 0 to m-1 do SetLength(d[i],n);

for i:= 0 to m-1 do

for j:= 0 to n-1 do

d[i,j]:=0;

for i:= 1 to m do

begin

stgProvider.Cells[i-1,0]:=IntToStr(i);

str(a[i-1],s);

stgProvider.Cells[i-1,1]:=s;

end;

for j:= 1 to n do

begin

stgCustomer.Cells[j-1,0]:=IntToStr(j);

str(b[j-1],s);

stgCustomer.Cells[j-1,1]:=s;

end;

for i:= 1 to m do

stgTarif.Cells[0,i]:=IntToStr(i);

for j:= 1 to n do

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

for i:= 1 to m do

stgSolve.Cells[0,i]:=IntToStr(i);

for j:= 1 to n do

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

end;

procedure TfmTransTask.edProviderCountChange(Sender: TObject);

var

i:integer;

begin

stgProvider.ColCount:=StrToInt(edProviderCount.Text);

stgTarif.RowCount:=stgProvider.ColCount+1;

stgSolve.RowCount:=stgTarif.RowCount;

m:=StrToInt(edProviderCount.Text);

SetLength(a,m);

SetLength(c,m);

for i:= 0 to m-1 do SetLength(c[i],n);

SetLength(d,m);

for i:= 0 to m-1 do SetLength(d[i],n);

stgProvider.Cells[stgProvider.ColCount-1,0]:=edProviderCount.Text;

stgTarif.Cells[0,stgProvider.ColCount]:=edProviderCount.Text;

stgSolve.Cells[0,stgProvider.Colcount]:=edProviderCount.Text;

end;

procedure TfmTransTask.edCustomerCountChange(Sender: TObject);

var

i:integer;

begin

stgCustomer.ColCount:=StrToInt(edCustomerCount.Text);

stgTarif.ColCount:=stgCustomer.ColCount+1;

stgSolve.ColCount:=stgTarif.ColCount;

n:=StrToInt(edCustomerCount.Text);

SetLength(b,n);

SetLength(c,m);

for i:= 0 to m-1 do SetLength(c[i],n);

SetLength(d,m);

for i:= 0 to m-1 do SetLength(d[i],n);

stgCustomer.Cells[stgCustomer.ColCount-1,0]:=edCustomerCount.Text;

stgTarif.Cells[stgCustomer.ColCount,0]:=edCustomerCount.Text;

stgSolve.Cells[stgCustomer.Colcount,0]:=edCustomerCount.Text;

end;

procedure TfmTransTask.btnLoadDataClick(Sender: TObject);

var

i,j:integer;

suma,sumb:integer;

begin

for i:= 0 to m-1 do

if stgProvider.Cells[i,1]<>'' then

a[i]:=StrToInt(stgProvider.Cells[i,1])

else

a[i]:=0;

suma:=0;

for i:= 0 to m-1 do suma:=suma+a[i];

lblProvider.Caption:=IntToStr(suma);

for j:= 0 to n-1 do

if stgCustomer.Cells[j,1]<>'' then

b[j]:=StrToInt(stgCustomer.Cells[j,1])

else

b[j]:=0;

sumb:=0;

for j:= 0 to n-1 do sumb:=sumb+b[j];

lblCustomer.Caption:=IntToStr(sumb);

if sumb<>suma then

begin

lblTypeTask.Caption:='Открытая';

If sumb>suma then

lblMsg.Caption:='Создать фиктивного поставщика с грузом '+IntToStr(sumb

-suma);

if sumb<suma then

lblMsg.Caption:='Создать фиктивного потребителя со спросом '+

IntToStr(suma-sumb)

end

else

begin

lblTypeTask.Caption:='Закрытая';

lblMsg.Caption:=''

end;

btnSolve.Enabled:=True

end;

procedure TfmTransTask.btnLoadDataCClick(Sender: TObject);

var

i,j:integer;

begin

for i:= 0 to m-1 do

for j:= 0 to n-1 do

if stgTarif.Cells[j+1,i+1]<>'' then

c[i,j]:=StrToInt(stgTarif.Cells[j+1,i+1]);

end;

procedure TfmTransTask.btnSolveClick(Sender: TObject);

begin

if rbMinelem.Checked then Minelem;

if rbFogel.Checked then Fogel;

if rbTwoWall.Checked then TwoWall

end;

procedure TfmTransTask.btnPrintClick(Sender: TObject);

var

i,j:integer;

out:TextFile;

begin

AssignFile(out,'rezult.txt');

Rewrite(out);

writeln(out,' Исходные данные транспортной задачи');

writeln(out,'потребность потребителей');

for j:= 0 to n-1 do write(out,b[j]:8);

writeln(out);

writeln(out,'Матрица тарифов перевозок');

for i:= 0 to m-1 do

begin

write(out,a[i]:8);

for j:= 0 to n-1 do write(out,c[i,j]:8);

writeln(out)

end;

writeln(out,'Матрица перевозок (решение)');

for i:= 0 to m-1 do

begin

for j:= 0 to n-1 do write(out,d[i,j]:8);

writeln(out)

end;

CloseFile(out);

end;

End.

Заключение

В ходе работы была создана программа, позволяющая моделировать систему массового обслуживания: Моделирование работы транспортного участка. Программа позволяет производить анализ деятельности системы в целом обслуживания для наиболее эффективной работы системы. Программа позволяет сохранять результаты экспериментов в файл, что тоже сопутствует проведению исследования. Написанное программное средство в ходе моделирования визуально показывает пользователю основные параметры системы. Если у пользователя возникают вопросы по работе с программой, нажатие клавиши F1 позволяет вызвать подробную справку, что делает программу понятной для любого пользователя. Проводя исследования работы данной системы, можно опираться на то, что при свободных аппаратах обслуживания, зритель идет в первый свободный аппарат, что позволяет определить загруженность системы по работе последнего аппарата и среднего времени проведенному зрителями в очереди. Если система работает не в полную силу, то по диаграмме "Выполнение заявок" видно, что большая часть заявок обслуживается первым аппаратом, а длина очереди стремится к нулю. Данная курсовая работа позволила проследить процесс моделирования систем массового обслуживания от начала и до конца. В ходе работы над задачей были изучены основные принципы модуляции псевдослучайных чисел с использованием таких законов распределения как:

1) Экспоненциальный;

2) Нормальный.

3) Равномерный;

Также были успешно подтверждены познания в написании программы в среде программирования Delphi 7.

Список литературы

1. Немнюгин С.А. Turbo PASCAL С-П Изд-во Питер 2000.

2. Фаронов В.В. Turbo Pascal 7.0. М. "Нолидж", 1999

3. Семакин И.Г., Шестаков А.П. Основы программирования Москва Из-во "Академия" 2007

4. Васюкова Р.Д., Практикум по основам программирования, Язык ПАСКАЛЬ, М, ВШ, 1991

5. Новичков В.С., Алгоритмические языки в техникуме, ПАСКАЛЬ, М, 1990

6. Культин Н. Turbo Pascal в задачах и примерах Санкт - Петербург "БХВ - Петербург" 2007

7. А.И. Марченко, Л.А. Марченко. Программирование в среде Turbo Pascal 7.0 Москва из-во "Юниор" 1997

8. Кирнос В.И. Язык Паскаль и численные методы. Из-во "Келеш-2030" 2004.

Размещено на Allbest.ru


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

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

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

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

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

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

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

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

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

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

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

  • Характеристика функций имитационного моделирования. Знакомство с особенностями имитационного моделирования агрегированной системы массового обслуживания. Анализ программы GPSSWorld: рассмотрение возможностей, способы составления имитационной модели.

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

  • Понятие компьютерной модели и преимущества компьютерного моделирования. Процесс построения имитационной модели. История создания системы GPSS World. Анализ задачи по прохождению турникета на стадион посредством языка имитационного моделирования GPSS.

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

  • Методика и особенности составления имитационной модели системы массового обслуживания (СМО). Анализ и статистическая обработка показателей эффективности СМО путем решения уравнения Колмогорова, их сравнение с результатами аналитического моделирования.

    курсовая работа [609,2 K], добавлен 31.01.2010

  • Программа, моделирующая систему массового обслуживания (СМО). Моделирование программы имитации работы турникетов на стадионе (многоканальная СМО) в визуальной среде Delphi 7. Описание программного модуля, листинг программы и руководство пользователя.

    курсовая работа [3,8 M], добавлен 20.08.2009

  • Концептуальная модель процесса обслуживания покупателей в магазине. Описание системы моделирования GPSS. Разработка моделирующей программы на специализированном языке имитационного моделирования в среде AnyLogic. Результаты вычислительных экспериментов.

    курсовая работа [906,9 K], добавлен 12.07.2012

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