Чтобы оптимизировать модели в рабочих процессах, которые включают выполнение нескольких симуляций, можно создать тесты симуляции с помощью Simulink.SimulationInput
объект.
Пример продуктового магазина использует несколько подходов симуляций, чтобы оптимизировать количество магазинных тележек, требуемых предотвратить длинные потребительские линии ожидания.
В этом примере блок Entity Generator представляет потребительскую запись в хранилище. Клиенты ждут своей очереди при необходимости и получают магазинную тележку через блок Resource Acquirer. Блок Resource Pool представляет доступные магазинные тележки в хранилище. Блок Entity Server представляет время, которое каждый клиент проводит в хранилище. Клиенты возвращают магазинные тележки через блок Resource Releaser, в то время как блок Entity Terminator представляет потребительское отклонение от хранилища. Среднее ожидание, w статистическая величина от блока Resource Acquirer сохранено в рабочую область блоком To Workspace из библиотеки Simulink®.
Клиенты продуктового магазина ждут своей очереди, если существует недостаточно магазинных тележек. Однако наличие слишком многих неиспользованных магазинных тележек рассматривается отходами. Цель примера состоит в том, чтобы исследовать время ожидания среднестатистического клиента для различного количества доступных магазинных тележек в хранилище. Чтобы вычислить время ожидания среднестатистического клиента, несколько симуляций запущены при помощи sim
команда. Для каждой симуляции используется одно доступное значение магазинной тележки. Для получения дополнительной информации о sim
команда, смотрите Запуск Несколько Симуляций и Идите параллельно Симуляции.
В симуляциях, доступных диапазонах значений магазинной тележки от 20
к 50
и в каждой симуляции это увеличивается 1
. Это принято, что в течение операционных часов, клиенты прибывают в хранилище со случайным уровнем, чертившим от экспоненциального распределения, и их делающая покупки длительность получена из равномерного распределения.
В блоке Entity Generator, набор Entity type name к Customers
и Time source к MATLAB action
. Затем введите этот код.
persistent rngInit; if isempty(rngInit) seed = 12345; rng(seed); rngInit = true; end % Pattern: Exponential distribution mu = 1; dt = -mu*log(1-rand());
Время между потребительским прибытием чертится от экспоненциального распределения со средним 1
минута.
В блоке Resource Pool задайте Resource name как ShoppingCart
. Установите Resource amount на 20
.
Начальным значением доступных магазинных тележек является 20
.
В блоке Resource Acquirer, набор ShoppingCart
как Selected Resources и набор Maximum number of waiting entities к Inf
.
Пример принимает безграничное количество клиентов, которые могут ожидать магазинной тележки.
В блоке Entity Server, набор Capacity к Inf
.
Пример принимает безграничное количество клиентов, которые могут делать покупки в хранилище.
В блоке Entity Server, набор Service time source к MATLAB action
и введите код ниже.
persistent rngInit; if isempty(rngInit) seed = 123456; rng(seed); rngInit = true; end % Pattern: Uniform distribution % m: Minimum, M: Maximum m = 20; M = 40; dt = m+(M-m)*rand;
Время, которое клиент проводит в хранилище, получено из равномерного распределения на интервале между 20
минуты и 40
минуты.
Соедините статистическую величину Average wait, w от блока Resource Acquirer до блока To Workspace и установите его Variable name на AverageCustomerWait
.
Установите время симуляции на 600
.
Длительностью одной симуляции является 10
часы работы, который является 600
минуты.
Сохраните модель.
В данном примере модель сохранена с именем GroceryStore_ShoppingCartExample
.
Откройте новый скрипт MATLAB® и запустите этот код MATLAB для нескольких симуляций.
Инициализируйте модель и доступное количество магазинных тележек для каждой симуляции, которая определяет количество симуляций.
% Initialize the Grocery Store model with % random intergeneration time and service time value mdl = 'GroceryStore_ShoppingCartExample'; isModelOpen = bdIsLoaded(mdl); open_system(mdl); % Range of number of shopping carts that is % used in each simulation ShoppingCartNumber_Sweep = (20:1:50); NumSims = length(ShoppingCartNumber_Sweep);
В каждой симуляции число доступных магазинных тележек увеличено 1
.
Запустите каждую симуляцию с соответствующим доступным значением магазинной тележки и выведите результаты.
% Run NumSims number of simulations NumCustomer = zeros(1,NumSims); for i = 1:1:NumSims in(i) = Simulink.SimulationInput(mdl); % Use one ShoppingCartNumber_sweep value for each iteration in(i) = setBlockParameter(in(i), [mdl '/Resource Pool'], ... 'ResourceAmount', num2str(ShoppingCartNumber_Sweep(i))); end % Output the results for each simulation out = sim(in);
Соберите и визуализируйте результаты.
% Compute maximum average wait time for the % customers for each simulation MaximumWait = zeros(1,NumSims); for i=1:NumSims MaximumWait(i) = max(out(1, i).AverageCustomerWait.Data); end % Visualize the plot plot(ShoppingCartNumber_Sweep, MaximumWait,'bo'); grid on xlabel('Number of Available Shopping Carts') ylabel('Maximum Wait Time')
Наблюдайте график, который отображает максимальное среднее время ожидания для клиентов как функция доступных магазинных тележек.
График отображает компромисс между наличием 46
магазинные тележки, доступные в течение нулевого времени ожидания по сравнению с 33
магазинные тележки для 2
- мелкое потребительское время ожидания.
Entity Generator | Entity Queue | Entity Server | Entity Terminator | Resource Acquirer | Resource Pool | Resource Releaser