maintaining monotonicity in an optimization problem

2 views (last 30 days)
I have written a program for optimizing a set of generators. I have hourly price and cost data and need to figure out when a generator should run or just stay off. I describe the problem in more detail below. The first description is of the current optimization which only deals with a single generator. Following I show a WIP formulation for dealing with multiple generators and an additional demand constraint.
In the first formulation, it is possible to optimize for income6 using a non linear solver, and then optimize revenue6 using an integer solver. This is since revenue6 is a monotonic function of income6. Thus x_1 is optimized first, then x_2 and x_3.
Part 1
Problem Description 1
  • x_1 is the generator output at any one point in time and is constrained to be between a min and max capacity
  • x_2 is an integer variable used simply to turn the generator off completely
  • x_3 lastly is another integer variable used to apply a startup cost whenever the generator is switched on.
  • x_1, x_2 and x_3 are vectors where the index of the vector (eg. x_1(1:5) is the data for the first 5 hours)
Objective Function (totrevenue6):
  • efficiency6 = 0.2621*x_1 - 0.1229*x_1^2 + 0.2543
  • income6 = {(x_1)*(AC_1 + FC_1 - P_1 + FC_1/{el_efficiency6})}
  • revenue6 = - SC_1*x_3 + x_2*(income6)
  • totrevenue6 = -sum(revenue6)
Constraints:
  • min_capacity <= generator6 power (x_1) <= max_capacity
  • 0 <= generator6 toggle (x_2)<= 1
  • The startup constraint (x_3) is x_2-x_{2-1}<=x_3
  • 0 <= (x_3)<= 1
Part 2
New Formulation
I have continued to develop the program to optimize the set of generators and I now need to add the profit from two additional blocks to the objective function.
Objective Function (totrevenue):
income6 = {(x_16)*(AC_1 + FC_1 - P_1 + FC_1/{el_efficiency6})}
revenue6 = - SC_16*x_36 + x_26*(income6)
income7 = {(x_17)*(AC_1 + FC_1 - P_1 + FC_1/{el_efficiency7})}
revenue7 = - SC_17*x_37 + x_27*(income6)
income8 = {(x_18)*(AC_1 + FC_1 - P_1 + FC_1/{el_efficiency8})}
revenue8 = - SC_18*x_38 + x_28*(income6)
**totrevenue** = -sum(revenue6+revenue7+revenue8)
Constraints
  • x_16 + x_17 + x_18 >= demand at time t
  • x_26*x_16 + x_27*x_17 + x_28*x_18 >= demand at time t
Essentially I need to make sure that both optimizations meet the demand for each time step. (x_16 is generator electricity output for block 6, x_17 is for block 7, etc.)
Question:
Will it be possible to optimize the sum of (income6 + income7 + income8) using a non linear solver first, and then optimize totalrevenue using an integer solver, and in this way maintain monotonicity? I would like to maintain monotonicity so that I dont have to use a non linear integer solver.
Many thanks, Jesse

Answers (1)

Alan Weiss
Alan Weiss on 22 Jan 2015
Firstly, I don't know the answer to your question off the top of my head, sorry.
Secondly, I wonder if you can reformulate your problem to have it be an entirely linear MILP problem, along the lines of this example. Instead of having a purely continuous set of levels for x_1, perhaps you can choose a small set of levels, and have costs associated with the various levels, as in the example. Then perhaps the entire problem can be solved in one MILP call, without using a nonlinear solver at all.
Good luck,
Alan Weiss
MATLAB mathematical toolbox documentation
  1 Comment
Jesse
Jesse on 22 Jan 2015
Thank you Alan for the reply. I have seen a similar example in the past where there are discreet levels of power generation and only off min and max are modeled. The reason I didnt go down this road is that there is a case where the price of selling electricity is lower than the costs of running the plant but where I still have to run a generator because I need to meet the electricity demand. In this case the generator output would be somewhere in between min and max capacity.

Sign in to comment.

Categories

Find more on Get Started with Optimization Toolbox in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!