Моделирование работы транспортного участка
Обзор процесса создания программы, моделирующей систему массового обслуживания. Изучение системного исследования реальной динамической сложной системы на основе построения ее имитационной модели. Анализ экспоненциального показательного распределения.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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