Отдельная модель оптимизации от данных

Чтобы получить масштабируемую, допускающую повторное использование задачу оптимизации, создайте проблему способом, которая разделяет проблемные данные из образцовой структуры.

Предположим, что у вас есть проблема планирования мультипериода с несколькими продуктами. Периоды времени находятся в векторе, 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)-by-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

Похожие темы