mathematical-optimization - AMPL:如何在变量表达式之间进行限制?

标签 mathematical-optimization ampl

我的问题如下:我必须使用 AMPL 解决有关混合的线性规划问题。我可以通过创建一个包含模型和数据的文件来解决这个问题,但是我应该做的是创建一个与数据分离的更通用的模型。 我的麻烦在于变量之间的限制 - 我不知道如何概括这些限制并稍后反射(reflect)在数据中。 例如,我有以下限制:

subject to restriction1:
    Xc2 + Xd2 <= Xa2 + Xb2;
subject to restriction2:
    Xc3 + Xd3 >= 0.5*(Xa3 + Xb3);

其中Xc2、Xd2、Xa2等都是变量。 我找不到任何解释这一点的教程。希望你能帮我一点...

最佳答案

您通常希望将模型、参数和命令分开,因为它们可以独立变化。这是一个例子:

将其放入模型文件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 考试.mod 考试.dat 考试.运行

这会打印

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

特别是,请参阅第 10 页的1.4 AMPL 中的线性规划模型,它们展示了如何将模型与数据分离。


更新我仍然不能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

关于mathematical-optimization - AMPL:如何在变量表达式之间进行限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12984137/

相关文章:

algorithm - 动态规划,最小化成本?

matlab - fsolve 返回复杂的解决方案 - 如何仅限于实际搜索空间?

linear-programming - AMPL:稀疏语法

AMPL 变量定义

wolfram-mathematica - 为什么使用牛顿法的 FindMaximum 会提示找不到足够的函数减少?

c++ - 查找对象 float 状态的优化方法

java - 如何将这个逻辑放入代码/数学中?

mathematical-optimization - CPLEX 中的可行性问题

python - AMPL:数据集和规范中的一个大集合

cplex - Ampl Cplex 解决错误