OptiWindNet Documentation¶
OptiWindNet = Optimize Windfarm Network
(distributed under the MIT License)
Python Package Index (PyPI) |
|
Source code repository |
|
Issue tracker |
|
Jupyter notebooks used in this manual |
https://gitlab.windenergy.dtu.dk/TOPFARM/OptiWindNet/-/tree/main/docs/notebooks |
About OptiWindNet¶
OptiWindNet is an electrical network design tool for offshore wind farms developed at the Technical University of Denmark – DTU. The package offers a framework to obtain optimal or near-optimal cable routes for a given turbine layout within the cable-laying boundaries. It provides high-level access to heuristic, meta-heuristic and mathematical optimization approaches to the problem.
The tool is distributed as an open-source Python package that is suitable for use within an interactive Python session (e.g. Jupyter notebook). Alternatively, OptiWindNet’s API can be invoked directly from another application.
What can OptiWindNet do?¶
Optimize the network of array cables;
Route the cables so as to avoid crossings;
Assign cable types and calculate network costs;
Use different optimization approaches according to the preferred time/quality trade-off;
Employ user-provided models and objective functions within the mathematical optimization approach.
Getting Started¶
Setup your Python environment and check the Quickstart to begin using OptiWindNet.
How to Cite¶
A peer-reviewed scientific article explaining the OptiWindNet framework and benchmarking it against state-of-the-art methods is available (open-access) at:
Mauricio Souza de Alencar, Tuhfe Göçmen, Nicolaos A. Cutululis, Flexible cable routing framework for wind farm collection system optimization, European Journal of Operational Research, 2025, ISSN 0377-2217, https://doi.org/10.1016/j.ejor.2025.07.069.
@article{
SOUZADEALENCAR2025,
title = {Flexible cable routing framework for wind farm collection system optimization},
journal = {European Journal of Operational Research},
year = {2025},
issn = {0377-2217},
doi = {https://doi.org/10.1016/j.ejor.2025.07.069},
url = {https://www.sciencedirect.com/science/article/pii/S0377221725005946},
author = {Mauricio {Souza de Alencar} and Tuhfe Göçmen and Nicolaos A. Cutululis},
keywords = {Combinatorial optimization, Network design, Collection system, Wind farm},
}
The OptiWindNet software package can be cited through OptiWindNet’s Zenodo DOI. Check the bottom right of that page for multiple ready-to-use citation formats for the latest OptiWindNet version. Below how it looks like for a specific version:
Souza de Alencar, M., Arasteh, A., & Friis-Møller, M. (2026). DTUWindEnergy/OptiWindNet v0.1.6. Zenodo. https://doi.org/10.5281/zenodo.18412871
@software{souza_de_alencar_2026_18412871,
author = {Souza de Alencar, Mauricio and
Arasteh, Amir and
Friis-Møller, Mikkel},
title = {DTUWindEnergy/OptiWindNet: OptiWindNet v0.1.6},
month = jan,
year = 2026,
publisher = {Zenodo},
version = {v0.1.6},
doi = {10.5281/zenodo.18412871},
url = {https://doi.org/10.5281/zenodo.18412871},
swhid = {swh:1:dir:4a878e11de821bf286be35b57f0be04a1f7d6c18
;origin=https://doi.org/10.5281/zenodo.18388438;vi
sit=swh:1:snp:856057cac93c99089b0b234b52ca94669fb4
ae21;anchor=swh:1:rel:d4f37fc1764e2aa218b3d46d742c
36153118d373;path=DTUWindEnergy-OptiWindNet-
ebc8e37
},
}
- Setup
- 🚀 Quick Start
- Network/Router vs Advanced API
- Network/Router API
- Basic usage
- Inputting Data
- WindFarmNetwork/Router
- Load Location Data Repositories
- Plotting
- Debugging
- Borders, Obstacles & Buffering
- Gradient
- ModelOptions vs SolverOptions
- A Large and Complex Wind Farm
- IEA Wind Task 55
- Router examples
- Topfarm integration
- Basic usage
- Advanced API
- Overview
- Quickstart
- Data Input
- Included locations
- Example – Taylor 2023
- Example – IEA Wind 740-10-MW
- Plotting
- Hybrid Genetic Search meta-heuristic example
- Esau-Williams Presolver example
- Crossing-Preventing Esau-Williams (CPEW) example
- Obstacle-Bypassing Esau-Williams (OBEW) example
- Non-Branching Esau-Williams (NBEW) example
- Lin-Kernighan-Helsgaun meta-heuristic example
- OR-Tools example
- Gurobi example
- CPLEX example
- HiGHS example
- SCIP example
- CBC example
- Theory
- Paper
- 3.1 Sparsified vs. complete graphs as search space
- 3.2 Comparison with MILP model from literature
- 3.3/4/5 Impact/Comparison/Dealing
- 3.6.1 Yi et at 2019
- 3.6.2 Cazzaro and Pisinger 2022 Fig. 6
- 3.6.2 Cazzaro and Pisinger 2022 G-140 and G-210
- 3.6.3 Taylor et al 2023
- API Reference
- optiwindnet
- Submodules
- optiwindnet.MILP
- optiwindnet.api
- Module Contents
loggerRouterWindFarmNetworkWindFarmNetwork.nameWindFarmNetwork.handleWindFarmNetwork.routerWindFarmNetwork.cablesWindFarmNetwork.verboseWindFarmNetwork.LWindFarmNetwork.polygonWindFarmNetwork.PWindFarmNetwork.AWindFarmNetwork.SWindFarmNetwork.GWindFarmNetwork.buffer_distWindFarmNetwork.cost()WindFarmNetwork.length()WindFarmNetwork.plot_original_vs_buffered()WindFarmNetwork.from_yaml()WindFarmNetwork.from_pbf()WindFarmNetwork.from_windIO()WindFarmNetwork.plot()WindFarmNetwork.plot_location()WindFarmNetwork.plot_available_links()WindFarmNetwork.plot_navigation_mesh()WindFarmNetwork.plot_selected_links()WindFarmNetwork.terse_links()WindFarmNetwork.update_from_terse_links()WindFarmNetwork.get_network()WindFarmNetwork.map_detour_vertex()WindFarmNetwork.merge_obstacles_into_border()WindFarmNetwork.add_buffer()WindFarmNetwork.gradient()WindFarmNetwork.optimize()WindFarmNetwork.solution_info()
EWRouterHGSRouterMILPRouter
- Module Contents
- optiwindnet.augmentation
- optiwindnet.baselines
- optiwindnet.clustering
- optiwindnet.crossings
- optiwindnet.db
- optiwindnet.geometric
- Module Contents
triangle_AR()point_d2line()is_same_side()any_pairs_opposite_edge()rotate()angle_numpy()angle()angle_helpers()angle_oracles_factory()find_edges_bbox_overlaps()is_crossing_numpy()is_crossing_no_bbox()is_crossing()is_bunch_split_by_corner()is_triangle_pair_a_convex_quadrilateral()perimeter()assign_root()get_crossings_map()complete_graph()minimum_spanning_forest()rotation_checkers_factory()rotating_calipers()area_from_polygon_vertices()add_link_blockmap()add_link_cosines()
- Module Contents
- optiwindnet.heuristics
- optiwindnet.importer
- optiwindnet.interarraylib
- Module Contents
assign_cables()describe_G()pathdist()count_diagonals()bfs_subtree_loads()calcload()site_fingerprint()fun_fingerprint()L_from_site()G_from_S()S_from_G()L_from_G()S_from_terse_links()terse_links_from_S()as_obstacle_free()as_single_root()as_normalized()as_rescaled()as_undetoured()as_hooked_to_nearest()as_hooked_to_head()as_stratified_vertices()make_remap()scaffolded()
- Module Contents
- optiwindnet.mesh
- optiwindnet.pathfinding
- Module Contents
PathFinderPathFinder.iterations_limitPathFinder.traversals_limitPathFinder.promising_marginPathFinder.bad_streak_limitPathFinder.iterationsPathFinder.STPathFinder.fnTPathFinder.d2rootsPathFinder.d2rootsRankPathFinder.predetour_lengthPathFinder.branchedPathFinder.hooks2checkPathFinder.num_revisitsPathFinder.adv_counterPathFinder.get_best_path()PathFinder.best_paths_overlay()PathFinder.scaffolded()PathFinder.create_detours()
- Module Contents
- optiwindnet.plotting
- optiwindnet.repair
- optiwindnet.svg
- optiwindnet.synthetic
- optiwindnet.themes
- optiwindnet.version
- Package Contents
- Submodules
- optiwindnet