# Offshore wind farm layout optimization with alignment constraints

Paul Malisani, Tristan Bartement, Pauline Bozonnet

► To cite this version:

Paul Malisani, Tristan Bartement, Pauline Bozonnet. Offshore wind farm layout optimization with alignment constraints. Wind Energy Science, 2025, 10 (8), pp.1611 - 1623. 10.5194/wes-10-1611-2025. hal-05265608

HAL Id: hal-05265608

https://ifp.hal.science/hal-05265608v1

Submitted on 17 Sep 2025

HAL is a multi-disciplinary open access
archive for the deposit and dissemination of sci-
entific research documents, whether they are pub-
lished or not. The documents may come from
teaching and research institutions in France or
abroad, or from public or private research centers.

L'archive ouverte pluridisciplinaire HAL, est
destinée au dépôt et à la diffusion de documents
scientifiques de niveau recherche, publiés ou non,
émanant des établissements d'enseignement et de
recherche français ou étrangers, des laboratoires
publics ou privés.

<figure><img src="image_1.png" /></figure>

Distributed under a Creative Commons Attribution 4.0 International License
<figure><img src="image_2.png" /></figure>

# Offshore wind farm layout optimization with alignment constraints

Paul Malisani¹, Tristan Bartement², and Pauline Bozonnet³

¹Applied Mathematics Department, IFP Energies nouvelles, 1 et 4 avenue de Bois-Préau,
92852 Rueil-Malmaison, France

²Scientific Computing Department, IFP Energies nouvelles, 1 et 4 avenue de Bois-Préau,
92852 Rueil-Malmaison, France

³GreenWITS, Rond-Point de l'échangeur, les Levées, 69360 Solaize, France

**Correspondence:** Paul Malisani (paul.malisani@ifpen.fr)

Received: 20 September 2024 – Discussion started: 17 October 2024

Revised: 27 February 2025 – Accepted: 20 May 2025 – Published: 8 August 2025

**Abstract.** Wind farm layout optimization involves placing wind turbines in a defined domain to minimize the expected production losses due to wake effects within the wind farm. Due to navigational regulations and risks, tenders for offshore wind farms often impose so-called alignment constraints; i.e., wind turbines must be located at the intersections of a grid formed by parallelograms. The shape and orientation of these parallelograms are to be determined to minimize wake losses. Mathematically, this problem belongs to the class of non-convex, nonlinear mixed-integer programming problems, known to be highly complex. The literature has not yet investigated the wind farm layout optimization problem under alignment constraints. This paper makes two contributions. First, we propose a modelization of the annual energy production (AEP) maximization with alignment constraints as a mixed-integer nonlinear problem, where the continuous parameters are the parallelogram-based tiling parameters and the discrete variables are the turbines' positions at the tiling's intersections. Second, we provide a heuristic derived from the DEBO algorithm developed by the same team and presented in Thomas et al. (2023). The proposed method is the subject of international patent application number WO 2024/061627.

## 1 Introduction

Selecting the proper layout is a crucial task when building a wind farm. A layout far from optimal is prone to significant loss of expected annual energy production (AEP) due to wake effects within the farm. Having an optimized method of turbine placement in a given area helps maximize energy production over the wind farm's lifespan. In its full generality, the problem of optimizing a wind farm layout is a complex one for several reasons. The first is that computing a given farm's mean annual energy production is numerically complex; i.e., evaluating the optimization problem's objective function is computationally time-consuming (LoCascio et al., 2024; Porté-Agel et al., 2020). The second difficulty is that the problem is not convex; i.e., neither the objective function nor the minimization set are convex. As a result, the

problem of wind farm layout optimization necessitates the development of dedicated optimization tools. Wind farm optimization has been the subject of much scientific research; see, for example, Herbert-Acero et al. (2014), Fischetti and Pisinger (2019), and Hou et al. (2019) for a list of reviews of such methods. Let us now focus on recent contributions to the field. In Quick et al. (2023), the authors develop a stochastic gradient-based method for optimizing wind farm layouts. The presented algorithm is developed for circular or square domains and could be easily extended to convex domains but not to non-convex or non-connected ones. In Kumar and Sharma (2023), the authors use a teaching-learning-based algorithm to solve the wind farm layout optimization problem for a circular domain. In Liang and Liu (2023), the authors use genetics and particle swarm algorithms to solve the problem on a square domain. In Fischetti and Fischetti
(2022), the authors propose a mixed-integer linear programming model to solve turbine placement and cable routing optimization problems. In Kunakote et al. (2022), the authors compare 12 meta-heuristic methods for wind farm layout optimization. The presented methods do not rely on any assumption on the shape of the admissible domain. However, the method relies on a very coarse discretization of the domain and can be numerically intractable using a finer one. In Thomas et al. (2023), the authors compare eight wind farm optimization methods and provide a benchmark case study for comparing algorithm performances. The proposed benchmark is highly complex since the admissible domain is neither convex nor connected. However, this contribution does not account for any alignment constraints. Finally, in Stanley and Ning (2019), the authors propose a so-called inner-grid wind farm layout parameterization that satisfies strong alignment constraints. However, the authors assume a one-to-one correspondence between this parameterization and the layout configuration, which dramatically reduces the degree of freedom and potentially leads to far-from-optimal solutions. In fact, despite the extensive literature on wind farm optimization, to the best of our knowledge, no other method can handle turbine alignment constraints. By alignment constraint, we mean that we place the turbines at the intersections of a regular grid composed of parallelograms, whose shape and orientation are to be determined, while considering the possibility of not occupying all the grid's intersections. This possibility is a key feature of the proposed algorithm, and its interest is illustrated in the numerical examples presented in the paper. Far from being just an academic question, turbine alignment constraints are often imposed by maritime authorities on developers in practice to ensure the safe navigation of boats within the wind farm (see, for example, the following technical reports: Ministry of Transport of the French Republic, 2017, and Maritime and Coastguard Agency, 2012). The contribution of this paper is to provide an optimization algorithm for wind farm layout optimization that can handle alignment constraints. Mathematically, these alignment constraints render the wind farm layout optimization problem a mixed-integer nonlinear programming (MINLP) problem. The integer variables represent the positions of the turbines, which are restricted to the finite set of grid intersections within the admissible domain. The continuous variables are the grid parameters, that is to say the size and orientation of the grid's unit parallelogram. The nonlinearity mainly stems from the wind farm's annual energy production (AEP) as a function of the optimization parameters. These problems are generally extremely difficult to solve. As detailed in Burer and Letchford (2012), solving algorithms for non-convex MINLPs fall into two different categories: exact methods and heuristic-based methods. Exact methods often rely on branch-and-bound methods (Papadimitriou and Steiglitz, 1998) or separation properties of the objective function. Heuristic methods include tabu research (Exler et al., 2008), particle swarm algorithms (Yiqing

et al., 2007; Young et al., 2007), genetic algorithms (Schlüter et al., 2009), or local-search methods (Liberti et al., 2011). The strategy adopted in this paper is to adapt the DEBO method developed by the authors in Thomas et al. (2023) to the problem at hand. This method is a local-search-based approach coupled with an exploration heuristic for optimizing parameters. The paper is organized as follows. In Sect. 2, we introduce useful notations and definitions. In Sect. 3, we describe the aligned-layout optimization problem; that is to say, we present the objective function, the constraints, and the optimization variables. We fully describe the optimization algorithm in Sect. 4. In Sect. 5, we take up the benchmark presented in Thomas et al. (2023) and add the alignment constraints, and we conduct a thorough study on the setting of the optimization algorithm hyper-parameters. In Sect. 6, we illustrate the impact of the alignment-grid parameters exploration method on the AEP and prove that an efficient exploration method yields a strong improvement in the AEP. Finally, in Sect. 7, we give the conclusions of this work and draw up research perspectives on the subject.

## 2 Notations and definitions

Throughout the paper we will use recurrently the following notations:

- $\mathbb{R}, \mathbb{R}_+$ denote respectively the set of real numbers and the set of non negative real numbers.

- $\mathbb{Z}, \mathbb{Z}_*$ denote respectively the set of integers and the set of non-zero integers.

