I am trying to model the attached online optmization problem in pyomo. Eventually, I am going to use the octeract solver to find the matrix soluions of W and G.

I would like to ask advice about whether my code implementation of this problem is correct? Is the objective and constraints defined correctly to be passed to a solver?

Optimization problem

from pyomo.environ import *
import numpy as np
import time
import itertools

m = ConcreteModel()

# constants
a1 = 1
a2 = 1
del_t = 5
M = 2 # set of active tasks
N = 4 # 4 time steps
# note; w_hat is energy over del_t (5 seconds) NOT power
w_hat = np.array([[5,5,5,5]]).T
E = np.array([[1.6,1.6]]).T
ones_G = np.ones((1,M))
ones_W = np.ones((M,1))
ones_WG = np.ones((N,1))
maxP = 0.14
d = np.array([20,40]) # deadline in seconds
start_time = time.time()
curr_time = 0 #start_time - time.time()

# dimensions of matrix, m x n
m.m = Param(within=NonNegativeIntegers)
m.n = Param(within=NonNegativeIntegers)
m.N = Param(within=NonNegativeIntegers)

# index set, indexing the matrix or vector
m.I = RangeSet(1,M)
m.K = RangeSet(1,N)
m.phi = Param(m.I, m.K,within=Reals)
m.energy = Param(m.I, m.K,within=Reals)
m.W = Var(m.I,m.K,domain=NonNegativeReals)
m.G = Var(m.I,m.K,domain=NonNegativeReals)

iter_At = range(M)
iter_N = range(N)

m.obj = Objective(expr= np.linalg.norm(np.matmul(ones_G,m.G),ord=1) + np.linalg.norm(np.matmul(ones_G,m.G),ord=np.inf) + sum( (N - m.phi[i,k] )**2 for i,k in itertools.product(iter_At,iter_N) ) )

m.c1 = Constraint(expr = np.matmul((m.W).T,ones_W) <= w_hat)
m.c2 = Constraint(expr = np.matmul((m.W + m.G),ones_WG) == E )

def WG_constraint_rule(m, i,maxP,del_t,curr_time):
    for k in m.K:
        if curr_time + k*del_t <= d[i] + curr_time:
            return (m.W[i,k] + m.G[i,k] <= maxP*del_t)
            return (m.W[i,k] + m.G[i,k] == 0)

m.c3 = Constraint(m.I, rule=WG_constraint_rule)

def energy_constraint_rule(m, i,maxP, del_t,curr_time,E):
    for k in m.K:
         return (m.energy[i,k] == E[i] - sum( m.W[i,j] + m.G[i,j] for j in k)  ) 

m.c4 = Constraint(m.I, rule=energy_constraint_rule)

def phi_constraint_rule(m, i,maxP, del_t,curr_time):
    for k in m.K:
        return (m.phi[i,k] == d[i] - curr_time + (k*del_t) - m.energy[i,k]/maxP )

m.c5 = Constraint(m.I, rule=phi_constraint_rule)

At the moment, I have the following error but I am not too concerned about this. I just want to know if my definitions are correct.


Thank you. :)


I have solved the problem using pyomo and the octeract solver. I have attached the folder here for free to use. The octeract folder is missing but you can get that by applying a license and downloading their solver from https://octeract.com/. cheers!!

The files can be found here: https://www.researchgate.net/post/Recommended_python_solver_for_an_online_optimisation_problem2


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.