AMPL IDE - 使用数据文件进行简单的线性优化

时间:2015-02-26 11:49:21

标签: ampl

我首先看一下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 ---

但是现在模型应该怎么样?

1 个答案:

答案 0 :(得分:0)

在模型部分中,您还必须使用集合和参数。

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];

同样适用于您的目标。但由于你只有一个目标,所以可能不需要专用的套装。也可以在数据带中定义设置内容,只需在Modelpart中写set COMPONENTS;