- $\Omega \in \mathbb{R}^2$ denotes two-dimensional domain where turbines can be planted.

- $N_{\max}$ denotes maximal number of turbines to be placed within the admissible domain $E$.

- $D_{\text{turb}}$ denotes turbine diameter.

- $D_{\min}$ denotes minimal distance between turbines.

- $D_{\max}$ denotes maximal distance between turbines.

- $w_s$ denotes wind speed.

- $w_d$ denotes wind direction.

- $\top$ denotes logical true.

- $\bot$ denotes logical false.

- $\neg$ denotes logical negation.

- $\wedge$ denotes logical and operator.

- $\vee$ denotes logical or operator.
**Definition 1.** (Wind farm). A capital bold character associated with a subscript such as $\mathbf{F}_n$ denotes a $n$-turbine wind farm. Mathematically $\mathbf{F}_n$ is a function satisfying

$$ \mathbf{F}_n : \{1, \dots, n\} \ni k \mapsto (x_k, y_k)^\top \in \mathbb{R}^2, \quad (1) $$

where $(x_k, y_k)^\top$ is the position of the $k$th turbine. Let $\mathbf{F}_n$ and let $(x, y)^\top \in \mathbb{R}^2$; we denote $\mathbf{H}_{n+1} := \mathbf{F}_n \oplus (x, y)$ the wind farm defined as follows.

$$ \mathbf{H}_{n+1}(k) := \begin{cases} \mathbf{F}_n(k) & \text{if } k \le n \\ (x, y)^\top & \text{if } k = n+1 \end{cases} \quad (2) $$

**Definition 2.** (Wind farm power production). We denote $\mathcal{P}: (\mathbf{F}_n, w_s, w_d) \mapsto \mathbb{R}_+$ the power production of the wind farm $\mathbf{F}_n$ for a wind speed $w_s$ and a wind direction $w_d$.

**Definition 3.** (Expected power production and annual energy production). We denote $W := (w_s, w_d) \in \mathbb{R}_+ \times [0, 2\pi)$ the wind random variable, and we denote $\mathbb{P}_W$ the probability measure on $\mathbb{R}_+ \times [0, 2\pi)$ associated with the random variable $W$. Finally, we denote $\mathbb{E}_W$ the expectation with respect to the probability $\mathbb{P}_W$, and the expected power production of a wind farm $\mathbf{F}_n$ is

$$ \mathbb{E}_W(\mathcal{P}(\mathbf{F}_n, w_s, w_d)) := \int_{\mathbb{R}_+ \times [0, 2\pi)} \mathcal{P}(\mathbf{F}_n, w_s, w_d) d\mathbb{P}_W(w_s, w_d), \quad (3) $$

and the annual energy production of a wind farm $\mathbf{F}_n$ denoted $\text{AEP}(\mathbf{F}_n)$ is

$$ \text{AEP}(\mathbf{F}_n) := 8760 \cdot \mathbb{E}_W(\mathcal{P}(\mathbf{F}_n, w_s, w_d)). \quad (4) $$

Finally, when the probability is discrete, i.e., $\mathbb{P}_W := \sum_{n=1}^{N_W} p(w_s^n, w_d^n) \delta(w_s^n, w_d^n)$, where $p(w_s^n, w_d^n)$ is the probability of wind $W = (w_s^n, w_d^n)$ and $\delta(w_s^n, w_d^n)$ is the Dirac delta function at $(w_s^n, w_d^n)$, the AEP computation is

$$ \text{AEP}(\mathbf{F}_n) := 8760 \sum_{n=1}^{N_W} p(w_s^n, w_d^n) \mathcal{P}(\mathbf{F}_n, w_s^n, w_d^n). \quad (5) $$

## 3 Optimization model for layout optimization with alignment constraints

The optimization problem we are interested in consists of optimizing the grid configuration and the turbine placement on the intersections of this grid. This optimization problem is a nonlinear mixed-integer programming problem, a class of problems known to be challenging to solve. In this section, we describe the parameterization of our problem.

### 3.1 Grid parameterization

To write the optimization problem, we parameterize the grid using 6 parameters $(r_1, r_2, \theta_1, \theta_2, v_x, v_y)$ as represented in Fig. 1. The grid is a parallelogram-based tiling of the plane,

<figure><img src="image_3.png" /><figcaption>Figure 1. Grid parameterization for aligned layout.</figcaption></figure>

the parameters $r_1, r_2$ are the two sides' length of the parallelogram, the parameter $\theta_1 (\theta_2)$ is the angle formed between the side of the parallelogram of length $r_1 (r_2)$ and the x axis. Finally the parameters $v_x, v_y$ are the offset between the origin of the Cartesian and the parallelogram-based grids. Using this parameterization we define the change-of-basis matrix from the canonical basis denoted $\mathcal{B}_0$ to the grid basis denoted $\mathcal{B}(\theta_1, \theta_2, r_1, r_2)$ as follows.

$$ P_{\mathcal{B}_0}^{\mathcal{B}(\theta_1, \theta_2, r_1, r_2)} = \begin{pmatrix} r_1 \cos(\theta_1) & r_2 \cos(\theta_2) \\ r_1 \sin(\theta_1) & r_2 \sin(\theta_2) \end{pmatrix} \quad (6) $$

In the grid-basis coordinates, any intersection point $p$ is as follows.

$$ p := \begin{pmatrix} k_1 \\ k_2 \end{pmatrix} + \left( P_{\mathcal{B}_0}^{\mathcal{B}(\theta_1, \theta_2, r_1, r_2)} \right)^{-1} \begin{pmatrix} v_x \\ v_y \end{pmatrix}, \quad k_1, k_2 \in \mathbb{Z} $$

This parameterization in grid basis is, in turn, equivalent to

$$ p = \begin{pmatrix} k_1 \\ k_2 \end{pmatrix} + \begin{pmatrix} \Delta_1 \\ \Delta_2 \end{pmatrix}, \quad k_1, k_2 \in \mathbb{Z} \text{ and } \Delta_1, \Delta_2 \in [0, 1). \quad (7) $$

### 3.2 Layout parameterization

Using the grid parameterization described in Sect. 3.1, an aligned layout has its turbines located on the intersections of the grid which is

$$ \mathbf{F}[\mathcal{B}]_n(i) : \{1, \dots, n\} \ni i \mapsto \begin{pmatrix} k_1^i & k_2^i \end{pmatrix}^\top + \begin{pmatrix} \Delta_1 & \Delta_2 \end{pmatrix}^\top, \quad k_1^i, k_2^i \in \mathbb{Z}; \Delta_1, \Delta_2 \in [0, 1). \quad (8) $$

The corresponding wind farm in canonical coordinates $\mathbf{F}_n$ thus is

$$ \mathbf{F}_n(i) = P_{\mathcal{B}_0}^{\mathcal{B}(\theta_1, \theta_2, r_1, r_2)} \mathbf{F}[\mathcal{B}]_n(i), \quad i = 1, \dots, n. \quad (9) $$
Thanks to the parameterization from Eq. (8), the alignment constraint translates into an integer constraint on the optimization variables $(k_1^i, k_2^i)$.

### 3.3 Optimization problem

We are now ready to write the general wind farm layout optimization problem with alignment constraints. This optimization problem consists of maximizing the wind farm's annual energy production as defined in Eq. (4). This is

$$ \max_{(k_1^i, k_2^i)_{i=1,...,N_{\max}}, \Delta_1, \Delta_2, r_1, r_2, \theta_1, \theta_2} \text{AEP}(\mathbf{F}[\mathcal{B}]_{N_{\max}}) \quad (10) $$

under the following constraints.

$$ k_1^i, k_2^i \in \mathbb{Z}; \quad i = 1, \dots, N_{\max} \quad (11) $$

$$ |k_1^i - k_1^j| + |k_2^i - k_2^j| \ge 1; \quad \forall i \ne j \quad (12) $$

$$ \Delta_1, \Delta_2 \in [0, 1) \quad (13) $$

$$ \mathbf{F}_{N_{\max}}(i) \in \Omega; \quad i = 1, \dots, N_{\max} \quad (14) $$

$$ \theta_1 \in \left(-\frac{\pi}{2}, \frac{\pi}{2}\right] \quad (15) $$

