Abstract Bloat is an excess of code growth without a corresponding improvement in fitness. This is a serious problem in Genetic Programming,
often leading to the stagnation of the evolutionary process. Here we provide an extensive review of all the past and current
theories regarding why bloat occurs. After more than 15 years of intense research, recent work is shedding new light on what
may be the real reasons for the bloat phenomenon. We then introduce Dynamic Limits, our new approach to bloat control. It
implements a dynamic limit that can be raised or lowered, depending on the best solution found so far, and can be applied
either to the depth or size of the programs being evolved. Four problems were used as a benchmark to study the efficiency
of Dynamic Limits. The quality of the results is highly dependent on the type of limit used: depth or size. The depth variants
performed very well across the set of problems studied, achieving similar fitness to the baseline technique while using significantly
smaller trees. Unlike many other methods available so far, Dynamic Limits does not require specific genetic operators, modifications
in fitness evaluation or different selection schemes, nor does it add any parameters to the search process. Furthermore, its
implementation is simple and its efficiency does not rely on the usage of a static upper limit. The results are discussed
in the context of the newest bloat theory.