2
votes

I am trying to solve a MINLP using the Gekko package. A simple problem is shown below.

the optimization problem

I wrote the code below but it gives me this error

@error: Inequality Definition invalid inequalities: z > x < y

from gekko import GEKKO

model = GEKKO()
model.options.SOLVER = 1

#define the inputs
R=[1000 for i in range(nflows)]
C=[[1000 for i in range(n_nodes)] for j in range(n_nodes)]


#define x_ij
x = [[model.Var(value=1, lb=0, ub=1, integer=True) for j in range(n_nodes)] for i in range(n_nodes)]
q = [[[model.Var(value=1/n_nodes, lb=0, ub=1, integer=False) for j in range(n_nodes)] for i in range(n_nodes)] for k in range(nflows)]


#define the objective
model.Obj(sum(sum((x[i][j] /(C[i][j] - R[k] * q[k][i][j] for k in range(nflows))) for j in range(n_nodes)) for i in range(n_nodes)))

n_const=0
for k in flows:
    for i in range(n_nodes):
        n_const += 1
        if checksource (i, k, flows):
            model.Equation(sum(x[i][j] * q[k][i][j] for j in range(n_nodes)) == 1)
        elif checkdest (i, k, flows):
            model.Equation(sum(x[j][i] * q[k][j][i] for j in range(n_nodes)) == 1)
        else:
            model.Equation(sum(x[i][j]*q[k][i][j] for j in range(n_nodes)) - sum(x[j][i] *q[k][j][i] for j in range(n_nodes)) == 0)

model.solve()
1

1 Answers

0
votes

There are many issues with your current model. Here is a fix for your variable declaration and objective function that is easier to configure and read.

from gekko import GEKKO

nflows = 2
n_nodes = 2

model = GEKKO(remote=False)
model.options.SOLVER = 1

#define the inputs
R=[1000 for i in range(nflows)]
C=[[1000 for i in range(n_nodes)] for j in range(n_nodes)]


#define x_ij
x = model.Array(model.Var,(n_nodes,n_nodes),lb=0,ub=1)
q = model.Array(model.Var,(n_nodes,n_nodes,nflows),value=1/n_nodes,lb=0,ub=1)

#define the objective
for i in range(n_nodes):
    for j in range(n_nodes):
        for k in range(nflows):
            model.Minimize(x[i,j] /(C[i][j] - R[k] * q[k][i][j]))
            
model.solve()

You'll need to add the constraints but hopefully this gets you started in the right direction.