$$ \theta_2 \in \left[-\frac{\pi}{2}, \theta_1\right) \quad (16) $$

$$ D_{\min} \le \min_{z \in \mathbb{Z}_2^4} \left\| P_{\mathcal{B}_0}^{\mathcal{B}(\theta_1, \theta_2, r_1, r_2)} z \right\| \quad (17) $$

Equations (11), (12), and (13) ensure that the turbines are located at the intersections of the grid defined by the parameters $(r_1, r_2, \theta_1, \theta_2, v_x, v_y)$ and thus that the turbines are aligned along the directions $\theta_1$ and $\theta_2$. The constraint from Eq. (14) guarantees that the turbines are located in the admissible domain. Constraints defined in Eqs. (15) and (16) allow us to generate all possible parallelogram-based grids. We only consider $\theta_1 \in (-\pi/2, \pi/2]$ since $\theta_1 > \pi/2$ ($\theta_1 < -\pi/2$) yields the same tiling as $\theta_1 - \pi/2$ ($\theta_1 + \pi/2$). Finally, the constraint from Eq. (17) ensures that no grid's intersections are closer to each other than $D_{\min}$. Since the turbines are necessarily located on these intersections, this constraint ensures that turbines are at least $D_{\min}$ distant from each other.

## 4 Solving algorithm

### 4.1 General description of the proposed solving algorithm

The method presented in this paper belongs to the category of heuristic-based methods and consists of the following steps.

- **STEP 1.** The first step consists of computing the set $R_{1,2}$ of parameters $(r_1, r_2)$ by discretization of the space $[D_{\min}, D_{\max}]^2$ using a grid size of $\Delta r$. There is no upper limit to the $D_{\max}$ value. However, it is useless to set this parameter at a large value. Indeed, beyond a certain value $d > D_{\min}$, any shape-parameter configuration such that $r_1, r_2 > d$ will produce coarse grids with fewer than $N_{\max}$ admissible intersections.

- **STEP 2.** The second step consists of reducing the size of the angle search space. To do so, for each couple $(r_1, r_2) \in R_{1,2}$, we discretize the search space $(-\frac{\pi}{2}, \frac{\pi}{2}] \times [-\frac{\pi}{2}, \theta_1)$ using a discretization size of $\Delta\theta$. Then, for each grid configuration $(r_1, r_2, \theta_1^k, \theta_2^k)_k$ satisfying Eq. (17) we compute the AEP of an elementary 4-turbine wind farm. Then, we store the $N_{\theta}$ best angle configurations $(\theta_1, \theta_2)$ in an angle set $\Theta$. This latter set $\Theta$ is the reduced angle search space.

- **STEP 3.** Then, we compute a set of grid configurations $(r_1, r_2, \theta_1, \theta_2)$ defined as grids := $\{(r_1, r_2, \theta_1, \theta_2) : (r_1, r_2) \in R_{1,2}, (\theta_1, \theta_2) \in \Theta, \text{Eq. (17) holds.}\}$.

- **STEP 4.** For each explored shape configuration $(r_1, r_2, \theta_1, \theta_2)$, we compute an optimal layout using a greedy algorithm for placing the $N_{\max}$ turbines on the intersections of the grid and using a local-search optimization method to move the turbines on the intersections. The sequence of greedy initialization followed by a local-search method has already been proved efficient for wind farm layout optimization without alignment constraints; see the DEBO algorithm from Thomas et al. (2023).

- **STEP 5.** Return the best overall wind farm layout.

Finally, the corresponding pseudo-code is displayed in Algorithm 1. As one can see on line 13, step 4, which is the most computationally demanding, can be run in parallel.

### 4.2 Angle search space reduction and grid configuration selection

In this section, we describe the first part of the algorithm which consists of finding a set of grid configurations $(r_1, r_2, \theta_1, \theta_2)$ of reasonable size and performing a complete wind farm layout optimization for each element of this set. To do so, we first compute the set $R_{1,2}$ of parameters $(r_1, r_2)$ by discretizing the space $[D_{\min}, D_{\max}]^2$ using a discretization of size $\Delta r$. Then, for each $(r_1, r_2) \in R_{1,2}$, discretize the following search space

$$ S := \left\{ (\theta_1, \theta_2) \in \left[-\frac{\pi}{2}, \frac{\pi}{2}\right]^2 : \theta_1 \ge -\frac{\pi}{2} + \Delta\theta, \theta_2 \le \theta_1 - \Delta\theta \right\} \quad (18) $$

with an angle discretization parameter $\Delta\theta$. We denote $S_D$ this discrete search space. Then, for each $(r_1, r_2) \in R_{1,2}$, we define the corresponding angle search space $\Theta_{r_1, r_2}$ as follows.

$$ \Theta_{r_1, r_2} := \{(\theta_1, \theta_2) \in S_D : \text{Eq. (17) holds}\} \quad (19) $$

Then, for each configuration $(r_1, r_2, \theta_1^k, \theta_2^k)_k$ with $(\theta_1^k, \theta_2^k) \in \Theta_{r_1, r_2}$ we compute the AEP of the elementary farms
**Algorithm 1** Aligned_Optimization(Ω, Nmax, Nθ, Dmin, Dmax, Δr, Δθ).

1: {STEP 1: Compute R1,2}

2: R1,2 ← GenerateR1R2(Δr, Dmin, Dmax)

3:

4: {STEP 2: Compute Reduced Angles Search Space Θ}

5: Θ ← ReduceSearchSpace(R1,2, Δθ, Dmin, Dmax, Dturb, Nθ)

6:

7: {STEP 3: Generate compute admissible intersections for each grid configurations}

8: grids ← GenerateConfigs(R1,2, Θ, Dmin, Dmax, Dturb)

9: intersections_sets ← ComputeAllIntersections(grids, Dmin, Ω)

10:

11: {STEP 4: Compute optimal layout for each set of intersections}

12: layouts ← ∅

13: for (intersections, (r₁, r₂, θ₁, θ₂)) ∈ intersections_sets {Run in parallel} do

14: (F Nmax, aep) ← PlaceTurbines(intersections)

15: layouts ← layouts ⋃ { (F Nmax, aep, intersections, (r₁, r₂, θ₁, θ₂))}

16: end for

17: layouts ← sort layouts by aep in descending order

18:

19: {STEP 5: Get best overall layout}

20: return layouts(0)

(F[B(r₁, r₂, θ₁, θ₂)]₄)ₖ defined as follows,

$$
\mathbf{F}[\mathcal{B}(r_1, r_2, \theta_1^k, \theta_2^k)]_4(i) := \begin{cases} (0 \ 0)^\top & \text{if } i = 1, \\ (1 \ 0)^\top & \text{if } i = 2, \\ (0 \ 1)^\top & \text{if } i = 3, \\ (1 \ 1)^\top & \text{if } i = 4, \end{cases} \quad (20)
$$

and sort the couples (θ₁, θ₂)ₖ by decreasing order of AEP.
Finally, for each (r₁, r₂) ∈ R₁,₂, we store in the set Θ the
best Nθ angles configuration (θ₁, θ₂) ∈ Θᵣ₁,₂. Then, the
continuous-variable search space denoted grids consists of
all the combinations of the (r₁, r₂) ∈ R₁,₂ explored with all
the angles' configuration from Θ, i.e.,

$$
\text{grids} := \{(r_1, r_2, \theta_1, \theta_2) : (r_1, r_2) \in R_{1,2}, (\theta_1, \theta_2) \\
\qquad \in \Theta : \text{Eq. (17) holds.}\}. \tag{21}
$$

The corresponding algorithm in pseudo-code is described in
Algorithms A1, A2, A3, and A4.

4.3 Compute intersections for each grid configuration

This part of the algorithm consists of traversing grids(k) and,
for each configuration (r<sub>1</sub><sup>k</sup>, r<sub>2</sub><sup>k</sup>, θ<sub>1</sub><sup>k</sup>, θ<sub>2</sub><sup>k</sup>), calculating the maxi-
mum number of intersections located in the admissible do-
main Ω and their positions. If this set of intersections has
more than N<sub>max</sub> elements and if all intersections are D<sub>min</sub>

