AMPL中,如何引用部分结果,并在多个地方使用
In AMPL, how to refer to part of the result, and use them in multiple places
我正在学习 AMPL,以使用 excel 求解器加速 excel 电子表格中当前的模型。它基本上基于一个 1 x m 变量和一个 m x n 参数的矩阵乘法结果。并且它会找到变量以最大化结果中某些值的最小值,同时保持同一结果中的一些其他值满足一些约束。如何在 AMPL 中做到这一点?
Given: P= m x n parameters
Variable: X= 1 x m variable we tried to solve
Calculate: R= X x P , result of matrix multiplication of X and P
Maximize: min(R[1..3]), the minimum value of the first 3 values in the result
Subject to: R[2]<R[4]
min(R[6..8])>20
R[5]-20>R[7]
X are all integers
我阅读了几个教程并查阅了手册,但找不到解决这个看似简单的问题的方法。我找到的都是最大化单个值,也就是计算结果。并且只使用了一次,没有在约束中再次出现。
对于像 AMPL 这样的产品中的 "maximize the minimum" 问题,通常的方法是定义一个辅助变量并设置线性约束,有效地将其定义为最小值,将非线性函数 (min) 转换为线性规则。
例如,假设我有一堆决策变量 x[i]
,i
分布在索引集 S
上,我想最大化 [=13= 上的最小值]. AMPL 语法为:
var x_min;
s.t. DefineMinimum{i in S}: x_min <= x[i];
maximize ObjectiveFunction: x_min;
约束只要求x_min
小于等于x[i]
的最小值。但是,由于您正在尝试最大化 x_min
并且没有其他限制,因此它应该始终完全等于该最小值(考虑机器算术 epsilon)。
如果您有 parameters
(即在您 运行 优化之前已知值)并且想要参考它们的最小值,AMPL 可以让您更直接地做到这一点:
param p_min := min{j in IndexSet_P} p[j];
虽然 AMPL 也支持这种变量语法,但并非所有与 AMPL 一起使用的求解器都能够接受这种类型的约束。例如:
reset;
option solver gecode;
set S := {1,2,3};
var x{S} integer;
var x_min = min{s in S} x[s];
minimize OF: sum{s in S} x[s];
s.t. c1: x_min >= 5;
solve;
这将 运行 并执行您期望它执行的操作,因为 Gecode 被编程为识别和处理最小类型约束。但是,如果将求解器选项切换为 gurobi
或 cplex
,它将失败,因为它们只接受线性或二次约束。要对这些求解器应用最小约束,您需要使用类似于我上面讨论的线性化技巧。
我正在学习 AMPL,以使用 excel 求解器加速 excel 电子表格中当前的模型。它基本上基于一个 1 x m 变量和一个 m x n 参数的矩阵乘法结果。并且它会找到变量以最大化结果中某些值的最小值,同时保持同一结果中的一些其他值满足一些约束。如何在 AMPL 中做到这一点?
Given: P= m x n parameters
Variable: X= 1 x m variable we tried to solve
Calculate: R= X x P , result of matrix multiplication of X and P
Maximize: min(R[1..3]), the minimum value of the first 3 values in the result
Subject to: R[2]<R[4]
min(R[6..8])>20
R[5]-20>R[7]
X are all integers
我阅读了几个教程并查阅了手册,但找不到解决这个看似简单的问题的方法。我找到的都是最大化单个值,也就是计算结果。并且只使用了一次,没有在约束中再次出现。
对于像 AMPL 这样的产品中的 "maximize the minimum" 问题,通常的方法是定义一个辅助变量并设置线性约束,有效地将其定义为最小值,将非线性函数 (min) 转换为线性规则。
例如,假设我有一堆决策变量 x[i]
,i
分布在索引集 S
上,我想最大化 [=13= 上的最小值]. AMPL 语法为:
var x_min;
s.t. DefineMinimum{i in S}: x_min <= x[i];
maximize ObjectiveFunction: x_min;
约束只要求x_min
小于等于x[i]
的最小值。但是,由于您正在尝试最大化 x_min
并且没有其他限制,因此它应该始终完全等于该最小值(考虑机器算术 epsilon)。
如果您有 parameters
(即在您 运行 优化之前已知值)并且想要参考它们的最小值,AMPL 可以让您更直接地做到这一点:
param p_min := min{j in IndexSet_P} p[j];
虽然 AMPL 也支持这种变量语法,但并非所有与 AMPL 一起使用的求解器都能够接受这种类型的约束。例如:
reset;
option solver gecode;
set S := {1,2,3};
var x{S} integer;
var x_min = min{s in S} x[s];
minimize OF: sum{s in S} x[s];
s.t. c1: x_min >= 5;
solve;
这将 运行 并执行您期望它执行的操作,因为 Gecode 被编程为识别和处理最小类型约束。但是,如果将求解器选项切换为 gurobi
或 cplex
,它将失败,因为它们只接受线性或二次约束。要对这些求解器应用最小约束,您需要使用类似于我上面讨论的线性化技巧。