Гуроби: Видимо выполнимая модель порождает недопустимую ошибку модели? - PullRequest
0 голосов
/ 21 ноября 2019

при отладке реализации более крупной модели потока на орграфе я обнаружил странную ошибку в одном из компонентов, которая привела бы к недопустимой ошибке модели по gurobi. Переход от выполнимости к невозможности, по-видимому, связан с изменением направления потока через единственную дугу (1,0), из которой состоит модель. Я просто не могу понять это. См. Ниже недопустимую модель .lp-файла

\ Model Model1
\ LP format - for model browsing. Use MPS format to capture full model detail.
Minimize

Subject To
 p_lb[0]: pressure[0] >= 10
 p_lb[1]: pressure[1] >= 10
 p_ub[0]: pressure[0] <= 80
 p_ub[1]: pressure[1] <= 80
 q_lb[1,0]: q[1,0] >= -100
 q_ub[1,0]: q[1,0] <= 100
 Flow_Balance[0]: q[1,0] = -50
 Flow_Balance[1]: - q[1,0] = 50
 short_cut2[1,0]: - pressure[0] + pressure[1] = 0
Bounds
End

На данный момент вся проблема - проблема осуществимости, поэтому моя цель - ноль. У меня есть ограниченные переменные давления в узлах 0 и 1, переменная потока по дуге, которая возникает в балансах потока в каждом узле. Кроме того, я хочу, чтобы значения давления в узлах совпадали.

Я выбросил .lp-файлы и .mps-файлы в мое сравнение текста VSC, но, похоже, они не отличаются, за исключением направления потока,У меня сильное чувство, что я могу что-то упустить. Ниже также .mps-файлы для обоих направлений потока.

Возможное:

NAME Model1
ROWS
 N  OBJ
 G  p_lb[0] 
 G  p_lb[1] 
 L  p_ub[0] 
 L  p_ub[1] 
 G  q_lb[1,0]
 L  q_ub[1,0]
 E  Flow_Balance[0]
 E  Flow_Balance[1]
 E  short_cut2[1,0]
COLUMNS
    pressure[0]  p_lb[0]   1
    pressure[0]  p_ub[0]   1
    pressure[0]  short_cut2[1,0]  -1
    pressure[1]  p_lb[1]   1
    pressure[1]  p_ub[1]   1
    pressure[1]  short_cut2[1,0]  1
    q[1,0]    q_lb[1,0]  1
    q[1,0]    q_ub[1,0]  1
    q[1,0]    Flow_Balance[0]  1
    q[1,0]    Flow_Balance[1]  -1
RHS
    RHS1      p_lb[0]   10
    RHS1      p_lb[1]   10
    RHS1      p_ub[0]   80
    RHS1      p_ub[1]   80
    RHS1      q_lb[1,0]  -100
    RHS1      q_ub[1,0]  100
    RHS1      Flow_Balance[0]  50
    RHS1      Flow_Balance[1]  -50
BOUNDS
ENDATA

Невозможное:

NAME Model1
ROWS
 N  OBJ
 G  p_lb[0] 
 G  p_lb[1] 
 L  p_ub[0] 
 L  p_ub[1] 
 G  q_lb[1,0]
 L  q_ub[1,0]
 E  Flow_Balance[0]
 E  Flow_Balance[1]
 E  short_cut2[1,0]
COLUMNS
    pressure[0]  p_lb[0]   1
    pressure[0]  p_ub[0]   1
    pressure[0]  short_cut2[1,0]  -1
    pressure[1]  p_lb[1]   1
    pressure[1]  p_ub[1]   1
    pressure[1]  short_cut2[1,0]  1
    q[1,0]    q_lb[1,0]  1
    q[1,0]    q_ub[1,0]  1
    q[1,0]    Flow_Balance[0]  1
    q[1,0]    Flow_Balance[1]  -1
RHS
    RHS1      p_lb[0]   10
    RHS1      p_lb[1]   10
    RHS1      p_ub[0]   80
    RHS1      p_ub[1]   80
    RHS1      q_lb[1,0]  -100
    RHS1      q_ub[1,0]  100
    RHS1      Flow_Balance[0]  -50
    RHS1      Flow_Balance[1]  50
BOUNDS
ENDATA

Буду признателен, если выможет пролить свет во тьму:)

1 Ответ

1 голос
/ 21 ноября 2019

По умолчанию все переменные имеют нижнюю границу 0, но с вашими ограничениями Flow_Balance вы устанавливаете q[1,0] = -50. Чтобы получить неограниченную переменную, вы должны явно установить ее нижнюю границу в минус бесконечность. (То, как вы это сделаете, зависит от того, какой API вы используете.)

Чтобы отладить такие проблемы неосуществимости, вы можете попросить Gurobi вычислить Неприводимую Несогласованную Подсистему (IIS). Когда вы запускаете Gurobi из командной строки (gurobi_cl), вы можете сделать это, указав ResultFile=<filename>.ilp (расширение ilp говорит Gurobi вычислить и написать IIS);в Python вы бы использовали метод computeIIS . Например, вычисление IIS для вашей недопустимой модели приводит к единственному ограничению q[1,0] = -50.

...