在AMPL中,如何引用结果的一部分,并在多个地方使用它们

时间:2019-08-08 06:34:34

标签: ampl

我正在学习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

我阅读了一些教程并查阅了手册,但是找不到解决这个看似简单的问题的方法。我发现的只是最大化单个值,这是计算结果。而且它仅使用了一次,并且不再出现在约束中。

1 个答案:

答案 0 :(得分:1)

在AMPL之类的产品中,“最大化最小值”问题的常用方法是定义一个辅助变量并设置有效地将其定义为最小值的线性约束,将非线性函数(最小值)转换为线性规则。

例如,假设我有一堆决策变量x[i],其中i的范围是索引集S,而我想最大化x[i]的最小值。的AMPL语法为:

var x_min;
s.t. DefineMinimum{i in S}: x_min <= x[i];
maximize ObjectiveFunction: x_min;

约束仅要求x_min小于或等于x[i]的最小值。但是,由于您尝试使x_min最大化,并且没有其他限制,因此它最终应始终等于该最小值(给出或考虑机器算术ε的考虑)。

如果您有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被编程为识别和处理最小类型的约束。但是,如果将求解器选项切换为gurobicplex,它将失败,因为它们仅接受线性或二次约束。要对这些求解器应用最小约束,您需要使用类似我上面讨论的线性技巧。