Чтобы получить масштабируемую, допускающую повторное использование задачу оптимизации, создайте проблему способом, которая разделяет проблемные данные из структуры модели.
Предположим, что у вас есть проблема планирования мультипериода с несколькими продуктами. Периоды времени находятся в векторе, periods
, и продукты находятся в векторе строки, products
.
periods = 1:10; products = ["strawberry","cherry","red grape",... "green grape","nectarine","apricot"];
Чтобы создать переменные, которые представляют количество продуктов, используемых в каждый период, используйте операторы, которые берут размеры из данных. Например:
usage = optimvar('usage',length(periods),products,... 'Type','integer','LowerBound',0);
Чтобы позже изменить периоды времени или продукты, необходимо изменить данные только в periods
и products
. Можно затем запустить тот же код, чтобы создать usage
.
Другими словами, чтобы обеспечить гибкость и допускать повторное использование, не используйте оператор, который трудно закодировал размеры данных. Например:
usage = optimvar('usage',10,6,... % DO NOT DO THIS 'Type','Integer','LowerBound',0);
Тот же фактор содержит для выражений, а также переменных. Предположим, что затраты для продуктов находятся в матрице данных, costs
, из размера length(periods)
- length(products)
. Чтобы симулировать допустимые данные, создайте случайную целочисленную матрицу соответствующего размера.
rng default % For reproducibility costs = randi(8,length(periods),length(products));
Лучшая практика должна создать выражения стоимости, которые берут размеры из данных.
costPerYear = sum(costs.*usage,2); totalCost = sum(costPerYear);
Таким образом, если вы когда-нибудь изменяете размеры данных, операторы, которые создают costPerYear
и totalCost
не изменяться. Другими словами, чтобы обеспечить гибкость и допускать повторное использование, не используйте оператор, который трудно закодировал размеры данных. Например:
costPerYear = optimexpr(10,1); % DO NOT DO THIS totalcost = 0; for yr = 1:10 % DO NOT DO THIS costPerYear(i) = sum(costs(i,:).*usage(i,:)); totalcost = totalcost + costPerYear(i); end