1
$\begingroup$

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)
        else:
            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.

Error

Thank you. :)

$\endgroup$

Your Answer

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

Browse other questions tagged or ask your own question.