Реализация имитационной модели
Если другой компьютер мог бы заразиться от первого раньше, то его время заражения меняется на время заражения извне ЕСЛИ is_infected == 1. В основной функции main присутствует только цикл по времени с вызовом функции выбора компьютера и вывод итогового дохода. Из-за большого объёма, код функций не будет приведён, вместо этого будет показана их структура на алгоритмическом языке. Компьютер… Читать ещё >
Реализация имитационной модели (реферат, курсовая, диплом, контрольная)
Ниже будет приведено описание реализации модели, включая архитектуру класса и используемые функции. Код программы приведён в приложении 1.1.
Программа содержит один класс — Computer, служащий для описания компьютеров в системе. Он содержит следующие поля:
- · ID — идентификатор компьютера, тип int
- · inf_time — время до заражения, тип double
- · cure_start — время до начала решения, тип double
- · cure_end — время до окончания решения, тип double
- · sec_inf_time — время до заражения извне, тип double. Используется в случае, если компьютер заразится от другого компьютера раньше, чем извне. В этом случае время заражения извне сохраняется в это поле
- · is_infected — заражён компьютер или нет, тип bool
- · is_on_cure — находится компьютер на лечении или нет, тип bool
Класс содержит один метод printcomp, который выводит информацию о компьютере.
Из-за большого объёма, код функций не будет приведён, вместо этого будет показана их структура на алгоритмическом языке.
Алгоритм работы основан на нахождении следующего в очереди события и соответственное изменение параметров. Сначала выбирается компьютер, с которым произойдёт следующее событие. Этим занимается функция choose_comp. Ей на вход подаются два объекта класса компьютер, возвращаемого значения функция не имеет.
Choose_comp:
ЕСЛИ inf_time < cure_start.
ЕСЛИ inf_time < cure_end.
min = inf_time.
ИНАЧЕ min =cure_end.
ИНАЧЕ ЕСЛИ cure_start.
min = cure_start.
ИНАЧЕ min = cure_end.
Данный алгоритм повторяется для двух компьютеров, после чего переменные min1 и min2 сравниваются, и выбирается соответствующий компьютер. Далее, если оставшееся время до переустановки меньше, чем найденный минимум, то начинается переустановка. Иначе вызывается функция следующего события, аргументом которой является компьютер соответствующий происходящему событию.
При начале переустановки вызывается функция pereustanovka. У неё ни нет входных значений, ни выходных.
pereustanovka:
time += T0 + T // шаг времени.
profit += (profit1+profit2)*T0 // profit1 и profit2 — доход в единицу времени.
newcomputer1.
newcomputer2 // обновление параметров для компьютеров.
T0 = constT0 // оставшееся время до переустановки = интервалу переустановки При наступлении следующего события, вызывается функция new_state, которая его обрабатывает. Ей на вход подаётся объект класса Computer, выбранный в функции choose_comp. Выхода у функции нет.
new_state:
// создаём объект класса Computer, который является вторым компьютером.
Computer secondcomp.
Choose state // в зависимости от события работают разные части функции.
INFECTION:
time+=inf_time.
profit=(profit1+profit2)*inf_time.
// вспомогательная функция, которая уменьшает все временные показатели на inf_time, моделируя то, что прошло inf_time времени.
change_time (inf_time, comp1, comp2).
inf_time = 0 // произошло заражение, поэтому все временные показатели, связан;
sec_inf_time = 0 // ные с ним, зануляются.
is_infected = 1 // компьютер теперь заражён.
// генерируется время передачи вируса другому компьютеру.
new_inf_time =.
//новое время сравнивается со старым временем заражения.
ЕСЛИ secondcomp. inf_time >newtime.
secondcomp_sec_inf_time = secondcomp. inf_time.
secondcomp.inf_time =new_inf_time.
START OF CURE:
time += cure_start.
profit += (profit1+profit2)*cure_start.
change_time (cure_start, comp1, comp2).
cure_start = 0.
is_on_cure =1.
inf_time = 0.
sec_inf_time = 0.
cure_end = // генерируется время выхода с лечения.
// Если другой компьютер мог бы заразиться от первого раньше, то его время заражения меняется на время заражения извне ЕСЛИ is_infected == 1.
ЕСЛИ secondcomp. sec_inf_time ≠ 0.
secondcomp.inf_time = secondcomp. sec_inf_time.
secondcomp.sec_inf_time = 0.
END OF CURE:
time += cure_end.
profit += (profit1+profit2)*cure_end.
change_time (cure_end, comp1, comp2).
cure_end=0.
is_on_cure=0.
cure_start =.
//Если компьютер был заражён, то при выходе с лечения компьютер с вероятностью излечивается, а с вероятностью — нет.
ЕСЛИ is_infected == 1.
P0 = rand/randMax.
// Вылечивается ЕСЛИ P0 <= P.
is_infected =0.
inf_time =.
// Так же этот компьютер может заразиться от другого, если тот заражён ЕСЛИ secondcomp. is_infected == 1.
newtime =.
ЕСЛИ newtime < inf_time.
sec_inf_time=inf_time.
inf_time = newtime.
//Компьютер не излечился, а следовательно может заразить другой компьютер, если тот здоров ИНАЧЕ ЕСЛИ secondcomp. is_infected == 0.
newtime =.
ЕСЛИ newtime < secondcomp. inf_time.
secondcomp.sec_inf_time = secondcomp. inf_time.
secondcomp.inf_time = newtime.
// Если компьютер был здоров до начала лечения ИНАЧЕ.
inf_time =.
ЕСЛИ secondcomp. is_infected == 1.
newtime =.
ЕСЛИ newtime < inf_time.
sec_inf_time=inf_time.
inf_time = newtime.
Приведём схему функции change_time. На вход подаются три параметра: время dtime, которое прошло с момент последнего события и два объекта класса Computer. Выходных параметров у функции нет.
Для каждого из двух компьютеров временные параметры изменяются на время, поданное в функцию:
ЕСЛИ comp. inf_time ≠ 0.
comp.inf_time -= dtime.
ЕСЛИ comp. cure_start ≠ 0.
comp.cure_start -= dtime.
ЕСЛИ comp. cure_end ≠ 0.
comp.cure_end ≠ 0.
T0 -= dtime.
Таким образом, были обработаны все возможные события. После выполнения этих функций система переходит в новое состояние, от которого эти функции вызываются опять.
В основной функции main присутствует только цикл по времени с вызовом функции выбора компьютера и вывод итогового дохода.
main:
ПОКА time < 200.
choose_comp (comp1,comp2).
print profit.