AMPL IDE - 使用数据文件的简单线性优化
AMPL IDE - simple linear optimization using a data file
我第一次看 AMPL IDE 并解决一个特定的线性优化问题:
--- Start of craft.mod ---
var x >= 0;
var y >= 0;
minimize cost: 4 * x + 5 * y;
subject to m1: 9 * x + 15 * y >= 174;
subject to m2 : 1 * x + 6 * y >= 28;
subject to m3 : 7 * x + 3 * y >= 40;
--- End of craft.mod ---
--- Start of craft.run ---
reset;
model 'craft.mod';
option solver gurobi;
solve;
display x, y, cost;
--- End of craft.run ---
模型和脚本结合在一起完成这项工作。在这个例子中有 2 个可购买的产品有 3 个不同的成分,问题是找到这两个产品的最佳组合,使每个成分的数量都足够。
但是我意识到,一旦我有了更多的产品和更多的组件,写出所有的约束条件将是荒谬的。因此,我正在尝试创建一个通用版本,它从一个单独的文件中获取数据,并且可以轻松扩展以使用(实际)所需的尽可能多的系数。
我从一个数据文件开始,按照我的想象,它应该看起来像这样:
--- Start of craft2.dat ---
param: PROD: cost :=
Z1 4
Z2 5;
param: COMP: val1 val2 req :=
A 9 15 174
B 1 6 28
C 7 3 40;
--- End of craft2.dat ---
但是模型现在应该是什么样子的?
在模型部分,您还必须处理集合和参数。
set COMPONENTS = {"A","B","C"};
param val1 {COMPONENTS };
param val2 {COMPONENTS };
param req {COMPONENTS };
然后将参数填充到您的数据部分,并且可以使用方程式中的集合作为索引。
subject to m {i in COMPONENTS}:
val1[i] * x + val2[i] * y >= req[i];
你的 objective 也是如此。但由于您只有一个 objective,因此可能不需要专门的设备。也可以在datapart中定义设定内容,在Modelpart中写set COMPONENTS;
即可。
我第一次看 AMPL IDE 并解决一个特定的线性优化问题:
--- Start of craft.mod ---
var x >= 0;
var y >= 0;
minimize cost: 4 * x + 5 * y;
subject to m1: 9 * x + 15 * y >= 174;
subject to m2 : 1 * x + 6 * y >= 28;
subject to m3 : 7 * x + 3 * y >= 40;
--- End of craft.mod ---
--- Start of craft.run ---
reset;
model 'craft.mod';
option solver gurobi;
solve;
display x, y, cost;
--- End of craft.run ---
模型和脚本结合在一起完成这项工作。在这个例子中有 2 个可购买的产品有 3 个不同的成分,问题是找到这两个产品的最佳组合,使每个成分的数量都足够。
但是我意识到,一旦我有了更多的产品和更多的组件,写出所有的约束条件将是荒谬的。因此,我正在尝试创建一个通用版本,它从一个单独的文件中获取数据,并且可以轻松扩展以使用(实际)所需的尽可能多的系数。
我从一个数据文件开始,按照我的想象,它应该看起来像这样:
--- Start of craft2.dat ---
param: PROD: cost :=
Z1 4
Z2 5;
param: COMP: val1 val2 req :=
A 9 15 174
B 1 6 28
C 7 3 40;
--- End of craft2.dat ---
但是模型现在应该是什么样子的?
在模型部分,您还必须处理集合和参数。
set COMPONENTS = {"A","B","C"};
param val1 {COMPONENTS };
param val2 {COMPONENTS };
param req {COMPONENTS };
然后将参数填充到您的数据部分,并且可以使用方程式中的集合作为索引。
subject to m {i in COMPONENTS}:
val1[i] * x + val2[i] * y >= req[i];
你的 objective 也是如此。但由于您只有一个 objective,因此可能不需要专门的设备。也可以在datapart中定义设定内容,在Modelpart中写set COMPONENTS;
即可。