exponenta event banner

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

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

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

Связанные темы