apart from each other, this set of intersections is stored in
a set of intersections that we denote intersections_sets. The
corresponding algorithm is written in pseudo-code in Algo-
rithm A5.

4.4 Optimize turbines placement

4.4.1 Greedy initialization

Given a grid configuration (r₁, r₂, θ₁, θ₂, Δ₁, Δ₂), a greedy algorithm is used to sequentially place Nmax turbines on the admissible intersections. This algorithm consists of sequentially placing the turbines on the best possible empty intersection, in the sense of AEP maximization, until Nmax turbines are placed. The corresponding algorithm in pseudo-code is given in Algorithm A6.

4.4.2 Local search

This part of the algorithm sequentially moves each turbine in random order from its current intersection to a free one if it provides a strict increase in AEP. The algorithm stops when a complete course of all the turbines has been made without a single one being moved. When the number of intersections in the admissible domain is much bigger than Nmax, one can explore a subset of the free intersections. For example, one can explore the *p* closest intersections from the turbine to be moved or select *p* random free intersections. In this case, the size of the subset to explore and its definition, *p*, are user-defined parameters. The algorithm in pseudo-code is given in Algorithm A7.

4.4.3 Turbine placement optimization

Finally, given a set of intersections, the optimization algo-
rithm for optimal turbine placement consists of using sequen-
tially the greedy initialization and the local-search algorithm
as described in pseudo-code in Algorithm A9.

5 Numerical examples

5.1 Problem presentation

For this numerical example, we use the same case study as
in Thomas et al. (2023), whose data are available in Baker
et al. (2021). The windrose corresponding to this case study
is displayed in Fig. 2. This case study was created within the
International Energy Association (IEA) Wind Task 37, and it
is based on the Borssele III and IV wind farms. Of particular
interest in this case study is the presence of five disconnected
boundary regions and concave boundary features. The tur-
bines are 10 MW machines with 198 m rotor diameters based
on the IEA 10 MW reference wind turbine (Bortolotti et al.,
2019). For the AEP computation, we also use the same al-
gorithm as in Thomas et al. (2023). This method is based
on a simple Gaussian wake model based on Bastankhah's
<figure><img src="image_4.png" /><figcaption>**Figure 2.** This figure, reproduced from Thomas et al. (2023), displays the full wind resource used for evaluating the final wind farm layouts. (a) The wind direction probability (360 bins). (b) A representative wind speed probability distribution (20 bins).</figcaption></figure>

Gaussian wake model (Bastankhah and Porté-Agel, 2016) and presented in the IEA case study 3 and 4 announcement documents (Baker et al., 2021) to calculate wind speeds at each turbine in the wind farm. However, any other AEP computation software, such as FLORIS (2023), can be used with the presented algorithm as long as the computation time of the AEP is fast enough. Indeed, our optimization algorithm requires a large number of AEP evaluations. Finally, the AEP is computed using a windrose discretized as follows.

$$ \text{wind direction bins} = \{0, 1, \dots, 359\} $$

$$ \text{wind speed bins} = \{0.90, 1.98, 3.18, 4.40, 5.64, 6.87, 8.11, 9.35, 10.59, 11.83, 13.07, 14.31, 15.56, 16.80, 18.04, 19.28, 20.52, 21.77, 23.01, 24.25\} $$

## 5.2 Influence of the hyper-parameters on the AEP and the computation time

The optimization procedure described in Sect. 4 requires setting 5 hyper-parameters: $D_{min}$, $D_{max}$, $\Delta\theta$, $N_{\theta}$, and $\Delta r$. The turbine's manufacturer usually sets $D_{min}$ at a fixed value. In this example, we set $D_{min} = 2D_{turb}$. The parameter $D_{max}$ must be chosen large enough to allow a good exploration range for the grid parameters ($r_1, r_2$). However, setting $D_{max}$ with a significant value generates grids with a number of admissible intersections smaller than the number of turbines to be placed, i.e., in generating non-admissible layouts. Therefore, we have set $D_{max} = 6D_{turb}$. The parameter $\Delta\theta$ should be chosen to the minimal value such that the wake model used to compute the AEP is valid. For this example, we set $\Delta\theta = 1^{\circ}$. The remaining hyper-parameters, $N_{\theta}$ and $\Delta r$, dramatically affect the optimization procedure regarding AEP value and computation time. Indeed, as explained in Sect. 4.2, the larger $N_{\theta}$, the larger the reduced angle set denoted $\Theta$, and the smaller $\Delta r$, the larger the set $R_{1,2}$. The number of configurations to optimize being the product of

<table><caption>**Table 1.** Value set of each hyper-parameter.</caption><thead><tr><th>D<sub>min</sub></th><th>D<sub>max</sub></th><th>Δθ</th><th>N<sub>θ</sub></th><th>Δr</th></tr></thead><tbody><tr><td>{2 D<sub>turb</sub>}</td><td>{6 D<sub>turb</sub>}</td><td>{1°}</td><td>{1, 5, 10}</td><td>{D<sub>turb</sub>/2, D<sub>turb</sub>, 2 D<sub>turb</sub>}</td></tr></tbody></table>

the cardinal of the sets $\Theta$ and $R_{1,2}$, the larger these sets, the longer the computation time. However, the more configuration to optimize, the greater the AEP. Therefore, any layout optimization needs to make a trade-off between computation time and size of the set of configuration to optimize. In this section, we will show the effect of the parameters $N_{\theta}$ and $\Delta r$ on the optimal AEP and the computation time and give the user some guidelines to set these parameters. To do so, we run Algorithm 1 for all possible configurations of the hyper-parameters valued in their respective value set given in Table 1 for wind farm sizes of 81, 100, 150, and 250 turbines respectively. The numerical results of these optimizations are gathered in Table 2 and illustrated in Figs. 3 and 4. In Fig. 3, one can see that the expected power per turbine<fnref n="1" /> is growing with respect to $N_{\theta}$ and decreasing with respect to $\Delta r$. Also, when $N_{\theta} \ge 5$ and $\Delta r \le 1D_{turb}$, the expected powers per turbine are similar whatever the value of these hyper-parameters. However, as illustrated in Fig. 4, the execution time is strongly increasing with respect to $N_{\theta}$ and strongly decreasing with respect to $\Delta r$. Therefore, if Algorithm 1 is run using an AEP computation method more precise and computationally more expensive than the one we used (see Baker et al., 2021; Thomas et al., 2023), keeping $N_{\theta}$ reasonably small ($\approx 5$) and $\Delta r$ reasonably large ($\approx 1$) should enable the solving algorithm to find a well-performing layout in a reasonable execution time. In addition, as illustrated in Table 1, the solving algorithm often sets the optimal shape parameters ($r_1, r_2$) to their minimal authorized values. This behavior indicates that the method generates grids with many intersections and, thus, a large degree of freedom for the local-search part of the algorithm. The larger the degree of freedom for the local-search algorithm, the better the solution. The best layout for each wind farm size is displayed in Fig. 5, and the optimal parameters ($r_1, r_2, \theta_1, \theta_2$), the optimal AEP, the optimal expected power per turbine, and the execution time are displayed in Table 3. The execution time corresponds to the total execution time. However, steps 1 to 3 from Algorithm 1 are always computed in less than 1.5 min (for $\Delta r = 0.5$ and $N_{\theta} = 10$); the majority of the execution time is spent on step 4 of Algorithm 1.

<footnote n="1">¹For a $N_t$-turbine wind farm, the expected power per turbine is given by the formula AEP(MWh)/(8760 × $N_t$) and allows for comparing wind farms of different sizes.</footnote>
<figure><img src="image_5.png" /><figcaption>**Figure 3.** Expected power per turbine for 81-, 100-, 150-, and 250-turbine wind farms, displayed in panels (a), (b), (c), and (d) respectively, as a function of the hyper-parameters $N_\theta$ and $\Delta r$.</figcaption></figure>

