我的问题如下:我必须使用AMPL解决有关混合的线性编程问题。我可以通过创建一个包含模型和数据的文件来解决它,但是我应该做的是将一个更通用的模型与数据分开。 我的麻烦在于变量之间的限制 - 我不知道如何概括它们以及后来反映在数据中。 例如,我有以下限制:
subject to restriction1:
Xc2 + Xd2 <= Xa2 + Xb2;
subject to restriction2:
Xc3 + Xd3 >= 0.5*(Xa3 + Xb3);
其中Xc2,Xd2,Xa2等都是变量。 我找不到任何解释这个的教程。希望你能帮助我一点......
答案 0 :(得分:2)
您通常希望将模型,参数和命令分开,因为它们可以独立变化。这是一个例子:
将其放入模型文件 examp.mod
var x1 >= 0;
var x2 >= 0;
param c;
maximize z:
x1 + x2;
s.t.
constraint_1:
x1 + x2 <= c;
将参数的实际值放入单独的数据文件 examp.dat
data;
param c := 1;
将所有命令放入另一个文件 examp.run
#option solver "enter your solve name here and remove the #";
solve;
display x1, x2;
您可以从命令行运行此命令,具体如下(取决于您的操作系统和设置)
ampl examp.mod examp.dat examp.run
打印
LP_SOLVE 4.0.1.0: optimal, objective 1
1 simplex iterations
x1 = 0
x2 = 1
在我的机器上。
如果我没弄错,.mod,.dat和.run扩展名不是必需的,你也可以使用.txt。
如果您还有其他问题,我建议直接从AMPL开发人员那里免费下载AMPL一书:
http://www.ampl.com/BOOK/download.html
特别参见 1.4 AMPL中的线性编程模型,第10页,它们展示了如何将模型与数据分开。
<小时/> 更新如果我理解正确的话,我仍然不能100%确定。我假设您希望根据某些情况启用/禁用约束。
在下面的示例中,有一个模型,数据决定传递给求解器的最终模型中包含的实际约束。在示例中,我启用了constraint_a
,但我排除了constraint_b
。该模型读取和写入令人不快,因为您必须相应地编写模型。
您可以使用命令solexpand _scon;
检查生成的模型。另请参阅应启用的其他选项。
var x1 >= 0;
var x2 >= 0;
param is_a_enabled;
param is_b_enabled;
maximize z:
x1 + x2;
s.t.
constraint_a:
is_a_enabled*(x1+x2-3) <= 0; # x1+x2<=3 if enabled, 0<=0 otherwise
constraint_b:
is_b_enabled*(x1+2*x2-4)<=0; # x1+2*x2<=4 if enabled, 0<=0 otherwise
# you can put everything below into a separate file
data;
param is_a_enabled := 1;
param is_b_enabled := 0;
option presolve 10;
option substout 1;
option show_stats 1;
solve;
print "Constraints finally passed to the solver are:";
solexpand _scon;
print "Solution:";
display x1, x2;
这会产生以下输出
Presolve eliminates 1 constraint.
Adjusted problem:
2 variables, all linear
1 constraint, all linear; 2 nonzeros
1 inequality constraint
1 linear objective; 2 nonzeros.
LP_SOLVE 4.0.1.0: optimal, objective 3
1 simplex iterations
Constraints finally passed to the solver are:
subject to constraint_a:
x1 + x2 <= 3;
Solution:
x1 = 0
x2 = 3