GPSS (з англ. General Purpose Simulation System – система моделювання загального призначення) – це мова програмування, котра призначена для імітаційного моделювання різноманітних систем, в основному масового обслуговування. В оригіналі мала назву Gordon's Programmable Simulation System, на честь розробника Джефрі Гордона (назва була змінена, коли її вирішили випускати як комерційний продукт). В загальних рисах це мова загального користування, котра дозволяє розв’язувати задачі покроково по часу. Система в цій мові моделюється як операції входу в систему і передається від одного сервісу до іншого у вигляді блоків. Ця система є доволі зручною для, наприклад, моделювання фабрики. Ця мова є менш гнучкою порівняно з деякими іншими мовами, але через свою простоту вона є популярною.
Програмний код цією мовою може здивувати багатьох програмістів, котрі мають досвід роботи з функціональними, процедурними чи об’єктно-орієнтованими мовами. Ця мова проектується як сутності, котрі рухаються впродовж виконання моделі. Така сутність називається Транзакцією. Передбачається, що вона рухається від блоку до блоку, під блоком розуміється лінійка коду, котра представляє одиничну дію, котра впливає на саму транзакцію, або на якісь інші сутності. Для новачка ця мова за структурою нагадуватиме фігурку з LEGO, де блоки - вибрані людиною, котра складає модель , специфічні функції . Від першого проектування у 1960 році , еволюція програми пішла від майнфреймів, таких як IBM та VAC до портативних комп’ютерів, котрі на той момент набирали популярність. Блоки можуть бути об’єктно-орієнтованими(напр. біржа праці) або діалоговими(напр. сигнали в електронних компонентах). GPSS зберігає шлях розвитку, тому на виході можна отримати стандартний звіт виконання. Сутності можуть бути широко класифіковані у Ресурсах, статистичних сутностей та обчислювальних сутностях. Ресурси, такі як об'єкти і системи зберігання, відображають обмежені ресурси потужності. Обчислювальні сутності такі як змінні, функції та генератори випадкових значень використовуються для відображення стану сутностей, або елементів їхнього середовища, а статистичні об'єкти, такі як черги або таблиці (гістограми) - збір статистичної інформації, що становить інтерес. .
Наступний код це фактично найпростіша програма мовою GPSS. Мета полягає в тому, щоб імітувати один день роботи перукарні. Клієнти прибувають у випадковому постійному потоці, входячи в магазин, в черзі, якщо цирульник зайнятий, то їх стрижка підлягає правилу: перший прийшов - перший обслужений, а потім покинути магазин. Ми хотіли б знати середню і максимальну чергу, а також кількість клієнтів.
SIMULATE ; Define model
*
* Model segment 1
*
GENERATE 18,6 ; Customer arrive every 18±6 mn
QUEUE Chairs ; Enter the line
SEIZE Joe ; Capture the barber
DEPART Chairs ; Leave the line
ADVANCE 16,4 ; Get a hair cut in 16±4 mn
RELEASE Joe ; Free the barber
TERMINATE ; Leave the shop
*
* Model segment 2
*
GENERATE 480 ; Timer arrives at time = 480 mn
TERMINATE 1 ; Shut off the run
*
* Control cards
*
START 1 ; Start one run
END ; End model
Сама програма знаходиться в програмних дужках Simulate та End і поділена на модельні сегменти і контрольних карт.
Перший сегмент моделі це відвідувач. Блок Generate створює потік операцій і графіків для входу в модель з часом прибуття, рівномірно розподіленим в діапазоні 18 ± 6. Відповідальність програміста інтерпретувати ці транзакції як клієнтів і зрозуміти, що час повинні бути підраховано протягом декількох хвилин. Транзакції починають рухатись від Generate від блоку до блоку допоки не досягнуть позиції Terminate. За нормальних умов транзакція рухається від одного блоку до другого, отже транзакція «відвідувач» покидає Generate і попадає у Queue Chairs . Цей блок симулює чергу очікування і зберігає статистику порядку. В цьому прикладі матеріалізуються черга крісел і в кінці симуляції, окрім інших речей ми матимемо ще й максимальну довжину черги. Блок QUEUE вимагає ім’я черги як параметр, тому що більше, ніж одна черга може існувати в моделі. Кожен з них пов'язаний з блоком Depart, який спрацьовує, коли транзакція залишає чергу. GPSS запам'ятовує, які транзакції в черзі, так що можна знати середній час, щоб переглянути, що ніяка транзакція не покидає чергу без попереднього введення в нього. Після блоку Queue Chairs, транзакція буде намагатися перейти до SEIZE Joe , блок імітації об’єкта з іменем Джо. Об’єкт моделі одинарних серверів місткий. Якщо об'єкт зайнятий, SEIZE буде забороняти вхід. У прикладі, клієнт буде чекати в блоці QUEUE. Якщо вона вільна, або як тільки вона стане доступною, то транзакції буде дозволено захопити об'єкт, позначити його як зайнятий для інших угод і почати відлік часу обслуговування та інші статистичні дані, поки ж транзакція не проходить відповідний RELEASE Джо блок. Пари Seize / RELEASE пов'язані з іменем об'єкта, оскільки багато незалежних об'єктів можуть існувати в моделі. Вони можуть моделювати оператори, як перукар, ремонтник, агент, але також й частини обладнання, як журавель, заправна станція, документ авторизації тощо, насправді нічого з ємністю одиниця. Для імітації кілька паралельних серверів, як команда з п'яти перукарів, або піч з ємністю 10, GPSS використовує об'єкти, названі Накопичувачами. Після того, як клієнт захоплює Джо, вона переходить до наступного оператора, котрим є Advance 16,4, завданням якого є заморозити об'єкт протягом заданого відрізка часу, тут випадкове число обирається між 16-4 = 12 і 16 + 4 = 20 хв , Інші розподіли часу обслуговування доступні через GPSS FUNCTION (дещо іншого поняття, ніж функції в інших мовах програмування). За цей час, інші операції будуть мати можливість переміщатися по моделі, блокуючи деякі інші об'єкти, які можуть існувати в моделі, але не Джо, бо цей об'єкт зайнятий замороженому клієнтом. Після заданого часу, клієнт прокинеться, перейде до наступного твердження, яке звільнить Джо, і Terminate. Тоді наступна транзакція на попередньому етапі, тобто клієнт сидить на стільці, зможе SEIZE Джо. Для того, щоб вибрати «наступну» угоду, GPSS використовує пріоритетність перший прийшов перший обслужений, . Інші стратегії вибору можуть бути запрограмовані шляхом прямого маніпулювання майбутнім ланцюгом подій для сутності.
Паралельно з цим першим сегментом, що імітує поведінку клієнта, друга модель сегмент імітує кінець дня. Під час 480 хв = 8 год об'єкт Generate, який буде Terminate на наступному блоці. На цей раз, TERMINATE як параметр 1, що означає спеціальний лічильник зменшується на 1. Коли лічильник досягає 0, програма зупиняється, і вихід друкується. Цей спеціальний лічильник встановлюється з твердженням Start. У прикладі, він встановлюється в одиницю, таким чином, моделювання завершиться після одного циклу роботи 480 хв в модельованому часі. На виході програма дасть наступні результати
FACILITY AVERAGE NUMBER AVERAGE SEIZING PREEMPTING
UTILIZATION ENTRIES TIME/TRAN TRANS. NO. TRANS. NO.
Joe .860 26 15.884 26
QUEUE MAXIMUM AVERAGE TOTAL ZERO PERCENT AVERAGE $AVERAGE TABLE CURRENT
CONTENTS CONTENT ENTRIES ENTRIES ZEROS TIME/TRANS TIME/TRANS NUMBER CONTENTS
Chairs 1 .160 27 12 44.4 2.851 5.133 1
$AVERAGE TIME/TRANS = AVERAGE TIME/TRANS EXCLUDING ZERO ENTITIES
Це вказує на те, що Джо був зайнятий 86,0% часу, підстриг 26 клієнтів і стрижка займала 15,88 хвилин в середньому. До речі, Джо підстриг 26 клієнтів, коли моделювання було закрито.Ніякого програмованого передбачення не було прийнято для перукаря, щоб закінчити стрижку перед тим, щоб закрити магазин.
Він також вказує, що максимум 1 клієнт був в очікуванні своєї черги, фактично, середня кількість очікуючих клієнтів була 0,160. В цілому 27 клієнтів були в черзі, так що 27 клієнтів все ще сиділи, чекаючи своєї черги, коли Джо закрив магазин. З цих 27 клієнтів, 12 були подані без необхідності чекати. Фактично, черга була порожня 44,4% часу. Середній час очікування склав 2,851 хв, а середній час очікування 15 = 27-12 клієнтів, які насправді чекали було 5,133 хв.