<figure><img src="image_6.png" /><figcaption>**Figure 4.** Execution time of Algorithm 1 for 81-, 100-, 150-, and 250-turbine wind farms, displayed in panels (a), (b), (c), and (d) respectively, as a function of the hyper-parameters $N_\theta$ and $\Delta r$. All optimizations were run on a 12th Gen Intel(R) i7-12700H 2.30 GHz core.</figcaption></figure>
<table><caption>**Table 2.** Influence of the hyper-parameters $N_\theta$ and $\Delta r$ on the AEP and Algorithm 1 execution time. All optimizations were run on a 12th Gen Intel(R) i7-12700H 2.30 GHz core.</caption><thead><tr><th>Wind farm size</th><th>Δr</th><th>N<sub>θ</sub></th><th>Optimal shape parameters (r<sub>1</sub>, r<sub>2</sub>, θ<sub>1</sub>, θ<sub>2</sub>)</th><th>AEP (GWh)</th><th>Expected power per turbine (MW)</th><th>Exec. time (s)</th></tr></thead><tbody><tr><td>81</td><td>0.5</td><td>1</td><td>(5.5 D<sub>turb</sub>, 2 D<sub>turb</sub>, 73°, -87°)</td><td>2860.00</td><td>4.031</td><td>4083</td></tr><tr><td>81</td><td>0.5</td><td>5</td><td>(2 D<sub>turb</sub>, 3 D<sub>turb</sub>, 18°, -80°)</td><td>2862.37</td><td>4.034</td><td>9611</td></tr><tr><td>81</td><td>0.5</td><td>10</td><td>(2 D<sub>turb</sub>, 3 D<sub>turb</sub>, 18°, -80°)</td><td>2862.76</td><td>4.035</td><td>15 981</td></tr><tr><td>81</td><td>1</td><td>1</td><td>(2 D<sub>turb</sub>, 6 D<sub>turb</sub>, 90°, 70°)</td><td>2855.62</td><td>4.024</td><td>690</td></tr><tr><td>81</td><td>1</td><td>5</td><td>(2 D<sub>turb</sub>, 3 D<sub>turb</sub>, 18°, -80°)</td><td>2862.29</td><td>4.034</td><td>2343</td></tr><tr><td>81</td><td>1</td><td>10</td><td>(2 D<sub>turb</sub>, 3 D<sub>turb</sub>, 18°, -80°)</td><td>2862.29</td><td>4.034</td><td>3944</td></tr><tr><td>81</td><td>2</td><td>1</td><td>(2 D<sub>turb</sub>, 6 D<sub>turb</sub>, 90°, 70°)</td><td>2856.23</td><td>4.025</td><td>161</td></tr><tr><td>81</td><td>2</td><td>5</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -78°)</td><td>2857.65</td><td>4.027</td><td>399</td></tr><tr><td>81</td><td>2</td><td>10</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -76°)</td><td>2860.44</td><td>4.031</td><td>1211</td></tr><tr><td>100</td><td>0.5</td><td>1</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -78°)</td><td>3354.24</td><td>3.829</td><td>3486</td></tr><tr><td>100</td><td>0.5</td><td>5</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -76°)</td><td>3356.53</td><td>3.832</td><td>9693</td></tr><tr><td>100</td><td>0.5</td><td>10</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -76°)</td><td>3356.55</td><td>3.832</td><td>14 105</td></tr><tr><td>100</td><td>1</td><td>1</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 19°, -78°)</td><td>3348.50</td><td>3.822</td><td>884</td></tr><tr><td>100</td><td>1</td><td>5</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -82°)</td><td>3356.21</td><td>3.831</td><td>2027</td></tr><tr><td>100</td><td>1</td><td>10</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -76°)</td><td>3356.55</td><td>3.832</td><td>5324</td></tr><tr><td>100</td><td>2</td><td>1</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 19°, -78°)</td><td>3348.57</td><td>3.823</td><td>158</td></tr><tr><td>100</td><td>2</td><td>5</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -78°)</td><td>3354.45</td><td>3.829</td><td>746</td></tr><tr><td>100</td><td>2</td><td>10</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -76°)</td><td>3356.54</td><td>3.832</td><td>920</td></tr><tr><td>150</td><td>0.5</td><td>1</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -78°)</td><td>4372.17</td><td>3.327</td><td>3729</td></tr><tr><td>150</td><td>0.5</td><td>5</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -78°)</td><td>4372.71</td><td>3.328</td><td>12 013</td></tr><tr><td>150</td><td>0.5</td><td>10</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -78°)</td><td>4372.71</td><td>3.328</td><td>19 188</td></tr><tr><td>150</td><td>1</td><td>1</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 19°, -78°)</td><td>4357.54</td><td>3.316</td><td>966</td></tr><tr><td>150</td><td>1</td><td>5</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -78°)</td><td>4372.71</td><td>3.328</td><td>4151</td></tr><tr><td>150</td><td>1</td><td>10</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -78°)</td><td>4372.71</td><td>3.328</td><td>4902</td></tr><tr><td>150</td><td>2</td><td>1</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 19°, -78°)</td><td>4357.48</td><td>3.316</td><td>339</td></tr><tr><td>150</td><td>2</td><td>5</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -78°)</td><td>4372.71</td><td>3.328</td><td>858</td></tr><tr><td>150</td><td>2</td><td>10</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -78°)</td><td>4372.71</td><td>3.328</td><td>2084</td></tr><tr><td>250</td><td>0.5</td><td>1</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 90°, 14°)</td><td>5241.50</td><td>2.393</td><td>462</td></tr><tr><td>250</td><td>0.5</td><td>5</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 90°, 14°)</td><td>5241.50</td><td>2.393</td><td>1203</td></tr><tr><td>250</td><td>0.5</td><td>10</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 90°, 14°)</td><td>5241.50</td><td>2.393</td><td>1789</td></tr><tr><td>250</td><td>1</td><td>1</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 90°, 27°)</td><td>5202.29</td><td>2.375</td><td>262</td></tr><tr><td>250</td><td>1</td><td>5</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 90°, 14°)</td><td>5241.50</td><td>2.393</td><td>555</td></tr><tr><td>250</td><td>1</td><td>10</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 90°, 14°)</td><td>5241.50</td><td>2.393</td><td>925</td></tr><tr><td>250</td><td>2</td><td>1</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 90°, 19°)</td><td>5150.62</td><td>2.352</td><td>100</td></tr><tr><td>250</td><td>2</td><td>5</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 90°, 18°)</td><td>5223.08</td><td>2.385</td><td>205</td></tr><tr><td>250</td><td>2</td><td>10</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 90°, 18°)</td><td>5223.08</td><td>2.385</td><td>293</td></tr></tbody></table>

<table><caption>**Table 3.** Optimal AEP, shape configuration, and mean power per turbine for an increasing number of turbines.</caption><thead><tr><th>Number of turbines</th><th>AEP (GWh)</th><th>Optimal shape parameters (r<sub>1</sub>, r<sub>2</sub>, θ<sub>1</sub>, θ<sub>2</sub>)</th><th>Expected power per turbine</th><th>% wake losses</th></tr></thead><tbody><tr><td>1</td><td>42.55</td><td>—</td><td>4.86 MW</td><td>0</td></tr><tr><td>81</td><td>2862.76</td><td>(2 D<sub>turb</sub>, 3 D<sub>turb</sub>, 18°, -80°)</td><td>4.03 MW</td><td>17.1%</td></tr><tr><td>100</td><td>3356.55</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -76°)</td><td>3.83 MW</td><td>21.2%</td></tr><tr><td>150</td><td>4372.71</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 18°, -78°)</td><td>3.33 MW</td><td>31.5%</td></tr><tr><td>250</td><td>5241.50</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 90°, 14°)</td><td>2.39 MW</td><td>50.8%</td></tr></tbody></table>

## 6 Exploration method's impact on the AEP

The optimization layout algorithm presented in this paper relies on the discrete exploration of the space of shape parameters $(r_1, r_2, \theta_1, \theta_2) \in [D_{\min}, D_{\max}]^2 \times [-\pi/2, \pi/2]^2$. De-

spite the angles' search space reduction technique presented in Sect. 4.2 and Algorithm A2, exploring this space using fine discretization is numerically too demanding since it requires running step 4 of Algorithm 1 for a number of shape
<figure><img src="image_7.png" /><figcaption>**Figure 5.** Best layouts for wind farm sizes of 81, 100, 150, and 250 turbines, displayed in panels (a), (b), (c), and (d) respectively, using Algorithm 1.</figcaption></figure>

