Чтобы оптимизировать модели в рабочих процессах, которые включают выполнение нескольких симуляций, можно создать симуляционные тесты с помощью Simulink.SimulationInput
объект.
Пример продуктового магазина использует несколько симуляций для оптимизации количества тележек покупок, необходимых для предотвращения длительных линий ожидания клиентов.
В этом примере блок Entity Generator представляет запись клиента в хранилище. Клиенты ждут линии при необходимости и получают тележку покупок через блок Resource Acquirer. Блок Пул ресурсов представляет доступные тележки покупок в магазине. Блок Entity Server представляет время, которое каждый клиент проводит в хранилище. Покупатели возвращают тележки покупок через блок Resource Releaser, в то время как блок Entity Terminator представляет собой выход клиента из магазина. Статистическая величина Average wait, 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