Discrete Optimization with Building Energy Conservation Measures

During my research internship at Lawrence Berkeley National Laboratory supervised by Dr. Tianzhen Hong (Head of Urban Systems Group), I was given the opportunity to design a discrete optimization algorithm to find the top N best combinations of building ECM packages (such as upgrading to LED lights, using efficient HVAC systems, etc) that can be applied to a vintage building. My algorithm serves as an intermediate process to the building energy optimization engine of LBNL’s Commercial Building Energy Saver (CBES) software. Here is the summary:

The building Energy Conservation Measure packages are retrofitting packagesthat can be applied to a vintage building. There are ECM conflicts and buildingcompatibility constraints: for example, replacing existing lighting with LEDupgrade is in conflict with T8 light bulb (0.7W/sf) upgrade (ECM conflict) andthe single zone rooftop unit efficiency upgrade can only be used in small officeor small retail buildings (building compatibility). Besides, each ECM package has a associated cost and thus the total budget is another constraint.In this task, we aim to find the top N best combinations of ECM packages for a given building that maximize the energy savings using dynamic constraint generation for each i-th best iteration.

In the objective function, s_i is the financial saving for the i-th ECM package. All variables (x_i) are binary (Constraint (6)), where 1 means “selected” and 0 means “not selected”. Constraint (1) makes sure that two conflicting ECM packages cannot be selected together, where E_{conflict} is a set of index pairs that are in conflict. Constraint (2) prevents the use of incompatible ECM packages for the given building. Constraint (3), (4), and (5) make sure that the selected ECMs meet the budge, CO2 reduction, and payback years requirements. Constraint (7) is dynamically generated at each iteration, which excludes the solution in the previous iteration, where $\hat{I}_{k-1}$ is the set of optimal indices calculated at the $(k-1)$-th step, and $\hat{x}^{(k-1)}_i$, $i=1,…,n$ are the optimal solutions for the $(k-1)$-th iteration.

The problem is implemented on both the GLPK-4.44 engine for Ruby and the Gurobi Solver for Python. Code is hosted at github.com/BILLYZZ.