<caption>**Figure 6.** Best layouts for wind farm sizes of 81, 100, 150, and 250 turbines, displayed in panels (a), (b), (c), and (d) respectively, using an efficient shape parameter exploration method and the same local-search algorithm.</caption>

parameters too large for a reasonable running time. Unfortunately, the performance of the optimization depends on the capacity to tune the shape parameters finely. Achieving such a fine-tuning with Algorithm 1 requires using a small shape-parameter space discretization step. Therefore, there is a strong incentive to develop heuristic methods to explore the shape parameters' space other than by using the angle search space reduction associated with a brute-force-like exploration method. Indeed, using more efficient shape-parameter-space exploration methods allows for a good trade-off between a fine-tuning of these parameters and a reasonable computation time. In this section, we present optimization results using such a heuristic to provide a benchmark for an aligned optimization algorithm. Unfortunately, for industrial confidentiality reasons, we do not describe its principle and only focus on the improvement in terms of AEP. Again, we have run the optimization procedure for wind farms of 81, 100, 150, and 250 turbines. The results in terms of optimal shape parameters, AEP, expected power per turbine, and wake losses are summarized in Table 4, and the optimal layouts are displayed in Fig. 6. The optimal layout obtained using this heuristic exhibits the same behavior as those found in the previous section regarding $r_1$ and $r_2$. Indeed, these parameters are systemically found to be equal to the lowest possible value. In contrast, the optimal angles are not the same. One of the alignment directions is conserved ($\approx 18^\circ$), but the other one is quite different even when taking into account the

$180^\circ$ periodicity of the angles. Concerning the AEP, using a heuristic to explore the space of shape parameters more efficiently allows for improvement. Interestingly, as illustrated in Fig. 7 and in the last column of Table 4, the percentage of AEP increase grows almost linearly concerning the wind farm size and reaches 1% for the larger one. This behavior stems from the decreasing degrees of freedom in the turbine's optimal placing problem as the wind farm size grows. Therefore, for larger farms, the efficiency of the shape parameters' optimization algorithm is of greater importance than for smaller farms; thus, there is a more substantial improvement in AEP for large farms when using a better exploration algorithm for the space of shape parameters. These results prove to be a strong incentive to develop efficient heuristics to explore the space of shape parameters.

## 7 Conclusions

This work tackles the wind farm layout optimization problem with alignment constraints. We introduced a model of the corresponding optimization problem and adapted the DEBO algorithm from Thomas et al. (2023) to this new problem. The proposed method is based on an exploration heuristic for computing the grid parameters and a local-search method to place the turbines on the grid's intersections optimally. We have shown that this method performs well on the bench-
<table><caption>**Table 4.** Optimal AEP, shape configuration, and mean power per turbine for an increasing number of turbines using a fast heuristic for the optimization of the shape's parameters.</caption><thead><tr><th>Number of turbines</th><th>AEP (GWh)</th><th>Optimal shape parameters (r<sub>1</sub>, r<sub>2</sub>, θ<sub>1</sub>, θ<sub>2</sub>)</th><th>Expected power per turbine</th><th>% wake losses</th><th>% AEP increase w.r.t. Table 2</th></tr></thead><tbody><tr><td>1</td><td>42.550</td><td>—</td><td>4.86 MW</td><td>0</td><td>0</td></tr><tr><td>81</td><td>2866.697</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 88.6°, 17.9°)</td><td>4.04 MW</td><td>16.8%</td><td>0.14%</td></tr><tr><td>100</td><td>3369.709</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 88.5°, 17.9°)</td><td>3.85 MW</td><td>20.8%</td><td>0.39%</td></tr><tr><td>150</td><td>4399.174</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 88.8°, 17.78°)</td><td>3.35 MW</td><td>31.1%</td><td>0.61%</td></tr><tr><td>250</td><td>5308.184</td><td>(2 D<sub>turb</sub>, 2 D<sub>turb</sub>, 87.0°, 17.4°)</td><td>2.42 MW</td><td>50.1%</td><td>1.27%</td></tr></tbody></table>

<figure><img src="image_8.png" /><figcaption>**Figure 7.** Percentage of AEP increase when using an efficient shape-parameter-space exploration method compared to the brute force discretization from Algorithm 1.</figcaption></figure>

mark of IEA Wind Task 37 (Thomas, 2022) since it produced an AEP increase of 0.41% compared to the baseline layout, even though the latter does not satisfy any alignment constraints and is potentially less prone to significant wake losses. Using this numerical example, we have also demonstrated the benefits of developing efficient heuristics for exploring the grid parameters. Indeed, using efficient heuristics allows for a better trade-off between wake-loss reduction and computation time. Therefore, these heuristics can be used to find layouts with higher AEP or to use more precise and computationally demanding AEP models. A more efficient algorithm can enable the introduction of other optimization parameters or constraints, such as cable routing or shared mooring for floating farms. Otherwise, to quantify the effect of alignment constraints on the wake losses, one could perform a sensitivity analysis by allowing small displacements of each turbine, resulting in an almost aligned layout. Finally, future works can also investigate the robustness of the optimal layout with respect to the wind probability measure $P_W := \sum_{n=1}^{N_W} p(w_s^n, w_d^n)\delta(w_s^n, w_d^n)$. The sensitivity of the AEP with respect to the wind probability is easy to estimate if the support of the probability is unchanged, i.e., if the modified probability $\hat{P}_W$ is $\hat{P}_W := \sum_{n=1}^{N_W} [p(w_s^n, w_d^n) + \Delta p(w_s^n, w_d^n)]\delta(w_s^n, w_d^n)$, with

$$ \sum \Delta p(w_s^n, w_d^n) = 0. \text{ In this case we have} $$

$$ \Delta \text{AEP}(\mathbf{F}_n) := 8760 \sum_{n=1}^{N_W} \mathcal{P}(\mathbf{F}_n, w_s^n, w_d^n) \Delta p(w_s^n, w_d^n). $$

However, when the probability's support is also varying, computations are much more involved, and future works could focus on using distributionally robust optimization methods (see Rahimian and Mehrotra, 2022, for a review on the subject) to produce robust layouts with respect to the wind probability measure.

## Appendix A: Algorithms in pseudo-code

**Algorithm A1** GenerateR1R2($\Delta r$, $D_{min}$, $D_{max}$).

1: $R_{1,2} \leftarrow \emptyset$

2: $r_1 \leftarrow D_{min} \cdot D_{turb}$

3: angles $\leftarrow \emptyset$

4: **while** $r_1 \le D_{max} \cdot D_{turb}$ **do**

5: $r_2 \leftarrow D_{min} \cdot D_{turb}$

6: **while** $r_2 \le D_{max} \cdot D_{turb}$ **do**

7: $R_{1,2} \leftarrow R_{1,2} \cup \{r_1, r_2\}$

8: $r_2 \leftarrow r_2 + \Delta r$

9: **end while**

10: $r_1 \leftarrow r_1 + \Delta r$

11: **end while**

12: **return** $R_{1,2}$

**Algorithm A2** ReduceSearchSpace($R_{1,2}$, $\Delta\theta$, $D_{min}$, $D_{max}$, $D_{turb}$, $N_{\theta}$).

1: $\Theta \leftarrow \emptyset$

2: **for** ($r_1, r_2) \in R_{1,2}$ **do**

3: $\Theta_{r_1, r_2} \leftarrow \text{GetBestAngles}(r_1, r_2, \Delta\theta, D_{min}, D_{max}, D_{turb}, N_{\theta})$

4: $\Theta \leftarrow \Theta \cup \Theta_{r_1, r_2}$

5: **end for**

6: **return** $\Theta$
**Algorithm A3 GetBestAngles(r₁, r₂, Δθ, Dmin, Dmax, Dturb, Nθ).**

