This repository contains the codebase for Comfort-aware Optimal Space Planning in Shared Workspaces. The bibliographic citation will be added here later.
We explore the joint optimization of space use and heating and cooling demand in a coworking space that offers long-term and daily plans. An input convex neural network is trained to estimate the energy consumed by the HVAC system in a single day to condition a given zone of the building. Due to the convexity of this model in its inputs, it is possible to formulate a convex mixed-integer program to optimize HVAC energy consumption by deciding how to assign desks to occupants and adjust zone temperature setpoints. Considering a medium-sized office building as the coworking space, we show that this optimization problem can be solved to near-optimality relatively quickly, hence it can be used to make decisions regarding long-term bookings. For daily bookings, we design heuristic algorithms that take the solution of the optimization problem and assign the remaining space, while ensuring the satisfaction of thermal comfort constraints. By incorporating these algorithms in the workspace reservation system, we quantify the potential savings that can be achieved.
This repository is licensed under MIT. Code is written by Tianyu Zhang.
We welcome contributions to this work in different forms, such as bug reports, pull requests, etc.
Make sure to have EnergyPlus 9.3.0 installed on your computer. This code is not compatible with other version of EnergyPlus. The COBS simulator is included in the repository for completeness.
Packages | Version |
---|---|
tqdm | 4.65.0 |
numpy | 1.25.1 |
scikit-learn | 1.3.0 |
torch | 2.0.1 |
eppy | 0.5.53 |
gurobipy | 10.0.2 |
gurobi-machinelearning | 1.3.2 |
pandas | 2.0.3 |
Bash script run_experiments.sh
can be used to run all experiments and reproduce the results in the paper. Make sure to run it one step at a time, wait for the execution to finish, and then run the next step. You can comment out the steps that you do not plan to execute.
All plots can be reproduced using plot_result.ipynb
. We have included the necessary CSV result file and pickle dumps to draw all plots in this repository.
Execute building_simulation.py
to generate offline training data.
python3 building_simulation.py
Then, run longterm_optimization.py
to find the optimal assignment for long-term occupants.
longterm_optimization.py [-h] [--estimator {linear,rf,nn}] [--warm_start WARM_START] [--num_long_term NUM_LONG_TERM]
[--seed SEED] [--thermal_threshold THERMAL_THRESHOLD] [--min_group_size MIN_GROUP_SIZE]
[--max_group_size MAX_GROUP_SIZE] [--min_temp_set MIN_TEMP_SET] [--max_temp_set MAX_TEMP_SET]
[--gap_tolerance GAP_TOLERANCE] [--special {none,uniform_number,uniform_ratio,random}]
[--with_zone_temp WITH_ZONE_TEMP] [--nn_shape NN_SHAPE] [--save_result SAVE_RESULT]
options:
-h, --help show this help message and exit
--estimator {linear,rf,nn}
Define what estimator should be used for Q_zone estimation, possible choices: linear, rf, nn
--warm_start WARM_START
Define whether to use greedy approach for warm starting solver
--num_long_term NUM_LONG_TERM
Define how many long term occupants are in the building
--seed SEED Define random seed to use
--thermal_threshold THERMAL_THRESHOLD
Define hard constraint on thermal comfort score
--min_group_size MIN_GROUP_SIZE
Define minimum number of occupants in the group
--max_group_size MAX_GROUP_SIZE
Define maximum number of occupants in the group
--min_temp_set MIN_TEMP_SET
Define minimum thermostat setpoint
--max_temp_set MAX_TEMP_SET
Define maximum thermostat setpoint
--gap_tolerance GAP_TOLERANCE
Define Dual and Primal bound gap tolerance
--special {none,uniform_number,uniform_ratio,random}
Run assignment with special rule, choices: none, uniform_number, uniform_ratio, random
--with_zone_temp WITH_ZONE_TEMP
Estimate Q with adjacent zone temperature or not
--nn_shape NN_SHAPE For NN estimator, give a python list style layer design
--save_result SAVE_RESULT
Overwrite the result dump or not
An example command would be:
python3 longterm_optimization.py --seed 2023 --estimator rf
Finally, run full_experiment.py
as follows
full_experiment.py [-h] [--online {bestfit_energy,bestfit_space,online_minlp,uniform_number,uniform_ratio,random,none}]
[--num_visitor NUM_VISITOR] [--seed SEED] [--days DAYS] [--energy ENERGY] [--reprocess REPROCESS]
[--parallel PARALLEL] [--n N] [--job_name JOB_NAME] [--min_group_size MIN_GROUP_SIZE]
[--max_group_size MAX_GROUP_SIZE] [--min_temp_set MIN_TEMP_SET] [--max_temp_set MAX_TEMP_SET]
[--thermal_threshold THERMAL_THRESHOLD] [--designate_base DESIGNATE_BASE] [--curves CURVES]
[--debug DEBUG]
options:
-h, --help show this help message and exit
--online {bestfit_energy,bestfit_space,online_minlp,uniform_number,uniform_ratio,random,none}
Define what online algorithm should be used.
--num_visitor NUM_VISITOR
Define in average how many visitors are in the building per day
--seed SEED Define random seed to use
--days DAYS Define days to simulate
--energy ENERGY Define whether simulate the energy consumption
--reprocess REPROCESS
Define whether redo simulation for finished jobs
--parallel PARALLEL Define run on how many threads
--n N Define current thread id
--job_name JOB_NAME Define a name
--min_group_size MIN_GROUP_SIZE
Define minimum number of occupants in the group
--max_group_size MAX_GROUP_SIZE
Define maximum number of occupants in the group
--min_temp_set MIN_TEMP_SET
Define minimum thermostat setpoint
--max_temp_set MAX_TEMP_SET
Define maximum thermostat setpoint
--thermal_threshold THERMAL_THRESHOLD
Define hard constraint on thermal comfort score
--designate_base DESIGNATE_BASE
Define offline MINLP solution file
--curves CURVES Log the evaluation changing trend
--debug DEBUG Use specific node to debug
An example command would be:
python3 full_experiment.py --curves False --energy True --reprocess True --online bestfit_energy --num_visitor 100 --seed 2023 --debug True