Процедурная симуляция представляет систему как последовательность дискретных состояний. Начальные условия задают первое состояние, правило перехода вычисляет следующее по текущему состоянию и внешнему воздействию, а условие остановки определяет момент завершения. В отличие от отдельного цикла, здесь изменяется не один накопитель, а согласованная модель из нескольких величин, массивов и режимов.
Корректность симуляции зависит от семантики одного шага. Все изменения, относящиеся к моменту , должны выводиться из снимка состояния момента ; преждевременная запись способна превратить одновременный переход в последовательный и изменить саму модель. Инварианты связывают локальные переходы с глобальными свойствами: балансом ресурсов, сохранением числа объектов, допустимостью состояний и взаимоисключительностью исходов.
Один прогон показывает только отдельную траекторию. Исследование требует фиксировать параметры и seed, менять один фактор за раз, проводить серии, измерять разброс и подтверждать основной вывод независимым способом. Технический отчёт обязан отделять спецификацию модели от реализации, наблюдение от объяснения и подтверждённый вывод от ограничения эксперимента.
Опора — Раздел 27: процедурная симуляция. Дополнительно используется весь инструментарий Разделов 1–26.
Каждая задача оформляется как отдельная консольная программа полного формата курса и компилируется с
<Nullable>enable</Nullable>. До реализации создаётся паспорт симуляции: назначение; параметры и внешние воздействия; модель состояния; начальные условия; точный порядок событий одного шага; правило переходаcurrent → next; условие остановки; возможные исходы; инварианты; план ручной и программной проверки; оценка времени и дополнительной памяти; состав итогового отчёта. Вычислительное ядро не обращается к консоли и файлам. Следующее состояние вычисляется только из снимка текущего; массивы обновляются через отдельный буфер, если задача прямо не исследует изменение на месте.Randomсоздаётся вне модели и передаётся параметром;seed, версия.NETи параметры прогона фиксируются. Потенциально незавершающийся процесс ограничиваетсяMaxSteps, но достижение предела оформляется отдельным исходом и не смешивается с естественным завершением. Разрешены только конструкции Разделов 1–27. Классы предметной области, свойства, пользовательские конструкторы, обобщённые коллекции,LINQ, делегаты, лямбда-выражения, асинхронность и многопоточность запрещены.
База практических заданий
Уровень I. Базовый
Состав состояния, представление данных, начальные условия, порядок событий, правило перехода, условие остановки и проверяемый инвариант полностью заданы. Требуется без искажения реализовать один шаг и управляющий цикл, вручную вычислить малую трассу и подтвердить итог независимым балансом либо повторным расчётом. Ученик не выбирает модель: сложность возрастает от одного ресурсного баланса к синхронным массивам, нескольким исходам, псевдослучайному состоянию, внешним данным и составной аварийной системе.
1. Резервуар с ограниченной ёмкостью: Объявить ReservoirState с полями int Step, long Volume, long TotalInflow, long TotalReleased, long TotalSpilled. Даны ёмкость , начальный объём и одинаковые по длине массивы притока и запрошенного выпуска . На шаге последовательно вычисляются
Метод Step получает текущее состояние, значения , и и возвращает новое состояние. Выполнение завершается после последней пары воздействий. После каждого шага проверять диапазон и баланс
Первые четыре шага рассчитать вручную и вывести таблицу step / inflow / demand / released / spilled / volume.
2. Термостат с гистерезисом: Объявить ThermostatState с полями int Step, double Temperature, bool HeaterOn, double EnergyUsed. Даны нижняя и верхняя границы , массив внешней температуры , нагрев за шаг , коэффициент теплообмена и расход энергии . Режим следующего интервала выбирается по текущей температуре: при нагреватель включается, при выключается, между границами сохраняет прежний режим. Затем из снимка вычисляется
Расход увеличивается на только для включённого интервала. Симуляция выполняет ровно outside.Length шагов. Сверить ручную трассу с программной, отдельно проверить температуры ровно на и и объяснить, почему два порога исключают быстрое переключение около одной границы.
3. Очередь ограниченной длины: Объявить QueueState с полями int Step, int Waiting, long TotalArrived, long TotalServed, long TotalRejected, long IdleCapacity. Даны максимальная длина очереди , производительность прибора и массив поступлений . На каждом шаге сначала принимаются новые заявки: в очередь попадает не больше свободных мест, остальные отклоняются. Затем прибор обслуживает заявок; неиспользованная часть мощности прибавляется к IdleCapacity. Выполнение завершается после последнего значения массива. Проверить инвариант
и границу . Вывести полную трассу, число шагов с переполнением и коэффициент загрузки прибора как отношение обслуженной мощности к доступной.
4. Одновременный перенос по кольцу: Даны ячеек с неотрицательными целыми запасами amounts и таблица запросов requested[step, cell]. На шаге каждая ячейка передаёт ячейке величину
Все вычисляются по одному снимку текущего массива, после чего
Реализовать Step(int[] current, int[] requestedRow) с новым массивом результата; исходный массив не изменяется. Симуляция выполняет число строк таблицы запросов. После каждого шага проверять неотрицательность и сохранение общей суммы. Для первого шага вручную показать массивы sent и next; дополнительно подтвердить через ReferenceEquals, что последовательные состояния являются разными объектами.
5. Целочисленное рассеивание на сетке: Дана прямоугольная таблица неотрицательных целых величин. На шаге каждая ячейка вычисляет и передаёт по каждой существующей ортогональной соседней ячейке; остаток, включая доли, предназначенные отсутствующим соседям за границей, сохраняется в исходной позиции. Следующее состояние накапливается в отдельной нулевой таблице. Выполнить заданное число шагов, сохраняя начальное и все последующие состояния в трёхмерном массиве int[,,] history, где первое измерение обозначает номер снимка, второе — строку, третье — столбец. После каждого шага проверять сохранение общей суммы и отсутствие отрицательных значений. Для таблицы с массой только в центре вручную получить два первых состояния и сверить каждую координату.
6. Детерминированная модель эпидемии: Объявить EpidemicState с полями int Step, int Susceptible, int Infected, int Recovered, int PeakInfected, int PeakStep и SimulationOutcome Outcome, где исходы — Running, Extinct, StepLimitReached. Параметры и — неотрицательные целые; произведение для новых заражений вычисляется в long. При постоянной численности на шаге вычислять
а затем одновременно обновлять , и . Симуляция прекращается при либо по MaxSteps. Проверить инвариант , неотрицательность всех групп и корректность первого шага, рассчитанного вручную. Для итогового исхода вывести длительность, пик заражённых и момент пика.
7. Погашение долга: Объявить LoanState с полями int Month, decimal Balance, decimal TotalInterest, decimal TotalPaid, LoanOutcome Outcome. Даны начальная сумма , месячная ставка и массив неотрицательных плановых платежей. В начале месяца начисляется , затем фактический платёж равен минимуму между доступным платежом и долгом после начисления. Промежуточные значения не округлять; отображение выполняется отдельно. Симуляция прекращается при нулевом долге либо после исчерпания массива, различая PaidOff и ScheduleEndedWithDebt. После каждого шага проверять
с точностью типа decimal. Для первых трёх месяцев провести ручной расчёт и объяснить, почему формат F2 не является округлением состояния.
8. Отказ и восстановление компонентов: Система состоит из компонентов и работает, пока исправны не менее . Состояние содержит номер шага, массив bool[] Working, накопленные числа отказов и восстановлений и исход Running, SystemFailed либо HorizonReached. На каждом шаге для каждого компонента делается ровно один вызов NextDouble: исправный компонент отказывает при , неисправный восстанавливается при . Все решения принимаются по снимку массива и записываются в новый массив. Random создаётся в Main с заданным seed и передаётся в Step. Сохранять в трассе использованное для каждого компонента, чтобы вручную пересчитать первые два шага по уже полученным значениям. Повторить прогон с тем же seed и посимвольно сравнить сформированные текстовые трассы.
9. Производственная линия из файла: Входной UTF-8-файл имеет формат
capacity=6
initialRaw=4
initialFinished=1
arrivals=3,0,8,1,2
orders=2,5,1,7,1
Сначала полностью прочитать и проверить файл: обязательные ключи встречаются ровно один раз, числа неотрицательны, массивы одинаковой длины. Состояние содержит запасы сырья и готовой продукции, накопленные поступления, произведённые, отгруженные и неудовлетворённые единицы. На шаге сырьё поступает, затем производится не больше capacity и доступного сырья, после чего из готового запаса выполняется заказ; дефицит учитывается, но не переносится. Проверять два баланса: сырья и готовой продукции. Трассу и итог сначала записать во временный файл; целевой файл заменить только после успешной симуляции. Отдельно проверить отсутствующий файл, неизвестный ключ, неверное число и неодинаковые длины массивов.
10. Аварийное энергоснабжение: Объявить структуры параметров, состояния и результата. Даны массивы спроса и возобновляемой генерации , ёмкость аккумулятора , пределы заряда и разряда, начальный заряд, запас топлива, удельный расход топлива и предел мощности генератора. На каждом шаге возобновляемая энергия сначала покрывает спрос; избыток заряжает аккумулятор и затем считается потерянным. Дефицит покрывается разрядом аккумулятора, затем генератором; остаток становится неудовлетворённым спросом. Все потоки вычисляются из снимка начальных запасов шага. Удельный расход fuelRate строго положителен, а мощность генератора дополнительно ограничивается доступным топливом:
Для шага проверять баланс , а состояния обновлять как и . Симуляция прекращается после сценария либо аварийно, когда неудовлетворённый спрос возникает два шага подряд. Исходы: CompletedWithoutDeficit, CompletedWithDeficit, EmergencyStopped. Проверять допустимые диапазоны заряда и топлива. Вручную рассчитать первые три шага, затем независимо восстановить суммарный спрос как сумму всех источников покрытия и неудовлетворённой энергии.
Уровень II. Продвинутый
Заданы поведение системы, ограничения и исследуемый вопрос, но не структура состояния, временные данные, состав методов, правило хранения истории и экспериментальный протокол. Требуется самостоятельно формализовать один шаг, выбрать представление и исходы, доказать инварианты, построить ручной контрольный пример и организовать сопоставимые прогоны. В отличие от Уровня I ученик проектирует саму модель и исследование, но ещё работает в пределах одной предметной системы с заранее сформулированной целью.
1. Адаптивный светофор: На перекрёстке существуют два взаимно исключающих направления NorthSouth и EastWest. Для каждого шага заданы поступления автомобилей; зелёное направление выпускает не больше машин. Свет обязан сохранять направление не меньше MinGreen шагов, переключаться не позже MaxGreen и после минимального интервала может переключиться раньше, если противоположная очередь превосходит текущую не менее чем на SwitchThreshold. Требуется самостоятельно выбрать enum, структуру состояния, порядок «поступление — решение о фазе — обслуживание», способ учёта времени ожидания и методы симуляции. Проверить инвариант потока автомобилей и безопасность: за один шаг обслуживается не более одного направления. Сравнить адаптивную политику с фиксированным переключением каждые FixedGreen шагов на одном сценарии и объяснить различие средней и максимальной очереди.
2. Шаттл в линейном здании: Здание имеет этажи . Каждый пассажир задаётся временем появления, этажом отправления и этажом назначения. Шаттл вместимости за шаг либо стоит, либо перемещается на один этаж. Политика: продолжать текущее направление, пока впереди есть пассажир в салоне или ожидающий вызов; при отсутствии такой работы изменить направление; высадка выполняется до посадки. Требуется выбрать структуру пассажира, кодировать четыре взаимоисключающих состояния пассажира, представить салон и ожидающих без коллекций и построить завершение «все пассажиры доставлены». Инвариант: каждый появившийся пассажир находится ровно в одном из состояний Waiting, OnBoard, Completed. Рассчитать вручную малый сценарий, вывести путь шаттла, время ожидания и поездки каждого пассажира и доказать верхнюю оценку числа шагов для заданного конечного набора заявок.
3. Запас с ограниченным сроком годности: Товар хранится не более суток. Для каждого дня заданы поставка и спрос; выдача выполняется по правилу FEFO — сначала расходуются самые старые единицы. В начале суток просроченная партия списывается, возраст оставшегося запаса увеличивается, затем принимается поставка и удовлетворяется спрос. Требуется самостоятельно выбрать направление индексов возрастного массива, определить необходимость временного буфера, состав состояния и методы одного дня. Проверить баланс
и отсутствие товара старше . Исследовать на одном сценарии, как перестановка этапов «списание / старение / поставка / продажа» изменяет смысл модели, и обосновать выбранный порядок до реализации.
4. Планировщик процессора: Набор процессов задаётся уникальным идентификатором, неотрицательным временем появления, неотрицательным требуемым числом тактов и приоритетом. Процесс с нулевой работой считается завершённым в момент появления и не выбирается процессором. За один шаг процессор выполняет один такт одного доступного процесса. Политика — выбирать процесс с минимальным оставшимся временем; при равенстве использовать более высокий приоритет, затем более раннее появление и меньший идентификатор. Требуется самостоятельно представить процессы и состояние планировщика, отделить неизменяемые входные характеристики от изменяемого остатка, сформировать историю выбранных процессов и вычислить время ожидания, завершения и оборота. Проверить инвариант «выполненные такты + суммарный остаток = суммарная работа появившихся процессов» и граничные случаи простоя, одновременного появления и нулевого числа процессов. Сравнить итог с FCFS на том же наборе без изменения входных данных.
5. Распространение пожара по местности: Прямоугольная карта содержит пустую клетку, дерево, горящее дерево, выгоревшую клетку и непроходимую преграду. За шаг горящее дерево выгорает, а дерево загорается, если в снимке предыдущего состояния хотя бы один ортогональный сосед горел. Требуется выбрать представление состояния клетки и карты, реализовать синхронный переход, остановку при отсутствии горящих клеток и карту времени первого возгорания. Проверить, что преграда никогда не меняется, выгоревшая клетка не загорается повторно, а число деревьев, горящих и выгоревших клеток не превосходит начального числа деревьев. Для малой карты вручную построить три состояния и сопоставить время возгорания с длиной кратчайшего допустимого пути от источника.
6. Стохастическая эпидемия на сетке: Каждая клетка содержит состояние Susceptible, Infected, Recovered и, при заражении, число уже пройденных шагов болезни. Восприимчивая клетка с заражёнными ортогональными соседями заражается с вероятностью
а заражённая выздоравливает после ровно шагов. Требуется самостоятельно выбрать между параллельными массивами и массивом структур, обеспечить один снимок на шаг, передать единый Random и определить статистику прогона: длительность, пик и итоговое число переболевших. Порядок случайных обращений фиксируется: клетки просматриваются построчно, и ровно один NextDouble выполняется для каждой восприимчивой клетки, имеющей хотя бы одного заражённого соседа; при вызов не совершается. Провести серию по фиксированному набору seed, повторить один прогон дословно и сохранить агрегаты в CSV. Ручная проверка выполняется по записанным случайным значениям на карте .
7. Сравнение дисциплин обслуживания: Для каждого seed заранее генерируется неизменяемый сценарий заявок: время появления и длительность обслуживания. Один сервер работает без вытеснения по двум политикам: FCFS и выбор кратчайшей доступной работы. Требуется спроектировать генерацию сценария отдельно от симуляторов, чтобы обе политики получали идентичные заявки и не обращались к Random. Для каждой политики вычислить среднее ожидание, максимум ожидания, долю простоя и время завершения всех заявок; для серии seed сохранить парные разности. Объяснить, почему последовательный запуск двух политик на одном общем генераторе без предварительной фиксации сценария не является честным сравнением.
8. Надёжность системы с резервированием: Система из независимых компонентов работоспособна, пока живы не менее . Каждый живой компонент на каждом шаге отказывает с вероятностью и не восстанавливается. Требуется самостоятельно спроектировать состояние одного прогона, остановку, серию и результат «система пережила горизонт ». Оценить вероятность выживания методом Монте-Карло и независимо вычислить её: вероятность выживания одного компонента равна , а число выживших имеет биномиальное распределение. Сумму биномиальных вероятностей вычислить устойчивой рекуррентной формой без факториалов. Сравнить оценку и расчёт, указать стандартную ошибку доли и проверить, уменьшается ли расхождение при росте числа прогонов.
9. Исследование политики пополнения запаса: Ежедневный спрос генерируется заранее для каждого seed как целое из заданного диапазона. Склад использует политику : если после удовлетворения спроса запас и уже заказанный объём вместе не превосходят , размещается заказ , поступающий через дней. Учитываются дефицит, средний запас, число заказов, стоимость хранения, заказа и дефицита. Требуется самостоятельно представить конвейер ожидаемых поставок без коллекций, спроектировать инвариант материального баланса и сравнить несколько значений при фиксированном , затем несколько при выбранном . Все варианты получают одинаковые сценарии спроса. Итоги по каждому набору параметров и seed сохраняются в CSV; вывод обязан отделять среднюю стоимость от разброса.
10. Управление паводковым резервуаром: Конфигурационный файл задаёт ёмкость, начальный объём, безопасный диапазон, предельный выпуск и одинаковые по длине временные ряды притока и обязательного нижнего выпуска. Требуется самостоятельно спроектировать две политики дополнительного выпуска: удержание около целевого объёма и предупредительный выпуск при превышении порога. На каждом шаге сначала учитывается приток, затем обязательный и дополнительный выпуск в пределах доступной воды и технического предела. Для каждой политики фиксировать перелив, неудовлетворённый обязательный выпуск, число выходов из безопасного диапазона и итоговый объём. Вход полностью проверяется до запуска; частичный отчёт не заменяет прежний корректный файл. Для одной политики вручную рассчитать малый сценарий, для обеих проверить водный баланс и сопоставить результаты. Работа сдаётся с техническим отчётом: спецификация, состояние, переход, инварианты, методика сравнения, результаты, подтверждённые выводы и ограничения выбранных политик.
Уровень III. Экспертный
Исследуется уже не прикладная система, а достоверность самой симуляционной модели и вывода по ней. Требуется сравнить альтернативные семантики шага или протоколы, предсказать механизм расхождения, провести контролируемый эксперимент и независимо подтвердить результат. В отличие от Уровня II ученик обязан выявлять смещение, цензурирование, чувствительность к дискретизации, числовой модели и случайному слою и формулировать только те выводы, которые следуют из зафиксированных данных.
1. Синхронный шаг против изменения на месте: На кольце из ячеек каждая ячейка передаёт вправо половину своего запаса с целочисленным делением. Математический шаг определён одновременно:
Реализовать три варианта:
- корректный переход через снимок;
- изменение одного массива слева направо;
- изменение того же массива справа налево.
До запуска вручную предсказать все три результата для [8,0,0,0] после одного и двух шагов. Затем проверить сохранение суммы, зависимость от направления обхода и максимальное расстояние переноса массы за один логический шаг. Объяснить, почему варианты на месте могут сохранять баланс и всё равно реализовывать другую модель: обновлённое значение получает возможность повторно участвовать в том же шаге.
2. Остановка, транзиент и цикл: Рассмотреть роторный обход ориентированного графа при . У каждого узла заданы допустимые выходы zeroNext[i] и oneNext[i] и бит ротора. Токен в узле выбирает выход по текущему биту, переключает этот бит и переходит в выбранный узел. Полное состояние состоит из позиции токена и битовой маски роторов.
До запуска доказать верхнюю границу числа состояний:
Закодировать состояние индексом:
position * (1 << m) + mask
и хранить номер первого посещения в массиве, заранее заполненном -1. Определить длину транзиента и цикла, отдельно учитывать MaxSteps. Независимо подтвердить цикл повторным выполнением ровно его длины из первого циклического состояния. Объяснить, почему отсутствие неподвижного состояния не означает бесконечного появления новых состояний.
3. Дисциплина случайного слоя при сравнении политик: Для модели очереди сравнить две политики обслуживания тремя протоколами:
- обе политики последовательно используют один общий
Random; - каждая создаёт свой
Randomс одинаковымseed, но совершает различное число вызовов; - неизменяемый сценарий поступлений и длительностей генерируется заранее и передаётся обеим политикам.
До запуска предсказать, какие протоколы обеспечивают одинаковые внешние воздействия и где изменение внутренней ветви сдвигает дальнейшую псевдослучайную последовательность. На серии seed вычислить среднее и стандартное отклонение парной разности времени ожидания. Показать конкретный seed, для которого один дополнительный вызов NextDouble меняет последующие входные события. Одинаковое зерно без одинаковой трассы вызовов не объявляется достаточным условием честного сравнения.
4. Цензурирование пределом шагов: Симметричное случайное блуждание начинается в позиции 0. На каждом шаге выполняется переход -1 или +1 с вероятностью 1/2. Позиции -B и B поглощающие; прогон завершается при достижении границы либо с исходом StepLimitReached после MaxSteps.
Провести серию и отдельно сохранить:
- число поглощённых и цензурированных прогонов;
- распределение времени поглощения среди завершившихся;
- долю поглощения к горизонту;
- среднее время только среди завершившихся.
Затем независимо вычислить точное распределение вероятностной массы до горизонта динамическим программированием через два массива длины 2B + 1. Сравнить вероятность поглощения и распределение времени. Объяснить, почему среднее только по завершившимся траекториям систематически исключает долгие прогоны и не является средним временем остановки исходного неограниченного процесса.
5. Критический порог ветвящегося процесса: Процесс начинается с одной особи. Каждая особь следующего поколения независимо порождает двух потенциальных потомков, каждый из которых существует с вероятностью ; математическое ожидание числа потомков одной особи равно . Симуляция прекращается при вымирании, достижении MaxGenerations либо превышении PopulationLimit.
До запуска предсказать качественное различие режимов:
Для каждого провести серию по одному набору seed, получить вероятность вымирания к горизонту, распределение длительности и долю ограниченных по размеру прогонов. Независимо подтвердить среднюю численность поколения:
на горизонтах, где ограничение редко срабатывает. Достижение предела размера и горизонта не объединяется с выживанием бесконечного процесса.
6. Размер дискретного шага как часть модели: Один резервуар имеет ёмкость и начальный объём . Для каждого крупного интервала известны суммарные приток и спрос. Сравнить две дискретные спецификации:
- один крупный шаг: весь приток поступает до всего спроса;
- два последовательных подшага, для которых те же суммарные приток и спрос разделены между первой и второй половинами.
На каждом подшаге применяется одно и то же правило ограничения ёмкости, перелива и выпуска. Построить пары сценариев с одинаковыми суммарными воздействиями, но разным внутрипериодным порядком. Сравнить конечный объём, перелив и неудовлетворённый спрос. Вывести условия, при которых укрупнение шага сохраняет результат, и контрпример, где нелинейные ограничения min и max делают модели неэквивалентными. Не интерпретировать подшаги как численное решение непрерывного уравнения: исследуются две разные дискретные спецификации.
7. Числовой дрейф в сохраняющей системе: В системе из резервуаров на каждом шаге заранее выбранные разные донор и получатель выполняют передачу доли текущего запаса донора. Математически общая масса сохраняется. Реализовать три представления:
double;decimal;- целые микроединицы
longс заранее установленным правилом округления передачи.
Одинаковая последовательность пар генерируется один раз и передаётся всем версиям. До запуска определить, можно ли предсказать знак ошибки баланса и почему одинаковая формула не гарантирует одинаковую траекторию после округления. На возрастающих числах шагов измерить абсолютный и относительный дрейф, минимальный запас и расхождение состояний. Точный баланс целочисленной версии не объявляется доказательством физической истинности её траектории: отдельно оценивается ошибка квантования.
8. Однофакторная чувствительность и взаимодействие параметров: Для политики паводкового резервуара выбрать два параметра:
- порог предупредительного выпуска
threshold; - максимальный дополнительный выпуск
extraLimit.
Использовать фиксированный набор входных сценариев и сравнить:
- изменение каждого параметра отдельно относительно базовой точки;
- полную прямоугольную сетку значений двух параметров.
Для каждой пары вычислить среднее и разброс перелива, неудовлетворённого обязательного выпуска и числа выходов из безопасного диапазона. Для двух выбранных уровней каждого параметра вычислить показатель взаимодействия:
Показать случай, когда однофакторные выводы не предсказывают совместное изменение. Итоговый отчёт обязан различать локальную чувствительность около базовой точки, наблюдение на исследованной сетке и утверждения, которые нельзя переносить за её пределы.
Обязательные контрольные наборы
| Задача | Исходные данные |
|---|---|
| I.1 | , , inflow = [8,12,0,4], demand = [3,10,9,2] |
| I.2 | , нагреватель выключен, , , , , , outside = [10,10,18,25,25] |
| I.3 | , , arrivals = [3,9,0,6,1] |
| I.4 | amounts = [10,0,0], строки запросов [6,0,0], [6,2,0], [0,5,1] |
| I.5 | таблица с 40 в центре и нулями в остальных клетках; 4 шага |
| I.6 | , , , , , MaxSteps = 20 |
| I.7 | , , десять платежей по 120m |
| I.8 | , , , , MaxSteps = 10, seed = 20260711 |
| I.9 | корректный файл из условия; отсутствие файла; capacity=x; неизвестный ключ; массивы разной длины |
| I.10 | demand = [4,9,8,12,3], renewable = [6,2,4,1,10], , начальный заряд , пределы заряда и разряда , топливо , расход , мощность генератора |
| II.1 | NS = [4,8,1,0,7,5,2,9], EW = [3,1,9,6,0,4,8,2], , MinGreen = 2, MaxGreen = 4, SwitchThreshold = 3 |
| II.2 | , ; пассажиры (0,0,4), (1,3,0), (2,1,4), (4,4,2) |
| II.3 | , начальные возрастные партии [2,3,1], поставки [4,0,5,1,0], спрос [3,4,2,6,1] |
| II.4 | процессы (id,arrival,work,priority): (1,0,5,2), (2,1,2,1), (3,1,4,3), (4,6,1,1), (5,3,0,5) |
| II.5 | карта 7 × 9 с двумя источниками огня и стеной, разделяющей карту одним проходом |
| II.6 | карта 15 × 15, один заражённый в центре, , , MaxSteps = 100, seeds 1001–1100 |
| II.7 | 50 заявок, появление Next(0,100), длительность Next(1,11), seeds 1–200 |
| II.8 | , , , , число прогонов , , |
| II.9 | спрос Next(0,11), , горизонт 365, , , seeds 1–100 |
| II.10 | ёмкость , начальный объём , безопасный диапазон [30,80], предел выпуска , приток [5,8,30,40,10,2,0,25], обязательный выпуск [8,8,8,8,8,8,8,8] |
| III.1 | [8,0,0,0]; затем [5,1,0,2]; один и два шага, оба направления обхода |
| III.2 | , zeroNext = [1,2,3,0], oneNext = [2,3,0,1], начальная позиция 0, маска 0000, MaxSteps = 1000 |
| III.3 | 100 заявок на сценарий, seeds 1–1000; дополнительный вызов генератора после десятой заявки |
| III.4 | , MaxSteps ∈ {50,200,1000}, не менее 100_000 прогонов на горизонт |
| III.5 | , MaxGenerations = 30, PopulationLimit = 1_000_000, 10_000 прогонов |
| III.6 | , ; крупные воздействия (inflow,demand)=(8,8); подшаги [8,0]/[0,8], [0,8]/[8,0] и [4,4]/[4,4] |
| III.7 | начальные запасы [0.1,0.2,0.3,0.4], , заранее сохранённые последовательности из , и пар; масштаб целой модели микроединиц на единицу |
| III.8 | threshold ∈ {60,70,80}, extraLimit ∈ {5,10,20}, одна базовая точка и не менее 50 заранее сохранённых сценариев притока |
Итог модуля
Ученик формализует динамическую систему как последовательность явных состояний и проверяемый переход current → next, отделяет один шаг от управляющего цикла и внешнего контура, использует снимок для одновременного обновления и доказывает балансы, допустимость состояний и достижимость остановки. Он различает естественное завершение, аварийный исход, предел горизонта и цензурированную траекторию, воспроизводит случайные воздействия, проводит сопоставимые серии, исследует чувствительность к параметрам, размеру шага и числовому представлению и подтверждает вывод аналитическим расчётом, точной динамикой вероятностей или второй реализацией. Результат оформляется как согласованная система «спецификация → модель состояния → реализация шага → ручная трассировка → эксперимент → подтверждённый вывод → ограничения».
Покрытие опоры и границы
- Состояние, начальные условия, дискретный шаг, порядок событий, остановка и исходы: I.1–I.10; самостоятельно проектируются в II.1–II.10; исследуются как объект модели в III.1–III.8.
- Снимок
current, отдельное состояниеnextи одновременность обновления: I.2, I.4–I.6, I.8, I.10; II.3, II.5–II.6; III.1 и III.6. - Методы, управляющий цикл, массивы, структуры, временные буферы и история: все задачи; особенно I.4–I.6, II.2–II.6 и III.1–III.4.
- Инварианты баланса, сохранения, диапазона и взаимоисключительности состояний: I.1–I.10, II.1–II.5, II.9–II.10, III.1–III.2, III.6–III.7.
- Условие остановки,
MaxSteps, циклы и цензурированные прогоны: I.6, I.8, I.10; II.2, II.5–II.10; III.2, III.4–III.5. - Псевдослучайность, фиксированный
seedи одинаковые внешние сценарии: I.8, II.6–II.9, III.3–III.5, III.7–III.8. - Файлы, проверка конфигурации, сохранение трасс и политика отказа: I.9, II.6, II.9–II.10.
- Ручной расчёт малого примера и программная трассировка: I.1–I.10, II.1–II.6, III.1–III.2 и III.6.
- Серии прогонов, изменение одного фактора и фиксация разброса: II.6–II.10, III.3–III.5 и III.8.
- Независимое подтверждение аналитикой, точным распределением или второй моделью: I.1–I.10, II.5, II.8, III.2, III.4–III.7.
- Смещение протокола, случайного слоя и отбора завершившихся траекторий: III.3–III.5.
- Чувствительность к размеру дискретного шага, числовой модели и взаимодействию параметров: III.6–III.8.
- Технический отчёт со спецификацией, методикой, результатами, выводами и ограничениями: II.7–II.10 и все задачи Уровня III.
За границей: непрерывное время и численное интегрирование дифференциальных уравнений, событийные очереди на обобщённых коллекциях, объектная архитектура симуляторов, параллельные и распределённые прогоны, специализированные статистические библиотеки, формальная калибровка по реальным данным и профессиональные среды моделирования относятся к последующим курсам. Результат конечной серии не доказывает поведение бесконечного процесса, а изменение размера шага, случайного протокола или числового представления может означать переход к другой модели, а не только изменение точности реализации.