1: farms ← ∅
2: $\Theta_{r_1,r_2} \leftarrow \emptyset$
3: $\theta_1 \leftarrow -\frac{\pi}{2} + \Delta\theta$
4: **while** $\theta_1 \le \frac{\pi}{2}$ **do**
5:     $\theta_2 \leftarrow -\frac{\pi}{2}$
6:     **while** $\theta_2 \le \theta_1 - \Delta\theta$ **do**
7:         $D_{\text{grid}} \leftarrow \min_{z \in \mathbb{Z}_*^2} \| P_{B_0}^{\mathcal{B}(\theta_1, \theta_2, r_1, r_2)} z \|$ \\
8:         **if** ($D_{\text{grid}} \ge D_{\min} \cdot D_{\text{turb}}$) $\land$ ($\theta_1 - \theta_2 \le \pi - \Delta\theta$) **then**
9:             $n \leftarrow 1$
10:         **for** $i = 0$ **to** $i = 1$ **do**
11:             **for** $j = 0$ **to** $j = 1$ **do**
12:                 $\mathbf{F}_4(n) \leftarrow P_{B_0}^{\mathcal{B}(\theta_1, \theta_2, r_1, r_2)} \begin{pmatrix} i \\ j \end{pmatrix}$
13:                 $n \leftarrow n + 1$
14:             **end for**
15:         **end for**
16:     aep ← $\mathbb{E}_W [\mathcal{P}(\mathbf{F}_4, w_s, w_d)]$
17:     farms ← farms $\cup \{(\theta_1, \theta_2, \text{aep})\}$
18: **end if**
19:     $\theta_2 \leftarrow \theta_2 + \Delta\theta$
20: **end while**
21:     $\theta_1 \leftarrow \theta_1 + \Delta\theta$
22: **end while**
23: **sort**($\text{farms}$) **by** decreasing order of aep}
24: **for** $i = 1$ **to** $i = N_\theta$ **do**
25:     $\Theta_{r_1,r_2} \leftarrow \Theta_{r_1,r_2} \cup \{(\text{farms}(i).\theta_1, \text{farms}(i).\theta_2)\}$
26: **end for**
27: **return** $\Theta_{r_1,r_2}$

**Algorithm A4 GenerateConfigs(R₁,₂, Θ, Dmin, Dmax, Dturb).**

1: grids ← ∅
2: **for** ($r_1, r_2) \in R_{1,2}$ **do**
3:     **for** ($\theta_1, \theta_2) \in \Theta$ **do**
4:         $D_{\text{grid}} \leftarrow \min_{z \in \mathbb{Z}_*^2} \| P_{B_0}^{\mathcal{B}(\theta_1, \theta_2, r_1, r_2)} z \|$ \\
5:         **if** $\min_{z \in \mathbb{Z}_*^2} \| P_{B_0}^{\mathcal{B}(\theta_1, \theta_2, r_1, r_2)} z \| \ge D_{\min} \cdot D_{\text{turb}}$ **then**
6:             grids ← grids $\cup \{(r_1, r_2, \theta_1, \theta_2)\}$
7:         **end if**
8:     **end for**
9: **end for**
10: **return** grids

**Algorithm A5 ComputeAllIntersections(grids, Dmin, Ω).**

1: intersections_sets ← {$\emptyset$}
2: $n \leftarrow 1$
3: **while** $n \le \text{card}(\text{grids})$ **do**
4:     {Compute basic shape vector}
5:     $r_1, r_2, \theta_1, \theta_2 \leftarrow \text{grids}(n)$
6:     $v_1 \leftarrow (r_1 \cos(\theta_1), r_1 \sin(\theta_1))$
7:     $v_2 \leftarrow (r_2 \cos(\theta_2), r_2 \sin(\theta_2))$
8:     {Function of the intersections}
9:     $I_{v_1, v_2}(\Delta_1, \Delta_2) := \{k_1 v_1 + k_2 v_2 \in \mathbb{Z}^2 \text{ s.t. } [k_1 v_1 + k_2 v_2 + (\Delta_1, \Delta_2)] \in \Omega; (k_1, k_2) \in \mathbb{Z}^2\}$
10:    {Compute offset maximising the number of admissible intersections}
11:    $(\Delta_1^*, \Delta_2^*) \leftarrow \text{argmax}_{\Delta_1, \Delta_2 \in \{0,1\}^2} \text{card}(I_{v_1, v_2}(\Delta_1, \Delta_2))$
12:    {Add intersections to the set of intersections}
13:    **if** $\text{card}(I_{v_1, v_2}(\Delta_1^*, \Delta_2^*)) \ge N_{\max}$ **then**
14:        intersections_sets ← $\{(I_{v_1, v_2}(\Delta_1^*, \Delta_2^*), (r_1, r_2, \theta_1, \theta_2))\} \cup \text{intersections_sets}$
15:    **end if**
16:    $n \leftarrow n + 1$
17:    **end while**
18:    **return** intersections_sets

**Algorithm A6 GreedyInitialization(intersections).**

1: $(x_0, y_0) \leftarrow \text{argmax}_{x,y}\{x - \text{ys.t.}(x, y) \in \text{intersections}\}$
2: $\mathbf{F}_1(1) \leftarrow (x_0, y_0)$
3: $n_t \leftarrow 1$
4: intersections $\leftarrow \text{intersections} \setminus \{(x_0, y_0)\}$
5: **while** $n_t < N_{\max}$ **do**
6:     $(x^*, y^*)^\top \leftarrow \text{argmax}_{(x,y) \in \text{intersections}} \mathbb{E}_W \{\mathcal{P}(\mathbf{F}_{n_t} \oplus (x^*, y), w_s, w_d)\}$
7:     $\mathbf{F}_{n_t+1} \leftarrow \mathbf{F}_{n_t} \oplus (x^*, y^*)$
8:     $n_t \leftarrow n_t + 1$
9:     intersections $\leftarrow$ intersections $\setminus \{(x^*, y^*)\}$
10:    **end while**
11:    **return** $\mathbf{F}_{N_{\max}}$
**Algorithm A7 LocalSearch($\mathbf{F}_{N_{\max}}$, intersections).**

1: convergence ← $\perp$
2: aep ← $\mathbb{E}_W\{\mathcal{P}(\mathbf{F}_{N_{\max}}, w_s, w_d)\}$
3: **while** $\neg$ convergence **do**
4:     $\mathbf{H}_{N_{\max}}$ ← $\mathbf{F}_{N_{\max}}$
5:     random_indices ← shuffle($\llbracket 0, \dots, N_{\max} \rrbracket$)
6:     **for** indice $\in$ random_indices **do**
7:         {compute all possible layouts by moving $i$th turbine}
8:         children_layout ← generate_children($\mathbf{F}_{N_{\max}}$, indice, intersections)
9:         **for** ($\mathbf{G}_{N_{\max}}$, intersections$_G$) $\in$ children_layout **do**
10:        if $\mathbb{E}_W\{\mathcal{P}(\mathbf{G}_{N_{\max}}, w_s, w_d)\} >$ aep **then**
11:         $\mathbf{F}_{N_{\max}}$ ← $\mathbf{G}_{N_{\max}}$
12:         aep ← $\mathbb{E}_W\{\mathcal{P}(\mathbf{F}_{N_{\max}}, w_s, w_d)\}$
13:         intersections ← intersections$_G$
14:     **end if**
15:     **end for**
16:     **end for**
17:     convergence ← $\mathbf{F}_{N_{\max}} = \mathbf{H}_{N_{\max}}$
18:     **end while**
19:     **return** ($\mathbf{F}_{N_{\max}}$, aep)

**Algorithm A8 generate_children($\mathbf{F}_{N_{\max}}$, indice, intersections).**

1: children_layout ← $\emptyset$
2: **for** $(x, y) \in$ intersections **do**
3:     $\mathbf{G}_{N_{\max}}$ ← $\mathbf{F}_{N_{\max}}$
4:     intersection$_G$ ← intersections
5:     $(x_{new}, y_{new})$ ← $\mathbf{G}_{N_{\max}}$ (indice)
6:     $\mathbf{G}_{N_{\max}}$ (indice) ← $(x, y)$
7:     intersections$_G$ ← intersections$_G \setminus \{(x, y)\} \cup \{(x_{new}, y_{new})\}$
8:     children_layout ← children_layout $\cup$ $\{(\mathbf{G}_{N_{\max}}, \text{intersections}_G)\}$
9:     **end for**
10:    **return** children_layout

