如何运行 分步优化一个问题?
how to run an optimization problem in different steps?
我在 AMPL 中遇到优化问题。我想知道如何 运行 在不同的步骤中使用我自己的算法进行优化?我应该使用 AMPL 还是 python 或其他软件?
这是我想要做的:
我想逐层搜索可行的统治。例如,如果我的问题在维度 3,我想搜索 3 层,例如:
first layer : x1+x2+x3=1
second layer: x1+x2+x3=2
third layer: x1+x2+x3=3
在每一层中,我都有一些新的约束,当在该层中进行搜索时,这些约束将处于活动状态。
假设 C1
、C2
、C3
分别是第 1,2 层和第 3 层的约束。我希望问题是 运行 如下:
第一层运行和C1
必须活跃:
`x1+x2+x3=1` and `C1` are active. (the constraints C2 ,C3 and 2 other layers are non-active)
那么第二层运行和C2
必须激活:
`x1+x2+x3=2` and `C2` are active. (the constraints C1 ,C3 and 2 other layers are non-active)
第三层运行和C3
必须激活:
`x1+x2+x3=3` and `C3` are active. (the constraints C1 ,C2 and 2 other layers are non-active)
您可以使用脚本在 AMPL 中执行此操作。例如:
reset;
option solver gurobi;
param n_x := 3;
var x{1..n_x};
param bignum := 1e4;
param layer;
set layers := 1..n_x;
s.t. sum_constraint: x[1] + x[2] + x[3] = layer;
s.t. c1a: x[1] >= (if layer = 1 then 10 else 10-bignum);
s.t. c1b: x[1] <= (if layer = 1 then 10 else 10+bignum);
# on layer 1, constrain x[1] = 10, otherwise leave it effectively unconstrained
s.t. c2a: x[2] >= (if layer = 2 then 20 else 20-bignum);
s.t. c2b: x[2] <= (if layer = 2 then 20 else 20+bignum);
s.t. c3a: x[3] >= (if layer = 3 then 30 else 30-bignum);
s.t. c3b: x[3] <= (if layer = 3 then 30 else 30+bignum);
minimize of: x[1]^2+x[2]^2+x[3]^2;
for {i in layers}{
let layer := i;
printf "\nLayer = %1.0f\n", layer;
solve;
display x;
}
您还可以使用 drop
和 restore
语句来打开和关闭约束,具体取决于您希望自动化的程度。
我在 AMPL 中遇到优化问题。我想知道如何 运行 在不同的步骤中使用我自己的算法进行优化?我应该使用 AMPL 还是 python 或其他软件?
这是我想要做的:
我想逐层搜索可行的统治。例如,如果我的问题在维度 3,我想搜索 3 层,例如:
first layer : x1+x2+x3=1
second layer: x1+x2+x3=2
third layer: x1+x2+x3=3
在每一层中,我都有一些新的约束,当在该层中进行搜索时,这些约束将处于活动状态。
假设 C1
、C2
、C3
分别是第 1,2 层和第 3 层的约束。我希望问题是 运行 如下:
第一层运行和C1
必须活跃:
`x1+x2+x3=1` and `C1` are active. (the constraints C2 ,C3 and 2 other layers are non-active)
那么第二层运行和C2
必须激活:
`x1+x2+x3=2` and `C2` are active. (the constraints C1 ,C3 and 2 other layers are non-active)
第三层运行和C3
必须激活:
`x1+x2+x3=3` and `C3` are active. (the constraints C1 ,C2 and 2 other layers are non-active)
您可以使用脚本在 AMPL 中执行此操作。例如:
reset;
option solver gurobi;
param n_x := 3;
var x{1..n_x};
param bignum := 1e4;
param layer;
set layers := 1..n_x;
s.t. sum_constraint: x[1] + x[2] + x[3] = layer;
s.t. c1a: x[1] >= (if layer = 1 then 10 else 10-bignum);
s.t. c1b: x[1] <= (if layer = 1 then 10 else 10+bignum);
# on layer 1, constrain x[1] = 10, otherwise leave it effectively unconstrained
s.t. c2a: x[2] >= (if layer = 2 then 20 else 20-bignum);
s.t. c2b: x[2] <= (if layer = 2 then 20 else 20+bignum);
s.t. c3a: x[3] >= (if layer = 3 then 30 else 30-bignum);
s.t. c3b: x[3] <= (if layer = 3 then 30 else 30+bignum);
minimize of: x[1]^2+x[2]^2+x[3]^2;
for {i in layers}{
let layer := i;
printf "\nLayer = %1.0f\n", layer;
solve;
display x;
}
您还可以使用 drop
和 restore
语句来打开和关闭约束,具体取决于您希望自动化的程度。