Как запустить задачу оптимизации на разных этапах? - PullRequest
2 голосов
/ 17 февраля 2020

У меня проблема с оптимизацией в 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)

1 Ответ

1 голос
/ 18 февраля 2020

Вы можете использовать скрипт для этого в 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 для включения и выключения ограничений, в зависимости от того, насколько вы хотите их автоматизировать.

...