**Algorithm A9 PlaceTurbines(intersections).**

1: $\mathbf{F}_{N_{\max}}$ ← GreedyInitialization(intersections)
2: ($\mathbf{F}_{N_{\max}}$, aep) ← LocalSearch($\mathbf{F}_{N_{\max}}$, intersections)
3: **return** ($\mathbf{F}_{N_{\max}}$, aep)

**Data availability.** Provided physics model, turbine, and boundary data are available from Thomas (2022) (https://doi.org/10.5281/zenodo.7125349), and optimal layouts, AEPs, shape configurations, and intersections are available from Malisani (2024) (https://doi.org/10.5281/zenodo.13122308).

**Author contributions.** PM conceived and developed the methodology and drafted the manuscript. TB contributed to code development and implementation. PB critically revised the manuscript and

provided conceptual input and feedback informed by multiple real-world case studies.

**Competing interests.** The contact author has declared that none of the authors has any competing interests.

**Information.** The method described in this publication is the subject of the international patent application number WO 2024/061627.

**Disclaimer.** Publisher's note: Copernicus Publications remains neutral with regard to jurisdictional claims made in the text, published maps, institutional affiliations, or any other geographical representation in this paper. While Copernicus Publications makes every effort to include appropriate place names, the final responsibility lies with the authors.

**Review statement.** This paper was edited by Emmanuel Branlard and reviewed by three anonymous referees.

**References**

Baker, N. F., Thomas, J. J., Stanley, A. P. J., and Ning, A.: EA Task 37 Wind Farm Layout Optimization Case Studies, Zenodo [data set] and [code], https://doi.org/10.5281/zenodo.5809681, 2021.

Bastankhah, M. and Porté-Agel, F.: Experimental and theoretical study of wind turbine wakes in yawed conditions, J. Fluid Mech., 806, 506–541, https://doi.org/10.1017/jfm.2016.595, 2016.

Bortolotti, P., Tarres, H. C., Dykes, K. L., Merz, K., Sethuraman, L., Verelst, D., and Zahle, F.: IEA Wind TCP Task 37: Systems Engineering in Wind Energy – WP2.1 Reference Wind Turbines, Tech. rep., https://doi.org/10.2172/1529216, 2019.

Burer, S. and Letchford, A.: Non-convex mixed-integer nonlinear programming: A survey, Surveys in Operations Research and Management Science, 17, 97–106, 2012.

Exler, O., Antelo, L., Egea, J., Alonso, A., and Banga, J.: A tabu search-based algorithm for mixed-integer nonlinear problems and its application to integrated process and control system design, Computers and Chemical Engineering, 32, 1877–1891, 2008.

Fischetti, M. and Fischetti, M.: Integrated Layout and Cable Routing in Wind Farm Optimal Design, Manage. Sci., 69, 2147–2164, 2022.

Fischetti, M. and Pisinger, D.: Mathematical Optimization and Algorithms for Offshore Wind Farm Design: An Overview, Bus. Inf. Syst. Eng., 61, 469–485, 2019.

FLORIS: NREL 2023, Version 3.4.1., GitHub [code], https://github.com/NREL/floris (last access: 7 August 2025), 2023.

Herbert-Acero, J., Probst, O., Rethore, P., Larsen, G., and Castillo-Villar, K.: A Review of Methodological Approaches for the Design and Optimization of Wind Farms, Energies, 7, 6930–7016, https://doi.org/10.3390/en7116930, 2014.
Hou, P., Zhu, J., Ma, K., Yang, G., Hu, W., and Chen, Z.: A review of offshore wind farm layout optimization and electrical system design methods, J. Mod. Power Syst. Cle., 7, 975–986, 2019.

Kumar, M. and Sharma, A.: Wind Farm Layout Optimization Problem Using Teaching-Learning-Based Optimization Algorithm, in: Communication and Intelligent Systems, edited by: Sharma, H., Shrivastava, V., Bharti, K. K., and Wang, L., Springer Nature Singapore, Singapore, 151–170, ISBN 978-981-99-2322-9, 2023.

Kunakote, T., Sabangban, N., Kumar, S., Tejani, G. G., Pana-gant, N., Pholdee, N., Bureerat, S., and Yildiz, A. R.: Comparative Performance of Twelve Metaheuristics for Wind Farm Layout Optimisation, Arch. Comput. Meth. E., 29, 717–730, https://doi.org/10.1007/s11831-021-09586-7, 2022.

Liang, Z. and Liu, H.: Layout Optimization Algorithms for the Offshore Wind Farm with Different Densities Using a Full-Field Wake Model, Energies, 16, 5916, https://doi.org/10.3390/en16165916, 2023.

Liberti, L., Mladenović, N., and Nannicini, G.: A recipe for finding good solutions to MINLPs, Mathematical Programming Computation, 3, 349–390, 2011.

LoCascio, M. J., Bay, C. J., Martinez-Tossas, L. A., Bastankhah, M., and Gorlé, C.: FLOWERS AEP: An Analytical Model for Wind Farm Layout Optimization, Wind Energy, 27, 1563–1580, https://doi.org/10.1002/we.2954, 2024.

Malisani, P.: Data for Wind farm layout optimization with alignment constraints: Initial release, Zenodo [data set], https://doi.org/10.5281/zenodo.13122308, 2024.

Maritime and Coastguard Agency: Offshore renewable energy installations: impact on shipping, https://www.gov.uk/guidance/offshore-renewable-energy-installations-impact-on-shipping (last access: 7 August 2025), 2012.

Ministry of Transport of the French Republic: Note technique du 28 juillet 2017 établissant les principes permettant d'assurer l'organisation des usages maritimes et leur sécurité dans et aux abords immédiats d'un champ éolien en mer, https://eolmernormandie.debatpublic.fr/images/documents/dmo/biblio/cir_42526.pdf (last access: 7 August 2025), 2017.

Papadimitriou, C. and Steiglitz, K.: Combinatorial optimization, algorithms and complexity, Dover, ISBN 10 0486402584, 1998.

Porté-Agel, F., Bastankhah, M., and Shamsoddin, S.: Wind-Turbine and Wind-Farm Flows: A Review, Bound.-Lay. Meteorol., 174, 1–59, 2020.

Quick, J., Rethore, P.-E., Mølgaard Pedersen, M., Rodrigues, R. V., and Friis-Møller, M.: Stochastic gradient descent for wind farm optimization, Wind Energ. Sci., 8, 1235–1250, https://doi.org/10.5194/wes-8-1235-2023, 2023.

Rahimian, H. and Mehrotra, S.: Frameworks and Results in Distributionally Robust Optimization, Open Journal of Mathematical Optimization, 3, 4, https://doi.org/10.5802/ojmo.15, 2022.

Schlüter, M., Egea, J. A., and Banga, J. R.: Extended ant colony optimization for non-convex mixed integer nonlinear programming, Comput. Oper. Res., 36, 2217–2229, 2009.

tanley, A. P. J. and Ning, A.: Massive simplification of the wind farm layout optimization problem, Wind Energ. Sci., 4, 663–676, https://doi.org/10.5194/wes-4-663-2019, 2019.

Thomas, J. J.: jaredthomas68/thomas2022-8-opt-algs-wflop: Initial release, Zenodo [data set], https://doi.org/10.5281/zenodo.7125349, 2022.

Thomas, J. J., Baker, N. F., Malisani, P., Quaeghebeur, E., Sanchez Perez-Moreno, S., Jasa, J., Bay, C., Tilli, F., Bieniek, D., Robinson, N., Stanley, A. P. J., Holt, W., and Ning, A.: A comparison of eight optimization methods applied to a wind farm layout optimization problem, Wind Energ. Sci., 8, 865–891, https://doi.org/10.5194/wes-8-865-2023, 2023.

Yiqing, L., Xigang, Y., and Yongjian, L.: An improved PSO algorithm for solving non-convex NLP/MINLP problems with equality constraints, Comput. Chem. Eng., 31, 153–162, 2007.

Young, C.-T., Zheng, Y., Yeh, C.-W., and Jang, S.-S.: Information-guided genetic algorithm approach to the solution of MINLP problems, Ind. Eng. Chem. Res., 46, 1527–1537, 2007.