主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

将优化模型与数据分离

为了获得可扩展、可重复使用的优化问题,请以将问题数据与模型结构分离的方式创建问题。

假设您有一个涉及多种产品的多周期调度问题。时间段位于向量 periods 中,而产品位于字符串向量 products 中。

periods = 1:10;
products = ["strawberry","cherry","red grape",...
    "green grape","nectarine","apricot"];

要创建表示每个时期使用的产品数量的变量,请使用从数据中获取大小的语句。例如:

usage = optimvar('usage',length(periods),products,...
    'Type','integer','LowerBound',0);

稍后如果要更改时间段或产品,只需更改 periodsproducts 中的数据。然后您可以运行相同的代码来创建 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);

这样,如果您更改数据大小,创建 costPerYeartotalCost 的语句不会改变。换句话说,为了保持灵活性并允许重用,请不要使用具有硬编码数据大小的语句。例如:

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

另请参阅

主题