Задание № 150 "Морской порт" с сайта Е.Н. Каширской из файла "База заданий"
Ссылка на сайт с заданием: https://lizochekk.jimdofree.com/программирование/
Требуется создать компьютерную модель обслуживания потока заявок на разгрузку, поступающих от грузовых судов (сухогрузов и танкеров), прибывающих в морской порт.
Условия.
- Грузовые суда прибывают в порт согласно расписанию, но возможны опоздания и досрочные прибытия.
- Расписание включает день и время прибытия, название судна, вид груза и его вес, а также планируемый срок стоянки в порту для разгрузки.
- Для разгрузки судов в порту используются три вида разгрузочных кранов,
соответствующих трем видам грузов:
- сыпучим грузам,
- жидким грузам,
- контейнерам.
- Число разгрузочных кранов каждого вида ограничено, так что поступающие заявки на разгрузку одного вида груза образуют очередь.
- Длительность разгрузки судна зависит от вида и веса его груза, а также некоторых других факторов, например, погодных условий.
- Любой дополнительный (сверх запланированного срока) день стояния судна в порту (из-за ожидания разгрузки в очереди или из-за задержки самой разгрузки) влечет за собой выплату штрафа (например, 2 тыс. у.е. за каждый дополнительный день простоя судна).
- При моделировании прибытия судов отклонение их от расписания рассматривается как случайная величина с равномерным распределением в некотором интервале (например, от -2 до 9 дней).
- Еще одной случайной величиной, изменяющейся в фиксированном диапазоне (например, от 0 до 12 дней), является время задержки окончания разгрузки судна по сравнению с обычным (зависящим только от вида груза и его веса).
- Цель моделирования работы морского порта – определение для заданного расписания прибытия судов минимально достаточного числа кранов в порту, позволяющего уменьшить штрафные суммы.
- Период моделирования – месяц, шаг моделирования – 1-3 дня.
- В параметры моделирования следует включить расписание прибытия судов, количество кранов каждого вида, диапазоны разброса случайных величин (отклонения от расписания прибытия и отклонения от обычного времени разгрузки), а также шаг моделирования.
- Визуализация моделируемого процесса должна предусматривать показ очередей у разгрузочных кранов, приход судов в порт и их отход после разгрузки, но визуализация не является обязательной.
- Должен быть показан также список произведенных разгрузок, в котором указывается:
- название разгруженного судна,
- время его прихода в порт,
- время ожидания в очереди на разгрузку,
- время начала разгрузки
- продолжительность разгрузки.
- По окончании моделирования должна быть выведена итоговая статистика:
- число разгруженных судов,
- средняя длина очереди на разгрузку,
- среднее время ожидания в очереди,
- максимальная задержка разгрузки,
- средняя задержка разгрузки,
- общая сумма выплаченного штрафа.
- Генерация файла введенной длины, содержащего расписание прибывающих в порт кораблей
- Построчное чтение данных из файла и запись информации в динамический массив
- Моделирование работы портов с целью определения минимального штрафа за простой кораблей при минимальном количестве портов
- Запись наилучшего варианта
- Визуализация очереди в определенный период времени для лучшей модели
- Запись в текстовый файл информации о разгруженных кораблях
- Запись в текстовый файл итоговой статстики
- Для удобства работы с данными о каждом корабле создан класс Ships, который позволяет записать всю необходимую информацию о корабле и выполнить промежуточные расчеты, например для вычисления задержки прибытия и разгрузки судна Данные обо всех кораблях хранятся в динамическом массиве (векторе), состоящем из объектов класса Ships
- Для удобства работы с кораблями в очереди создана структура Ships_in_queue, которая, также как и класс Ships позволяет хранить информацию о кораблях, находящихся в очереди
- Данные расписания генерируются (алгоритм описан в generator.cpp, функция generator())
- Выходные данные (разгруженные корабли, итоговая статистика) записываются в файл statics.txt
Проект разрабатывался в IDE CLion, используя компилятор MinGW и средство автоматизации сборки программного обеспечения из исходного кода CMake
- Клонировать репозиторий
В терминале Windows открыть необходимое расположение, ввести команду:
git clone https://github.com/Shkityrk/Seaport.git
Загрузить проект с репозитория GitHub
https://github.com/Shkityrk/Seaport.git
- Для правильного отображения выбрать необходимый способ кодировки.
Для этого необходимо открыть файл main.cpp, закомментировать/раскомментировать необходимую строку:
Для работы в Visual Studio:
setlocale(LC_ALL, "Russian");
В остальных случаях:
SetConsoleOutputCP(CP_UTF8);
- Запустить файл main.cpp и выполнить сборку проекта
- В консоли последовательно ввести 1, 2, 3 (это важно, так как увеличение количества операций просмотра очереди влечет изменение итоговой статистики). После этого ввести любой символ для завершения работы программы
- В папке data появятся два файла - input.txt(генерированный набор кораблей с данными) и statics.txt(файл со списком разгруженных за время моделирования кораблей и итоговой статистикой)