Чтобы оптимизировать модели в рабочих процессах, которые включают выполнение нескольких симуляций, можно создать тесты симуляции с помощью объекта Simulink.SimulationInput
.
Пример продуктового магазина использует несколько подходов симуляций, чтобы оптимизировать количество магазинных тележек, требуемых предотвратить длинные потребительские строки ожидания.
В этом примере блок Entity Generator представляет потребительскую запись в хранилище. Клиенты ждут своей очереди при необходимости и получают магазинную тележку через блок Resource Acquirer. Блок Resource Pool представляет доступные магазинные тележки в хранилище. Блок Entity Server представляет время, которое каждый клиент проводит в хранилище. Клиенты возвращают магазинные тележки через блок Resource Releaser, в то время как блок Entity Terminator представляет потребительское отклонение от хранилища. Среднее ожидание, w статистическая величина от блока Resource Acquirer сохранено в рабочую область блоком To Workspace от библиотеки Simulink®.
Клиенты продуктового магазина ждут своей очереди, если существует недостаточно магазинных тележек. Однако наличие слишком многих неиспользованных магазинных тележек рассматривается отходами. Цель примера состоит в том, чтобы исследовать время ожидания среднестатистического клиента для переменного количества доступных магазинных тележек в хранилище. Чтобы вычислить время ожидания среднестатистического клиента, несколько симуляций запущены при помощи команды sim
. Для каждой симуляции используется одно доступное значение магазинной тележки. Для получения дополнительной информации о команде sim
смотрите Выполнение Несколько Симуляций (Simulink) и Идите параллельно Симуляции (Simulink).
В симуляциях доступных диапазонах значений магазинной тележки от 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
- мелкое потребительское время ожидания.
Генератор сущности | Очередь сущности | Сервер сущности | Терминатор сущности | Получатель ресурса | Пул ресурсов | Ресурс Releaser