将优化模型与数据分离
为了获得可扩展、可重复使用的优化问题,请以将问题数据与模型结构分离的方式创建问题。
假设您有一个涉及多种产品的多周期调度问题。时间段位于向量 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