<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD Journal Publishing DTD v2.3 20070202//EN" "journalpublishing.dtd">
<article article-type="research-article" dtd-version="2.3" xml:lang="EN" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">Front. Control Eng.</journal-id>
<journal-title>Frontiers in Control Engineering</journal-title>
<abbrev-journal-title abbrev-type="pubmed">Front. Control Eng.</abbrev-journal-title>
<issn pub-type="epub">2673-6268</issn>
<publisher>
<publisher-name>Frontiers Media S.A.</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="publisher-id">1645918</article-id>
<article-id pub-id-type="doi">10.3389/fcteg.2025.1645918</article-id>
<article-categories>
<subj-group subj-group-type="heading">
<subject>Control Engineering</subject>
<subj-group>
<subject>Original Research</subject>
</subj-group>
</subj-group>
</article-categories>
<title-group>
<article-title>Conflict-based model predictive control for multi-agent path finding experimentally validated on a magnetic planar drive system</article-title>
<alt-title alt-title-type="left-running-head">Janning et al.</alt-title>
<alt-title alt-title-type="right-running-head">
<ext-link ext-link-type="uri" xlink:href="https://doi.org/10.3389/fcteg.2025.1645918">10.3389/fcteg.2025.1645918</ext-link>
</alt-title>
</title-group>
<contrib-group>
<contrib contrib-type="author" corresp="yes">
<name>
<surname>Janning</surname>
<given-names>Kai</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<xref ref-type="corresp" rid="c001">&#x2a;</xref>
<uri xlink:href="https://loop.frontiersin.org/people/2650008/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/conceptualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/data-curation/"/>
<role content-type="https://credit.niso.org/contributor-roles/investigation/"/>
<role content-type="https://credit.niso.org/contributor-roles/methodology/"/>
<role content-type="https://credit.niso.org/contributor-roles/project-administration/"/>
<role content-type="https://credit.niso.org/contributor-roles/supervision/"/>
<role content-type="https://credit.niso.org/contributor-roles/validation/"/>
<role content-type="https://credit.niso.org/contributor-roles/visualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/writing-original-draft/"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Housin</surname>
<given-names>Abdalsalam</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<role content-type="https://credit.niso.org/contributor-roles/conceptualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/formal-analysis/"/>
<role content-type="https://credit.niso.org/contributor-roles/investigation/"/>
<role content-type="https://credit.niso.org/contributor-roles/methodology/"/>
<role content-type="https://credit.niso.org/contributor-roles/software/"/>
<role content-type="https://credit.niso.org/contributor-roles/validation/"/>
<role content-type="https://credit.niso.org/contributor-roles/writing-original-draft/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Schulte</surname>
<given-names>Christopher</given-names>
</name>
<xref ref-type="aff" rid="aff2">
<sup>2</sup>
</xref>
<role content-type="https://credit.niso.org/contributor-roles/conceptualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/data-curation/"/>
<role content-type="https://credit.niso.org/contributor-roles/methodology/"/>
<role content-type="https://credit.niso.org/contributor-roles/supervision/"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Erkens</surname>
<given-names>Frederik</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<uri xlink:href="https://loop.frontiersin.org/people/1755117/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/conceptualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/methodology/"/>
<role content-type="https://credit.niso.org/contributor-roles/software/"/>
<role content-type="https://credit.niso.org/contributor-roles/supervision/"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Frenken</surname>
<given-names>Luca</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<role content-type="https://credit.niso.org/contributor-roles/investigation/"/>
<role content-type="https://credit.niso.org/contributor-roles/methodology/"/>
<role content-type="https://credit.niso.org/contributor-roles/software/"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Herbst</surname>
<given-names>Laura</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<uri xlink:href="https://loop.frontiersin.org/people/1382752/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/project-administration/"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Nie&#xdf;ing</surname>
<given-names>Bastian</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<uri xlink:href="https://loop.frontiersin.org/people/907386/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/funding-acquisition/"/>
<role content-type="https://credit.niso.org/contributor-roles/project-administration/"/>
<role content-type="https://credit.niso.org/contributor-roles/resources/"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Schmitt</surname>
<given-names>Robert H.</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<xref ref-type="aff" rid="aff3">
<sup>3</sup>
</xref>
<uri xlink:href="https://loop.frontiersin.org/people/2781385/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/resources/"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
<role content-type="https://credit.niso.org/contributor-roles/funding-acquisition/"/>
</contrib>
</contrib-group>
<aff id="aff1">
<sup>1</sup>Department of Bioadaptive Production, <institution>Fraunhofer Institute for Production Technology IPT</institution>, <addr-line>Aachen</addr-line>, <country>Germany</country>
</aff>
<aff id="aff2">
<sup>2</sup>
<institution>Institute of Automatic Control (IRT)</institution>, <institution>RWTH</institution> <institution>Aachen University</institution>, <addr-line>Aachen</addr-line>, <country>Germany</country>
</aff>
<aff id="aff3">
<sup>3</sup>Laboratory for Machine Tools and Production Engineering (WZL), Intelligence in Quality Sensing, <institution>RWTH Aachen University</institution>, <addr-line>Aachen</addr-line>, <country>Germany</country>
</aff>
<author-notes>
<fn fn-type="edited-by">
<p>
<bold>Edited by:</bold> <ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/2310034/overview">Giulio Ferro</ext-link>, University of Genoa, Italy</p>
</fn>
<fn fn-type="edited-by">
<p>
<bold>Reviewed by:</bold> <ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/2146695/overview">Anca Maxim</ext-link>, Gheorghe Asachi Technical University of Ia&#x219;i, Romania</p>
<p>
<ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/3104316/overview">Can Zhao</ext-link>, Northeastern University, China</p>
</fn>
<corresp id="c001">&#x2a;Correspondence: Kai Janning, <email>kai.janning@ipt.fraunhofer.de</email>
</corresp>
</author-notes>
<pub-date pub-type="epub">
<day>31</day>
<month>07</month>
<year>2025</year>
</pub-date>
<pub-date pub-type="collection">
<year>2025</year>
</pub-date>
<volume>6</volume>
<elocation-id>1645918</elocation-id>
<history>
<date date-type="received">
<day>12</day>
<month>06</month>
<year>2025</year>
</date>
<date date-type="accepted">
<day>09</day>
<month>07</month>
<year>2025</year>
</date>
</history>
<permissions>
<copyright-statement>Copyright &#xa9; 2025 Janning, Housin, Schulte, Erkens, Frenken, Herbst, Nie&#xdf;ing and Schmitt.</copyright-statement>
<copyright-year>2025</copyright-year>
<copyright-holder>Janning, Housin, Schulte, Erkens, Frenken, Herbst, Nie&#xdf;ing and Schmitt</copyright-holder>
<license xlink:href="http://creativecommons.org/licenses/by/4.0/">
<p>This is an open-access article distributed under the terms of the Creative Commons Attribution License (CC BY). The use, distribution or reproduction in other forums is permitted, provided the original author(s) and the copyright owner(s) are credited and that the original publication in this journal is cited, in accordance with accepted academic practice. No use, distribution or reproduction is permitted which does not comply with these terms.</p>
</license>
</permissions>
<abstract>
<sec>
<title>Introduction</title>
<p>This work presents an approach to collision avoidance in multi-agent systems (MAS) by integrating Conflict-Based Search (CBS) with Model Predictive Control (MPC), referred to as Conflict-Based Model Predictive Control (CB-MPC).</p>
</sec>
<sec>
<title>Methods</title>
<p>The proposed method leverages the conflict-avoidance strengths of CBS to generate collision-free paths, which are then refined into dynamic reference trajectories using a minimum jerk trajectory optimizer and then used inside a MPC to follow the trajectories and to avoid collisions. This integration ensures real-time trajectory execution, preventing collisions and adapting to online changes. The approach is evaluated using a magnetic planar drive system for realistic multi-agent scenarios, demonstrating enhanced real-time responsiveness and adaptability. The focus is on the development of a motion planning algorithm and its validation in dynamic environments, which are becoming increasingly relevant in modern adaptive production sites.</p>
</sec>
<sec>
<title>Results</title>
<p>On the MAS demonstrator with four active agents, ten different scenarios were created with varying degrees of complexity in terms of route planning. In addition, external disturbances that hinder the execution of the paths were simulated. All calculation and solution times were recorded and discussed. The result show that all scenarios could be successfully solved and executed., and the CB-MPC is therefore suitable for motion planning on the presented MAS demonstrator.</p>
</sec>
<sec>
<title>Discussion</title>
<p>The results show, that the CB-MPC is suitable for motion planning on the presented MAS demonstrator. The greatest limitation of the approach lies in scalability with regard to increasing the number of agents.</p>
</sec>
</abstract>
<kwd-group>
<kwd>conflict-based search</kwd>
<kwd>model predictive control</kwd>
<kwd>multi-agent coordination</kwd>
<kwd>path planning</kwd>
<kwd>collision avoidance</kwd>
<kwd>sequential quadratic programming</kwd>
<kwd>planar drive</kwd>
<kwd>automation</kwd>
</kwd-group>
<custom-meta-wrap>
<custom-meta>
<meta-name>section-at-acceptance</meta-name>
<meta-value>Control and Automation Systems</meta-value>
</custom-meta>
</custom-meta-wrap>
</article-meta>
</front>
<body>
<sec id="s1">
<title>1 Introduction</title>
<p>Traditional assembly lines, forming the backbone of conventional manufacturing, are inherently linear and sequential, limiting flexibility and adaptability &#x2013; crucial attributes needed to meet the dynamic demands of modern production. Recent advancements in Multi-agent Systems (MAS) propose a paradigm shift towards adaptive and decoupled manufacturing processes, heralding the era of smart manufacturing (<xref ref-type="bibr" rid="B5">Brecher, 2012</xref>; <xref ref-type="bibr" rid="B13">G&#xf6;ppert et al., 2018</xref>; <xref ref-type="bibr" rid="B14">Hu et al., 2011</xref>). MAS enhance manufacturing systems by enabling autonomous agents to dynamically transport components, optimizing production flow, and enabling customization. This flexibility can result in increased system productivity by reducing bottlenecks and idle times (<xref ref-type="bibr" rid="B16">Komesker et al., 2022</xref>). <xref ref-type="fig" rid="F1">Figure 1</xref> illustrates the contrast between traditional conveyor belts and advanced planar drive systems, highlighting the potential of MAS and advanced control algorithms (<xref ref-type="bibr" rid="B6">Brecher et al., 2017</xref>).</p>
<fig id="F1" position="float">
<label>FIGURE 1</label>
<caption>
<p>Schematic comparison between linear and decoupled production intrologistics systems.</p>
</caption>
<graphic xlink:href="fcteg-06-1645918-g001.tif">
<alt-text content-type="machine-generated">Diagram comparing two production intralogistics systems: Linear and Decoupled. The Linear system shows a sequential flow of goods on a conveyor belt. The Decoupled system illustrates a grid-like structure enabling more flexible movement paths. Both systems include machinery icons representing various production stages.</alt-text>
</graphic>
</fig>
<p>However, managing multiple autonomous agents to avoid collisions remains a significant challenge. Multi-Agent Path Finding (MAPF) is crucial in applications such as automated warehousing and production intralogistics, where numerous agents handle transportation tasks. Although MAPF algorithms can generate collision-free paths, they often lack real-time monitoring and adaptability to dynamic changes, limiting their effectiveness. In dynamic environments such as on colaborative production sites, adressing these limitations are vital for enhancing the utility of MAS (<xref ref-type="bibr" rid="B16">Komesker et al., 2022</xref>).</p>
<p>An exemplary application of MAS is the integration of a magnetic planar drive system for intralogistic processes. A magnetic planar drive allows frictionless product transport and can facilitate flexible, non-linear process chains (<xref ref-type="bibr" rid="B15">Janning et al., 2025</xref>; <xref ref-type="bibr" rid="B28">Wang et al., 2024</xref>). Planar drive systems consist of a stationary plane (stator) consisting of multiple modular tiles and movable transport units (movers). The stator&#x2019;s conductor coils generate electromagnetic fields interacting with the movers&#x2019; permanent magnets, enabling precise multi-directional movement. This technology suits cleanroom production and modern Industry 4.0 applications, allowing for adaptable path changes and high-precision transport (<xref ref-type="bibr" rid="B15">Janning et al., 2025</xref>; <xref ref-type="bibr" rid="B28">Wang et al., 2024</xref>). The flexibility and precision of planar drives make them a suitable testbed for evaluating the proposed motion planning algorithm. <xref ref-type="fig" rid="F2">Figure 2A</xref> shows a self-developed MAS demonstrator, which consists of a Beckhoff Automation XPlanar system with 3 &#xd7; 4 stator tiles and four movers, each embodying an agent, visualized in <xref ref-type="fig" rid="F2">Figure 2B</xref>. The system is controlled via a Beckhoff PLC with the TwinCAT environment. By adding stations for tasks such as pipetting liquids and visual inspections, adaptive processes can be implemented that require flexible modifications of the process chains and thus of the mover paths.</p>
<fig id="F2" position="float">
<label>FIGURE 2</label>
<caption>
<p>Presentation of a multi-agent system demonstrator based on a magnetic planar drive system with four levitating movers acting as independent transport units <bold>(A)</bold> and a schematic representation of the system showing the tile-based modular design <bold>(B)</bold>.</p>
</caption>
<graphic xlink:href="fcteg-06-1645918-g002.tif">
<alt-text content-type="machine-generated">Two images of a planar drive system. Image A shows a physical setup with a flat surface and several rectangular objects. Image B is a diagram labeled &#x22;Planar Drive System MAS Demonstrator,&#x22; illustrating a grid with tiles and a &#x22;Levitating Mover.&#x22;</alt-text>
</graphic>
</fig>
<p>The MAPF required for this purpose is a computational problem that entails planning conflict-free paths for multiple agents. Each agent aims to reach a designated target while avoiding collisions with both static obstacles and other agents. The goal is to minimize either the sum of their travel times, the makespan, or other optimization criteria (<xref ref-type="bibr" rid="B25">Stern et al., 2019</xref>; <xref ref-type="bibr" rid="B30">Yu, 2016</xref>). The mathematical fundamentals of MAPF problems are extensively described by Stern et al. MAPF solvers are generally divided into optimal and suboptimal algorithms. Suboptimal algorithms are further classified into bounded and unbounded solvers (<xref ref-type="bibr" rid="B12">Gao et al., 2024</xref>). In the context of production and logistics, suboptimal solvers are prevalent because finding a solution quickly is often more important than finding an optimal solution through high computational effort (<xref ref-type="bibr" rid="B12">Gao et al., 2024</xref>; <xref ref-type="bibr" rid="B19">Liu et al., 2024</xref>). However, this study investigates whether optimal solvers can also be designed for practical application with sufficient speed and scalability. A common approach for the optimal solution of MAPF problems is conflict-based search (CBS). CBS is particularly well-suited for small to medium-sized scenarios where optimal paths are needed for a limited amount of agents. However, as the number of conflicts grow exponentially with the number of agents, CBS becomes less efficient for large and complex problems. In such cases, extensions are made to employ Improved CBS (ICBS) to provide faster solutions (<xref ref-type="bibr" rid="B23">Sharon et al., 2015</xref>; <xref ref-type="bibr" rid="B24">Stern, 2019</xref>).</p>
<p>For the MAS demonstrator an ICBS involves representing the planar drive system as a graph where each tile acts as a vertex, and the distance from the center of one tile to the center of an adjacent tile is represented as an edge. This graph representation (<xref ref-type="bibr" rid="B8">Diestel, 2012</xref>) is vital for accurately modeling the movement and interaction of movers on the planar drive system. Moreover, defining and communicating the accessible space in this context, a binary map is used, where &#x201c;true&#x201d; indicates an obstacle and &#x201c;false&#x201d; signifies a free vertex or location. Thus, ICBS can effectively generate optimal collision-free paths by resolving conflicts, but it is limited on path planning and does not monitor the execution of these paths. Consequently, it cannot guarantee that agents will not collide during execution, especially if an agent malfunctions or encounters difficulties executing its plan, due to interruptions from the environment. Additionally, MAPF typically assumes agents can move freely to any node on the graph without constraints, which is not practical for scenarios where agents have specific motion constraints and dynamics. To address these shortcomings, it is essential to combine pathfinding with motion planning. While Networked Model Predictive Control (Net-MPC) can theoretically integrate path planning, collision avoidance, and trajectory following into a single optimization problem, this approach often falls short in complex and non-linear scenarios (<xref ref-type="bibr" rid="B21">Maciejowski, 2002</xref>). Therefore, a hybrid approach is proposed, merging the strengths of CBS and Net-MPC. CBS provides preliminary optimal plans, simplifying the task for a centralized MPC (CMPC) (<xref ref-type="bibr" rid="B1">Albin Rajasingham, 2021</xref>). The CMPC then monitors these plans, ensuring collision avoidance and optimal motion execution in real-time. In this work, this integration is referred to as Conflict-Based MPC (CB-MPC) to indicate the operating principle. Therefore, a theoretical framework was developed, the corresponding algorithm was implemented for application on the MAS demonstrator, and its performance was evaluated. The objective of these investigations is to validate the CB-MPC approach as an optimal solver for a real-world MAPF problem and to identify its limitations with regard to scalability.</p>
</sec>
<sec id="s2">
<title>2 Development of CB-MPC</title>
<p>CMPC unifies path planning properties, collision avoidance, and trajectory following for simple scenarios but struggles in complex environments. Conversely, ICBS excels in computing collision-free paths in intricate scenarios, addressing static conflicts but not dynamic constraints, cycle conflicts, or transition conflicts (<xref ref-type="bibr" rid="B24">Stern, 2019</xref>).</p>
<p>
<xref ref-type="fig" rid="F3">Figure 3</xref> (left) illustrates how two movers (<bold>M</bold>
<sub>
<bold>1</bold>
</sub> and <bold>M</bold>
<sub>
<bold>2</bold>
</sub>) are navigated from their initial position (&#x25a0;) to their target position (<bold>x</bold>) using CBS. Here, the movers are considered as point masses, so that a collision occurs due to the overlapping physical dimensions of the movers, even if the positions of the two movers <bold>p</bold>
<sub>
<bold>1</bold>
</sub> and <bold>p</bold>
<sub>
<bold>2</bold>
</sub> are not identical at any point in time <italic>t</italic>. If CBS is selected as the path finding algorithm and a MPC is used for the execution of these paths, additional constraints can be considered (<xref ref-type="fig" rid="F3">Figure 3</xref>, right). The algorithm then enables constraint-based motion planning to ensure a collision-free solution to the MAPF problem.</p>
<fig id="F3" position="float">
<label>FIGURE 3</label>
<caption>
<p>Prevention of transition conflicts in CBS-based mover coordination through MPC.</p>
</caption>
<graphic xlink:href="fcteg-06-1645918-g003.tif">
<alt-text content-type="machine-generated">Two side-by-side grids depict path planning. The left grid shows offline calculated CBS paths with a conflict, indicated by intersecting purple and green paths. The right grid displays an online adjusted path using MPC for collision avoidance, showing diverging purple and green lines.</alt-text>
</graphic>
</fig>
<p>The CB-MPC framework is a hybrid approach, where ICBS computes conflict-free paths offline, and CMPC executes these paths online in real time. The integration process involves converting ICBS-generated discrete path plans, which may include abrupt transitions and high acceleration variations, into jerk minimized paths via a reference trajectory optimizer. This optimizer smooths the trajectory references, enabling effective execution by CMPC and assuring feasibility for real-world multi-agent coordination applications. The CMPC and ICBS are integrated within a unified CB-MPC framework for MAPF as structurally illustrated in <xref ref-type="fig" rid="F4">Figure 4</xref>.</p>
<fig id="F4" position="float">
<label>FIGURE 4</label>
<caption>
<p>CB-MPC structure.</p>
</caption>
<graphic xlink:href="fcteg-06-1645918-g004.tif">
<alt-text content-type="machine-generated">Diagram illustrating a system architecture for CB-MPC featuring three main blocks: ICBS, Trajectory Optimizer, and CMPC. Inputs SPs, TPs, and Binary Map enter ICBS, which outputs WPS to the Trajectory Optimizer. The optimizer passes references to the CMPC, which controls agents M1 to MN using inputs u1 to uN, producing outputs X1 to XN. Arrows indicate data flow.</alt-text>
</graphic>
</fig>
<p>The ICBS receives the start positions (<italic>SPs</italic>) and target positions (<italic>TPs</italic>) of all mover agents involved in the MAPF problem. In addition, a binary map is read out, which indicates whether areas of the grid contain obstacles or are inaccessible. The conflict-free paths determined from this are then converted into waypoints (<italic>WPs</italic>) for each individual mover. The trajectory optimizer modifies these waypoints as well as the speed and acceleration profiles and returns new reference trajectories (<bold>
<italic>x</italic>
</bold>
<sub>
<bold>ref<italic>,i</italic>
</bold>
</sub>) for each mover <italic>i</italic>. These then allow the CMPC to control the state vecors (<bold>
<italic>x</italic>
</bold>) with the control input vectors (<bold>
<italic>u</italic>
</bold>).</p>
<p>The development of the ICBS is explained in <xref ref-type="sec" rid="s2-1">Section 2.1</xref>, followed by a description of the Trajectory Optimizer in <xref ref-type="sec" rid="s2-2">Section 2.2</xref> and the CMPC in <xref ref-type="sec" rid="s2-3">Section 2.3</xref>. Testing of the entire CB-MPC framework is presented in <xref ref-type="sec" rid="s3">Section 3</xref>.</p>
<sec id="s2-1">
<title>2.1 Development of a pathfinding algorithm</title>
<sec id="s2-1-1">
<title>2.1.1 Conflict-based search</title>
<p>CBS, as a two-level search-based MAPF algorithm, handles collisions by adding constraints at the high level, while at the low level, it computes paths that satisfy these constraints (<xref ref-type="bibr" rid="B23">Sharon et al., 2015</xref>). A constraint specifies that a particular agent cannot occupy a specific vertex at a specific time.</p>
<p>At the high level, CBS performs a best-first search on the Conflict Tree (CT) illustrated in <xref ref-type="fig" rid="F5">Figure 5</xref>. Each node in the CT contains a set of constraints that agents must follow as well as the current solution for their paths. The root node starts with no constraints, and each subsequent node adds a new constraint from a detected conflict. The low-level search independently finds paths for each agent while satisfying the constraints imposed by the high-level node. In this work an A&#x2a; algorithm was chosen due to its optimality, completeness and flexibility (<xref ref-type="bibr" rid="B9">Ducho&#x148; et al., 2014</xref>). A&#x2a; is a pathfinding method that evaluates vertices based on their costs to find an optimal path. In this application of mover motion planning, costs are defined as the length of the path from initial to target position of a mover, which is calculated geometrically.</p>
<fig id="F5" position="float">
<label>FIGURE 5</label>
<caption>
<p>Conflict tree.</p>
</caption>
<graphic xlink:href="fcteg-06-1645918-g005.tif">
<alt-text content-type="machine-generated">Conflict tree diagram depicting a grid pathfinding problem with nodes labeled from zero to six, showcasing the movement of two agents, M1 and M2. The grid has columns labeled A to D and rows labeled one to three. Starting positions are marked by green squares, paths by dotted lines, constraints by blue squares, and conflicts by star symbols. Node five and node six have check marks, indicating resolution.</alt-text>
</graphic>
</fig>
<p>Considering a 3 &#xd7; 4 grid with two mover agents (<bold>M</bold>
<sub>
<bold>1</bold>
</sub> and <bold>M</bold>
<sub>
<bold>2</bold>
</sub>), initially, an individual, shortest possible path is planned for each agent without any constraints. As shown in <xref ref-type="fig" rid="F5">Figure 5</xref>, the path for <bold>M</bold>
<sub>
<bold>1</bold>
</sub> is <italic>(A3, A2, B2, C2, D2)</italic> and the path for <bold>M</bold>
<sub>
<bold>2</bold>
</sub> is <italic>(A1, A2, B2, C2, C3, D3)</italic>. When these paths are checked, a conflict is found at <italic>A2</italic> at time <italic>t &#x3d; 1</italic>. The low-level search recomputes individual paths for each agent, considering the new constraint. The CBS high-level search expands the CT with two child nodes with, each forcing one of the agents to avoid <italic>A2</italic> at <italic>t &#x3d; 1</italic>. In the first node, agent <bold>M</bold>
<sub>
<bold>1</bold>
</sub> is prohibited from being at <italic>A2</italic> at <italic>t &#x3d; 1</italic>. The new path for <bold>M</bold>
<sub>
<bold>1</bold>
</sub> is <italic>(A3, B3, B2, C2, D2)</italic> and the path for <bold>M</bold>
<sub>
<bold>2</bold>
</sub> stays the same. In the second node the path for <bold>M</bold>
<sub>
<bold>1</bold>
</sub> stays the same and a new path for <bold>M</bold>
<sub>
<bold>2</bold>
</sub> is tested. For both new nodes the paths are again checked for conflicts. If another conflict is found, more nodes are created and more constraints are added. This process is repeated until a solution is found where all agents have collision-free paths and the total cost is minimized. CBS guarantees optimality and completeness by systematically expanding all nodes in the CT until a solution is found or all possibilities are exhausted. Only the possibility of same-cost solutions remain.</p>
</sec>
<sec id="s2-1-2">
<title>2.1.2 CBS improvement</title>
<p>To integrate A&#x2a; into the CBS framework, modifications were made to allow the algorithm to take constraints as inputs and re-plan paths for multiple constrained agents. Additionally, a specific adjustment enables agents to leave their target positions if the start position was the same as the target, thus avoiding potential deadlocks.</p>
<p>Prior research has introduced numerous techniques to enhance the performance of conflict-based search. These techniques include disjoint splitting (<xref ref-type="bibr" rid="B18">Li et al., 2019b</xref>), meta-agent utilization (<xref ref-type="bibr" rid="B22">Sharon et al., 2012</xref>), conflict prioritization (<xref ref-type="bibr" rid="B29">Yang and Wooldridge, 2015</xref>), conflict bypassing (<xref ref-type="bibr" rid="B4">Boyarski et al., 2015</xref>), and the integration of heuristics to speed-up CBS (<xref ref-type="bibr" rid="B17">Li et al., 2019a</xref>). In this work, Disjoint Splitting and Dependency Graph heuristics are implemented to accelerate CBS. <xref ref-type="fig" rid="F6">Figure 6</xref> illustrates the overall structure of the improved CBS for MAPF.</p>
<fig id="F6" position="float">
<label>FIGURE 6</label>
<caption>
<p>ICBS structure.</p>
</caption>
<graphic xlink:href="fcteg-06-1645918-g006.tif">
<alt-text content-type="machine-generated">Diagram illustrating the CBS and ICBS modifications. The CBS section includes a conflict-resolution planner with a conflict detector and a single-agent path planner using A*. Constraints and paths are exchanged between components. The ICBS section shows modifications: disjoint splitting for cutting nodes and shrinking the CT, dependency graph heuristics for efficient node selection, and deadlock avoidance. Dotted lines indicate the connections between CBS and modifications.</alt-text>
</graphic>
</fig>
<p>Disjoint splitting addresses the inefficiencies of standard CBS splitting by ensuring that subproblems do not share solutions (<xref ref-type="bibr" rid="B18">Li et al., 2019b</xref>). This method employs both positive and negative constraints: Positive constraints forcing an agent to be at a specific vertex at a particular time and negative constraints prohibiting an agent from being at a specific vertex at a given time. For every potentially conflict-free plan in a parent CT node, at least one of the two contraints must be satisfied. This approach is called disjoint because both contraints cannot be satisfied simultaneously for a plan. This leads to pruning of nodes, resulting in smaller CTs.</p>
<p>Heuristics are used to enhance the efficiency in selecting possible nodes to be searched for conflicts for expanding the CT (<xref ref-type="bibr" rid="B17">Li et al., 2019a</xref>). This research tested three established heuristics: Prioritizing Conflicts (PC), Conflict Graph (CG) and Dependency Graph (DG). The Performance of the heuristics within the ICBS framework was simultatively evaluated using ten random scenarios per agent, with a runtime limit of 5&#xa0;s. The effectiveness of conflict resolution was tested by comparing the success rates for increasing numbers of agents for each heuristic. In addition, three different grid environments (3 &#xd7; 4, 4 &#xd7; 8, 4 &#xd7; 20) were tested, each with and without the disjoint splitting method. The results shown in <xref ref-type="sec" rid="s12">Supplementary Material S1</xref> show the highest efficiency using the DG heuristics in every scenario. Due to the superior performance of the dependency graph heuristics combined with disjoint splitting, these are utilized for the implementation of the CB-MPC.</p>
<p>To illustrate the feasibility, <xref ref-type="sec" rid="s12">Supplementary Material S2</xref>, presents the pseudo code of the algorithm used. The improvements to the CBS are based on the approach taken by Felner and Li (<xref ref-type="bibr" rid="B10">Felner et al., 2018</xref>; <xref ref-type="bibr" rid="B17">Li et al., 2019a</xref>).</p>
</sec>
<sec id="s2-1-3">
<title>2.1.3 Implementation into a programmable logic controller environment</title>
<p>To validate the algorithm in a real-world setting, the Programmable Logic Controller (PLC) environment TwinCAT3 from Beckhoff Automation (<xref ref-type="bibr" rid="B2">Beckhoff Automation GmbH &#x26; Co. KG, 2025</xref>), which includes Beckhoff&#x2019;s simulation environment for the XPlanar planar drive system, was utilized. A TwinCAT program was developed to facilitate data exchange between the XPlanar system and the algorithm. This program reads the tile layout, mover dimensions, and positions, transmitting the binary map for the accessible grid, start positions and target positions to the algorithm and receiving way points for collision-free paths in return. These paths are then converted into reference trajectories for execution by the CMPC; compare <xref ref-type="fig" rid="F4">Figure 4</xref>.</p>
<p>As a communication interface between TwinCAT and the algorithm in Python the Automation Device Specification (ADS) protocol (<xref ref-type="bibr" rid="B2">Beckhoff Automation GmbH &#x26; Co. KG, 2025</xref>) is utilized. Upon initialization, the TwinCAT program sends a handshake signal to the communication program, indicating readiness for data transfer. Following this, the communication program converts the algorithm&#x2019;s instructions into a format compatible with TwinCAT and transmits them back. This process leverages ADS functions such as <italic>read_by_name</italic> and <italic>write_by_name</italic> for efficient data access. <xref ref-type="fig" rid="F7">Figure 7</xref> partially illustrates the class diagram of the ICBS with PLC communication. <xref ref-type="sec" rid="s12">Supplementary Material S3</xref> shows the class diagram in detailed form. Additionally, a configuration file in XML format is utilized to define key parameters for the integration, including the AMS Net ID of the PLC, the selection of heuristics for the algorithm, the dimensions of the movers, and the overall layout.</p>
<fig id="F7" position="float">
<label>FIGURE 7</label>
<caption>
<p>Simplified class diagram showing the communication between ICBS algorithm and PLC.</p>
</caption>
<graphic xlink:href="fcteg-06-1645918-g007.tif">
<alt-text content-type="machine-generated">Flowchart showing interactions between components in two packages: PLC and MAPF Solver. On the left, PLC contains GVL_PlanarDrive, MoverControl, and GVL_MoverInfo with relationships like &#x22;writes&#x22; and &#x22;reads.&#x22; On the right, MAPF Solver includes ICBSSolver, PLCSettingsReader, PLCConnection, PLCDataWriter, PLCDataReader, and GridUtility, linked by &#x22;provides data&#x22; and &#x22;uses&#x22; arrows.</alt-text>
</graphic>
</fig>
<p>The <italic>GVL_PlanarDrive</italic> receives the results of the algorithm in the form of lists with velocities and waypoints of the individual movers, which are written to global variable lists (GVLs). By setting individual trigger GVLs, individual methods of the <italic>MoverControl</italic> class, such as initializations or the execution of the paths, are activated. In doing so, all current positions of the movers and the obstacle map states are transmitted to the <italic>GVL_MoverInfo</italic>. The <italic>PLCDataReader</italic> reads these information and passes them back to the <italic>ICBSSolver</italic>. The <italic>ICBSSolver</italic> additionally receives the information of the XML file and the PLC settings from the <italic>PLCSettingsReader</italic> class. The OPC is then specified with these information and the pathfinding problem is solved. The calculated paths are then passed to the <italic>PLCDataWriter</italic>, which in turn writes the GVLs of the <italic>GVL_PlanarDrive</italic>.</p>
<p>Additionally, the ICBS algorithm operates on demand, activated by a user command or a higher-level order. <xref ref-type="fig" rid="F8">Figure 8</xref> shows the state chart illustrating the ICBS for planning and executing required movements and processes. The ADS and algorithm components are merged and packaged into an executable (.exe) file. <xref ref-type="sec" rid="s12">Supplementary Material S4</xref> illustrates the ICBS interface, showcasing the algorithm&#x2019;s real-time execution in a path planning scenario.</p>
<fig id="F8" position="float">
<label>FIGURE 8</label>
<caption>
<p>ICBS statechart.</p>
</caption>
<graphic xlink:href="fcteg-06-1645918-g008.tif">
<alt-text content-type="machine-generated">Flowchart depicting a process. Begins with opening an executable file. Reads settings from XML. If settings are valid, it waits, then triggers an ICBS to read inputs. If inputs are valid, an MAPF instance is received and collision-free paths are computed. If inputs are not valid, the process waits. Ends with writing paths and starting execution. Arrows indicate process flow direction.</alt-text>
</graphic>
</fig>
<p>With the start of the path plan execution, the lists with WPs for the individual movers are passed to a trajectory optimizer, whereupon these time-discretized trajectories are executed by the CMPC.</p>
</sec>
</sec>
<sec id="s2-2">
<title>2.2 Reference trajectory optimization</title>
<p>To ensure smooth and dynamically feasible trajectories within the CB-MPC framework, the pre-build Minimum Jerk Trajectory Optimizer, available in MATLAB/Simulink is utilized (<xref ref-type="bibr" rid="B26">The MathWorks, Inc, 2021</xref>). This is particularly important for the transportation of delicate items, where smooth trajectories are essential to avoid abrupt motions and high acceleration variations. This optimizer minimizes the jerk, which is the third derivative of position with respect to time (<xref ref-type="bibr" rid="B20">Lozer et al., 2025</xref>). The optimization problem can be formulated as minimizing the integral of the squared jerk (<xref ref-type="disp-formula" rid="e1">Equation 1</xref>) over the trajectory duration <italic>T</italic>:<disp-formula id="e1">
<mml:math id="m1">
<mml:mrow>
<mml:munder>
<mml:mi>min</mml:mi>
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:munder>
<mml:msubsup>
<mml:mo>&#x222b;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mi>T</mml:mi>
</mml:msubsup>
<mml:msup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;" separators="|">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mi>d</mml:mi>
<mml:mn>3</mml:mn>
</mml:msup>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mn>3</mml:mn>
</mml:msup>
</mml:mfrac>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:math>
<label>(1)</label>
</disp-formula>
</p>
<p>The calculus of variations is used to determine the function <bold>
<italic>x</italic>
</bold>
<italic>(t)</italic> that minimizes the integral of the squared jerk over the duration of the trajectory. This process ensures that the resulting trajectory is smooth by avoiding abrupt changes in acceleration. This approach shows that the sixth derivative of the position (<bold>
<italic>x</italic>
</bold>) must be zero (<xref ref-type="disp-formula" rid="e2">Equation 2</xref>):<disp-formula id="e2">
<mml:math id="m2">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mi>d</mml:mi>
<mml:mn>6</mml:mn>
</mml:msup>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mn>6</mml:mn>
</mml:msup>
</mml:mfrac>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:math>
<label>(2)</label>
</disp-formula>
</p>
<p>This condition implies that <bold>
<italic>x</italic>
</bold>
<italic>(t)</italic> must be a polynomial of at most fifth order. Thus, a fifth-order polynomial (<xref ref-type="disp-formula" rid="e3">Equation 3</xref>) is chosen to model the position trajectory, ensuring continuity:<disp-formula id="e3">
<mml:math id="m3">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mi>&#x3b1;</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mi>&#x3b1;</mml:mi>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mi>t</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mi>&#x3b1;</mml:mi>
<mml:mn>2</mml:mn>
</mml:msub>
<mml:msup>
<mml:mi>t</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mi>&#x3b1;</mml:mi>
<mml:mn>3</mml:mn>
</mml:msub>
<mml:msup>
<mml:mi>t</mml:mi>
<mml:mn>3</mml:mn>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mi>&#x3b1;</mml:mi>
<mml:mn>4</mml:mn>
</mml:msub>
<mml:msup>
<mml:mi>t</mml:mi>
<mml:mn>4</mml:mn>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mi>&#x3b1;</mml:mi>
<mml:mn>5</mml:mn>
</mml:msub>
<mml:msup>
<mml:mi>t</mml:mi>
<mml:mn>5</mml:mn>
</mml:msup>
</mml:mrow>
</mml:math>
<label>(3)</label>
</disp-formula>
</p>
<p>Taking the first and second derivatives, the velocity <italic>v(t)</italic> (<xref ref-type="disp-formula" rid="e4">Equation 4</xref>) and acceleration <italic>a(t)</italic> (<xref ref-type="disp-formula" rid="e5">Equation 5</xref>) are given by:<disp-formula id="e4">
<mml:math id="m4">
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi mathvariant="bold-italic">x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mi>&#x3b1;</mml:mi>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mn>2</mml:mn>
</mml:msub>
<mml:mi>t</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mn>3</mml:mn>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mn>3</mml:mn>
</mml:msub>
<mml:msup>
<mml:mi>t</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mn>4</mml:mn>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mn>4</mml:mn>
</mml:msub>
<mml:msup>
<mml:mi>t</mml:mi>
<mml:mn>3</mml:mn>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mn>5</mml:mn>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mn>5</mml:mn>
</mml:msub>
<mml:msup>
<mml:mi>t</mml:mi>
<mml:mn>4</mml:mn>
</mml:msup>
</mml:mrow>
</mml:math>
<label>(4)</label>
</disp-formula>
<disp-formula id="e5">
<mml:math id="m5">
<mml:mrow>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mi>d</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:mi mathvariant="bold-italic">x</mml:mi>
</mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mn>2</mml:mn>
</mml:msup>
</mml:mfrac>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mn>2</mml:mn>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mn>6</mml:mn>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mn>3</mml:mn>
</mml:msub>
<mml:mi>t</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mn>12</mml:mn>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mn>4</mml:mn>
</mml:msub>
<mml:msup>
<mml:mi>t</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mn>20</mml:mn>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mn>5</mml:mn>
</mml:msub>
<mml:msup>
<mml:mi>t</mml:mi>
<mml:mn>3</mml:mn>
</mml:msup>
</mml:mrow>
</mml:math>
<label>(5)</label>
</disp-formula>
</p>
<p>The optimizer ensures that the coefficients &#x3b1;<sub>0</sub>, &#x3b1;<sub>1</sub>, &#x3b1;<sub>2</sub>, &#x3b1;<sub>3</sub>, &#x3b1;<sub>4</sub>, &#x3b1;<sub>5</sub> satisfy the boundary conditions for position, velocity, and acceleration at the initial (<italic>t &#x3d; 0</italic>) and final (<italic>t &#x3d; T</italic>) times. This results in a smooth trajectory that complies with dynamic constraints, minimizing abrupt changes in movement direction and high acceleration variations, making the trajectories suitable for real-time execution by CMPC; compare <xref ref-type="fig" rid="F9">Figure 9</xref>.</p>
<fig id="F9" position="float">
<label>FIGURE 9</label>
<caption>
<p>Schematic representation of the optimized and non-optimized trajectories.</p>
</caption>
<graphic xlink:href="fcteg-06-1645918-g009.tif">
<alt-text content-type="machine-generated">Two diagrams compare path calculations. On the left, &#x22;ICBS Calculated Paths&#x22; show two distinct paths: a purple path from SP1 to TP1 and a teal path from SP3 to TP3. On the right, &#x22;Jerk Minimized Trajectories&#x22; also depict two paths, but with smoother curves: a purple path from SP1 to TP1 and a teal path from SP3 to TP3, alongside other paths from SP2 to TP2 and SP4 to TP4. Both diagrams are over a grid background.</alt-text>
</graphic>
</fig>
<p>The multi-agent path finding problem is initially solved by the ICBS, presented in <xref ref-type="sec" rid="s2-1">Section 2.1</xref>. This results in collision-free trajectories being output as waypoints for all agents involved. However, these trajectories are not practical for real-world applications, as they do not prohibit abrupt changes in direction (see <xref ref-type="fig" rid="F9">Figure 9</xref>, left). For this reason, these individual trajectories are minimized in terms of their jerks; in other words, the curves are smoothened and less abrupt (<xref ref-type="fig" rid="F9">Figure 9</xref>, right). These individual optimized reference trajectories are then passed to the MPC, which ensures the collision-free execution of the MAPF solution. This is illustrated in <xref ref-type="fig" rid="F4">Figure 4</xref>.</p>
</sec>
<sec id="s2-3">
<title>2.3 Development of a centralized model predictive control</title>
<p>To implement the CMPC, the acados software package is utilized (<xref ref-type="bibr" rid="B27">Verschueren et al., 2022</xref>). Its core, written in C, enables the use of optimal control methods for real-time applications, while interfaces for C&#x2b;&#x2b;, Matlab, and Python offer versatile accessibility. These high-level interfaces use CasADi for modeling nonlinear functions and derivatives, allowing comparisons with other optimization libraries (<xref ref-type="bibr" rid="B11">Frey et al., 2023</xref>).</p>
<p>The workflow starts by defining the optimal control problem (OCP) using high-level interfaces, which simplifies the problem setup. Next, a self-contained C project is generated, which includes all the necessary functions and solvers needed to solve the OCP. To use this C project within Simulink, a MATLAB S-function is built. The S-function acts as a bridge, allowing Simulink to interface with the C code. This integration enables testing and validation of the control algorithm within Simulink. Once the model is successfully tested, the automatic code generation feature is used to deploy the solution on TwinCAT for real-time implementation.</p>
<sec id="s2-3-1">
<title>2.3.1 Prediction model</title>
<p>The CMPC is designed to control multiple agents by solving a centralized optimization problem. Each agent, or mover, is modeled using double integrator dynamics, also known as the point-mass model, to represent its free movement in a two-dimensional (2D) plane. In both the simulation and experimental setup, the state variables (<italic>p</italic>
<sub>
<italic>x</italic>
</sub>
<italic>, p</italic>
<sub>
<italic>y</italic>
</sub>
<italic>, v</italic>
<sub>
<italic>x</italic>
</sub>
<italic>, v</italic>
<sub>
<italic>y</italic>
</sub>) represent the Mover&#x2019;s position and velocity, while the control inputs (<italic>a</italic>
<sub>
<italic>x</italic>
</sub>
<italic>, a</italic>
<sub>
<italic>y</italic>
</sub>) represent accelerations. The action diagram is represented by <xref ref-type="fig" rid="F10">Figure 10</xref> (left) and a schematic drawing (right).</p>
<fig id="F10" position="float">
<label>FIGURE 10</label>
<caption>
<p>Simplified action diagram of the dynamics of a mover on a planar drive.</p>
</caption>
<graphic xlink:href="fcteg-06-1645918-g010.tif">
<alt-text content-type="machine-generated">Diagram of a 2x2 tile planar drive system. On the left, labeled arrows show inputs: \(a_x\), \(v_x\), \(p_x\), \(a_y\), \(v_y\), \(p_y\). Each input appears within a box on a diagonal line. On the right, the drive system features a mover positioned on a tiled surface, indicated by arrows showing movement directions \(x\) and \(y\).</alt-text>
</graphic>
</fig>
<p>The <italic>agent state vector (x</italic>
<sub>
<italic>i</italic>
</sub>
<italic>)</italic> of an individual agent indexed with <italic>i</italic> and the individual <italic>agent control input vector (u</italic>
<sub>
<italic>i</italic>
</sub>
<italic>)</italic> are defined and form the following point mass model (<xref ref-type="disp-formula" rid="e6">Equations 6</xref>, <xref ref-type="disp-formula" rid="e7">7</xref>):<disp-formula id="e6">
<mml:math id="m6">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mover accent="true">
<mml:mi>x</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mover accent="true">
<mml:mi>x</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>v</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>v</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mover accent="true">
<mml:mi>x</mml:mi>
<mml:mo>&#xa8;</mml:mo>
</mml:mover>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mover accent="true">
<mml:mi>x</mml:mi>
<mml:mo>&#xa8;</mml:mo>
</mml:mover>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:math>
<label>(6)</label>
</disp-formula>
<disp-formula id="e7">
<mml:math id="m7">
<mml:mrow>
<mml:msub>
<mml:mover accent="true">
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
<mml:mi mathvariant="bold-italic">i</mml:mi>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold-italic">A</mml:mi>
<mml:msub>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="bold-italic">B</mml:mi>
<mml:msub>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
</mml:msub>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mo>&#x21d4;</mml:mo>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mover accent="true">
<mml:mi>x</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mover accent="true">
<mml:mi>x</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mover accent="true">
<mml:mi>x</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mover accent="true">
<mml:mi>x</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>1</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>1</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2b;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>1</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>1</mml:mn>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:math>
<label>(7)</label>
</disp-formula>
</p>
<p>For the CMPC, the following state-space model is derived to describe the dynamics of <italic>N</italic> agents, where each agent <italic>i</italic> has a state vector <bold>
<italic>x</italic>
</bold>
<sub>
<bold>
<italic>i</italic>
</bold>
</sub> of size <italic>n</italic> and an input vector <bold>
<italic>u</italic>
</bold>
<sub>
<bold>
<italic>i</italic>
</bold>
</sub> of size <italic>m</italic>. The <italic>overall state vector (</italic>
<bold>
<italic>x</italic>
</bold>
<italic>)</italic> and <italic>overall control input vector (</italic>
<bold>
<italic>u</italic>
</bold>
<italic>)</italic> for the <italic>N</italic> agents are defined as concatenations of the individual state and input vectors (<xref ref-type="disp-formula" rid="e8">Equation 8</xref>):<disp-formula id="e8">
<mml:math id="m8">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mn mathvariant="bold">1</mml:mn>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mn mathvariant="bold">2</mml:mn>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mi mathvariant="bold-italic">N</mml:mi>
</mml:msub>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mi mathvariant="double-struck">R</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>&#xb7;</mml:mo>
<mml:mi>N</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mn mathvariant="bold">1</mml:mn>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mn mathvariant="bold">2</mml:mn>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mi mathvariant="bold-italic">N</mml:mi>
</mml:msub>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mi mathvariant="double-struck">R</mml:mi>
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:mo>&#xb7;</mml:mo>
<mml:mi>N</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
<label>(8)</label>
</disp-formula>
</p>
<p>The state space representation is given as follows (<xref ref-type="disp-formula" rid="e9">Equation 9</xref>) and the dynamics of each agent are governed by a common system matrix <inline-formula id="inf1">
<mml:math id="m9">
<mml:mrow>
<mml:mi mathvariant="bold-italic">A</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mi mathvariant="double-struck">R</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>n</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> and an input matrix <inline-formula id="inf2">
<mml:math id="m10">
<mml:mrow>
<mml:mi mathvariant="bold-italic">B</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mi mathvariant="double-struck">R</mml:mi>
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, constructed as block-diagonal matrices (<xref ref-type="disp-formula" rid="e10">Equation 10</xref>):<disp-formula id="e9">
<mml:math id="m11">
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold-italic">A</mml:mi>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="bold-italic">B</mml:mi>
<mml:mi mathvariant="bold-italic">u</mml:mi>
</mml:mrow>
</mml:math>
<label>(9)</label>
</disp-formula>
<disp-formula id="e10">
<mml:math id="m12">
<mml:mrow>
<mml:mi mathvariant="bold-italic">A</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:mi>A</mml:mi>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x2026;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mi>A</mml:mi>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x2026;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22f1;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x2026;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mi>A</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mi mathvariant="double-struck">R</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>&#xb7;</mml:mo>
<mml:mi>N</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>n</mml:mi>
<mml:mo>&#xb7;</mml:mo>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">B</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:mi>B</mml:mi>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x2026;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mi>B</mml:mi>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x2026;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22f1;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x2026;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mi>B</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mi mathvariant="double-struck">R</mml:mi>
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:mo>&#xb7;</mml:mo>
<mml:mi>N</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo>&#xb7;</mml:mo>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
<label>(10)</label>
</disp-formula>
</p>
<p>Each block <italic>A</italic> in the matrix <bold>
<italic>A</italic>
</bold> describes the internal dynamics of an individual agent, and each block <italic>B</italic> in the matrix <bold>
<italic>B</italic>
</bold> describes how the inputs affect the states of an individual agent.</p>
</sec>
<sec id="s2-3-2">
<title>2.3.2 Cost function</title>
<p>To fomulate the OCP, the following differentziable cost function (<xref ref-type="disp-formula" rid="e11">Equation 11</xref>) is used that penalizes the running costs <italic>l</italic>
<sub>
<italic>s</italic>
</sub>
<italic>(</italic>
<bold>
<italic>x</italic>
</bold>
<italic>(t),</italic>
<bold>
<italic>u</italic>
</bold>
<italic>(t))</italic> and the final stage cost <italic>l</italic>
<sub>
<italic>f</italic>
</sub>
<italic>(</italic>
<bold>
<italic>x</italic>
</bold>
<italic>(t</italic>
<sub>
<italic>f</italic>
</sub>
<italic>))</italic>. <italic>J</italic>
<sub>
<italic>OCP</italic>
</sub> is the total cost function to be minimized and thus is set 0 and formulated as follows:<disp-formula id="e11">
<mml:math id="m13">
<mml:mrow>
<mml:msub>
<mml:mi>J</mml:mi>
<mml:mrow>
<mml:mi>O</mml:mi>
<mml:mi>C</mml:mi>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mi>l</mml:mi>
<mml:mi>f</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>f</mml:mi>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mo>&#x222b;</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>f</mml:mi>
</mml:msub>
</mml:msubsup>
<mml:msub>
<mml:mi>l</mml:mi>
<mml:mi>s</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:math>
<label>(11)</label>
</disp-formula>subject to:<disp-formula id="e12">
<mml:math id="m14">
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mo>&#x2200;</mml:mo>
<mml:mi mathvariant="normal">t</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>f</mml:mi>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:math>
<label>(12)</label>
</disp-formula>
<disp-formula id="e13">
<mml:math id="m15">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mn mathvariant="bold">0</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
<label>(13)</label>
</disp-formula>
<disp-formula id="e14">
<mml:math id="m16">
<mml:mrow>
<mml:mi>h</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>f</mml:mi>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:math>
<label>(14)</label>
</disp-formula>
<disp-formula id="e15">
<mml:math id="m17">
<mml:mrow>
<mml:mi>g</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2264;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2200;</mml:mo>
<mml:mi mathvariant="normal">t</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>f</mml:mi>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:math>
<label>(15)</label>
</disp-formula>
</p>
<p>In this case, the running costs from the initial point in time (<italic>t</italic>
<sub>
<italic>0</italic>
</sub>) to the final state time (<italic>t</italic>
<sub>
<italic>f</italic>
</sub>) are integrated. <italic>l</italic>
<sub>
<italic>s</italic>
</sub> is the stage cost function, which depends on the state <bold>
<italic>x</italic>
</bold>
<italic>(t)</italic> and the control <bold>
<italic>u</italic>
</bold>
<italic>(t)</italic>. <italic>l</italic>
<sub>
<italic>f</italic>
</sub> is the end cost portion only depending on the final state <bold>
<italic>x</italic>
</bold>
<italic>(t</italic>
<sub>
<italic>f</italic>
</sub>
<italic>)</italic>. The differential equation <inline-formula id="inf3">
<mml:math id="m18">
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
</mml:mrow>
</mml:math>
</inline-formula> (t) is the dynamic system equation and describes the momentary change of the state vector. The term <inline-formula id="inf4">
<mml:math id="m19">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mn mathvariant="bold">0</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> defines the initial state. The function <italic>h(</italic>
<bold>
<italic>x</italic>
</bold>
<italic>(t))</italic> represents the end condition for the state <bold>
<italic>x</italic>
</bold> at the end time <italic>t</italic>
<sub>
<italic>f</italic>
</sub>. The inequation <inline-formula id="inf5">
<mml:math id="m20">
<mml:mrow>
<mml:mi>g</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> describes limitations of the system that must apply over the entire period of time.</p>
<p>For the implementation for model predictive control, the OCP must be time discretized, assuming the system input is constant during the sampling period, approximating the input signal by its staircase form. Therefore the multiple shooting method (<xref ref-type="bibr" rid="B3">Bock and Plitt, 1984</xref>) is used and employed directly due to the use of Acados. This method discretizes the time horizon into multiple segments and converts the OCP into a structured nonlinear programming problem with continuity constraints, enhancing numerical stability, parallel computation, and robustness to initial estimations.<disp-formula id="e16">
<mml:math id="m21">
<mml:mrow>
<mml:munder>
<mml:mi>min</mml:mi>
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mo>&#xb7;</mml:mo>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mo>&#xb7;</mml:mo>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:munder>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mo>&#x2211;</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>Z</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:munderover>
</mml:mstyle>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">f</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mi mathvariant="bold-italic">Q</mml:mi>
<mml:mn>2</mml:mn>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mo>&#x2211;</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>Z</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:munderover>
</mml:mstyle>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mrow>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">f</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mi mathvariant="bold-italic">R</mml:mi>
<mml:mn>2</mml:mn>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mi mathvariant="bold-italic">Z</mml:mi>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">f</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">Z</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">Q</mml:mi>
<mml:mi mathvariant="bold-italic">f</mml:mi>
</mml:msub>
<mml:mn>2</mml:mn>
</mml:msubsup>
</mml:mrow>
</mml:mrow>
</mml:math>
<label>(16)</label>
</disp-formula>subject to:<disp-formula id="e17">
<mml:math id="m23">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mrow>
<mml:mfenced open="" close="|" separators="|">
<mml:mrow>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold-italic">f</mml:mi>
<mml:mrow>
<mml:mi mathvariant="bold-italic">d</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">s</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>Z</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
<label>(17)</label>
</disp-formula>
<disp-formula id="e18">
<mml:math id="m24">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:math>
<label>(18)</label>
</disp-formula>
<disp-formula id="e19">
<mml:math id="m25">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mi mathvariant="bold-italic">min</mml:mi>
</mml:msub>
<mml:mo>&#x2264;</mml:mo>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2264;</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mi mathvariant="bold-italic">max</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>Z</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
<label>(19)</label>
</disp-formula>
<disp-formula id="e20">
<mml:math id="m26">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mi mathvariant="bold-italic">min</mml:mi>
</mml:msub>
<mml:mo>&#x2264;</mml:mo>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2264;</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mi mathvariant="bold-italic">max</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>Z</mml:mi>
</mml:mrow>
</mml:math>
<label>(20)</label>
</disp-formula>
<disp-formula id="e21">
<mml:math id="m27">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mi>&#x3d1;</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mi>&#x3b4;</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:mo>&#x2265;</mml:mo>
<mml:msubsup>
<mml:mi>d</mml:mi>
<mml:mi mathvariant="italic">min</mml:mi>
<mml:mn>2</mml:mn>
</mml:msubsup>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3b4;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>N</mml:mi>
<mml:mtext>&#x2003;</mml:mtext>
<mml:mi>&#x3d1;</mml:mi>
<mml:mo>&#x2260;</mml:mo>
<mml:mi>&#x3b4;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>Z</mml:mi>
</mml:mrow>
</mml:math>
<label>(21)</label>
</disp-formula>
</p>
<p>
<xref ref-type="disp-formula" rid="e16">Equation 16</xref> shows the discretized form of the OCP formulation. Here, the deviation between the state <bold>
<italic>x</italic>
</bold> and the reference state <bold>
<italic>x</italic>
</bold>
<sub>
<bold>
<italic>ref</italic>
</bold>
</sub> is minimized, as well as the deviation between the control input <bold>
<italic>u</italic>
</bold> and the reference control input <bold>
<italic>u</italic>
</bold>
<sub>
<bold>
<italic>ref</italic>
</bold>
</sub>, which is set to zero because there is no explicit reference and the control effort should be kept as low as possible. <inline-formula id="inf6">
<mml:math id="m28">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;" separators="|">
<mml:mrow>
<mml:mo>&#xb7;</mml:mo>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mi mathvariant="bold-italic">Q</mml:mi>
<mml:mn>2</mml:mn>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula id="inf7">
<mml:math id="m29">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;" separators="|">
<mml:mrow>
<mml:mo>&#xb7;</mml:mo>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mi mathvariant="bold-italic">R</mml:mi>
<mml:mn>2</mml:mn>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula> are weighted quadratic costs, with weighting matrices <bold>
<italic>Q</italic>
</bold> and <bold>
<italic>R</italic>
</bold>. Instead of integrating over time <italic>t</italic>, the time increments <italic>k</italic> from 0 to <italic>Z</italic> are summed up. <xref ref-type="disp-formula" rid="e17">Equation 17</xref> replaces the continuous differential equation, where <bold>
<italic>f</italic>
</bold>
<sub>
<bold>
<italic>dis</italic>
</bold>
</sub> represents the discretized model of the dynamics. <xref ref-type="disp-formula" rid="e18">Equation 18</xref> describes the initial or current system state. <xref ref-type="disp-formula" rid="e19">Equations 19</xref>, <xref ref-type="disp-formula" rid="e20">20</xref> describe the control input and state restrictions, respectively. These constraints include the dynamic model of the system, initial state conditions, and box constraints on both the inputs (acceleration) and states (position and velocity) to ensure they remain within their feasible bounds. The position constraints represent the grids&#x2019;s size where the movers can operate. <xref ref-type="disp-formula" rid="e21">Equation 21</xref> shows the collision avoidance constraint, which prohibits all N agents from reducing their distance to each other agent below a minimum value <italic>d</italic>
<sub>
<italic>min</italic>
</sub>. This collision constraint is further explained in the following.</p>
</sec>
<sec id="s2-3-3">
<title>2.3.3 Collision avoidance constraints</title>
<p>Due to collision avoidance constraints, movers are not allowed to operate in areas occupied by other movers and obstacles. This restriction makes the set of their motion non-convex, leading to a collision avoidance optimization problem that is inherently non-convex. Consequently, this problem falls into the category NP-hard problems (<xref ref-type="bibr" rid="B7">Canny, 1988</xref>).</p>
<p>Mathematically, the collision avoidance constraint between two movers <bold>M</bold>
<sub>
<bold>1</bold>
</sub> and <bold>M</bold>
<sub>
<bold>2</bold>
</sub> can be modeled using the Euclidean distance. <italic>p</italic>
<sub>
<italic>1</italic>
</sub>
<italic>(t)</italic> and <italic>p</italic>
<sub>
<italic>2</italic>
</sub>
<italic>(t)</italic> denote the positions of <bold>M</bold>
<sub>
<bold>1</bold>
</sub> and <bold>M</bold>
<sub>
<bold>2</bold>
</sub> at time <italic>t</italic>, respectively. The collision avoidance constraint ensures that the squared distance between <bold>M</bold>
<sub>
<bold>1</bold>
</sub> and <bold>M</bold>
<sub>
<bold>2</bold>
</sub> at any time <italic>t</italic> is greater than the square of a minimum safe distance <italic>d</italic>
<sub>
<italic>min</italic>
</sub> (<xref ref-type="disp-formula" rid="e22">Equation 22</xref>):<disp-formula id="e22">
<mml:math id="m30">
<mml:mrow>
<mml:mi>g</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mn>2</mml:mn>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mi>d</mml:mi>
<mml:mi mathvariant="italic">min</mml:mi>
<mml:mn>2</mml:mn>
</mml:msubsup>
<mml:mo>&#x2265;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2200;</mml:mo>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:math>
<label>(22)</label>
</disp-formula>
</p>
<p>In the event that more than two movers are active within a feasible space, as shown in <xref ref-type="fig" rid="F11">Figure 11</xref>, the collision avoidance constraint <italic>g(x(t))</italic> is extended accordingly for each respective mover relationship. Further constraints are defined to restrict the x- and y-dimensions of the feasible space.</p>
<fig id="F11" position="float">
<label>FIGURE 11</label>
<caption>
<p>Mover collision avoidance constraint illustration.</p>
</caption>
<graphic xlink:href="fcteg-06-1645918-g011.tif">
<alt-text content-type="machine-generated">Diagram illustrating an accessible space grid of 960mm by 720mm. Four points labeled P1(t), P2(t), P3(t), and P4(t) are within the grid. Each point is surrounded by a restricted space with a radius of 155mm. The collision avoidance constraint establishes a minimum distance, d_min, of 200mm between points. Axes are labeled X and Y.</alt-text>
</graphic>
</fig>
<p>Acados uses Sequential Quadratic Programming (SQP) for solving the OCP. SQP solves nonlinear optimization problems through a sequence of quadratic approximations, achieving superlinear convergence for smooth problems (<xref ref-type="bibr" rid="B31">Boggs and Tolle, 1995</xref>; <xref ref-type="bibr" rid="B32">Nocedal and Wright, 2006</xref>). This method iteratively linearizes the problem to update <bold>
<italic>u</italic>
</bold>
<italic>(&#x3c4;)</italic>, efficiently computing optimal inputs. SQP is advantageous for motion planning in autonomous systems due to its computational efficiency, predictable load, and manageable memory requirements, making it suitable for real-time applications in embedded systems (Nocedal and Wright, 2006). Although Interior Point Methods (IPM) can application-dependent outperform SQP, their complexity and higher memory demands limit their practicality in embedded environments. For real-time tasks, the Real-Time Iteration (RTI) scheme (<xref ref-type="bibr" rid="B33">Diehl et al., 2005</xref>) provides suboptimal solutions in each time step, ensuring feasibility within small sampling times.</p>
<p>The SQP method addresses problems with nonlinear constraints by iteratively solving Quadratic Programming (QP) subproblems. In each subproblem, the objective function is approximated quadratically, and the constraints are linearized. For collision avoidance constraints, this involves linearizing the squared Euclidean distance constraint at each iteration and incorporating it into the QP subproblem. In this context, the High-Performance Interior Point Method (HPIPM) solver (<xref ref-type="bibr" rid="B34">Frison and Diehl, 2020</xref>) is utilized for solving these QP subproblems.</p>
</sec>
<sec id="s2-3-4">
<title>2.3.4 Implementation workflow</title>
<p>The implementation of the CMPC into a PLC environment from Beckhoff Automation (TwinCAT) involves multiple integration steps, using both software and hardware components. <xref ref-type="fig" rid="F12">Figure 12</xref> shows the toolchain for developing and deploying the CMPC algorithm.</p>
<fig id="F12" position="float">
<label>FIGURE 12</label>
<caption>
<p>CMPC algorithm deployment toolchain for Beckhoff Automation systems.</p>
</caption>
<graphic xlink:href="fcteg-06-1645918-g012.tif">
<alt-text content-type="machine-generated">Flowchart illustrating a deployment toolchain for MATLAB and Simulink. It starts with the Acados MATLAB Interface using CasADi, generating C-Code, followed by S-Function Builder, TE1400 TwinCAT Simulink Target, and ending with a TwinCAT Module Executable (.tmx).</alt-text>
</graphic>
</fig>
<p>The described optimization problem is exported to a JSON file, which serves as a basis for rendering templates via the Tera renderer. The Acados interface includes a MEX wrapper that, along with the generated C code, allows for integration with MATLAB. The next stage involves simulating and deploying the generated C code in Simulink. Since TwinCAT does not allow direct use of external libraries, the S-Function builder in Simulink is used to incorporate the algorithms written in C. This integration is crucial for testing, validating, and deploying the CMPC algorithm in a simulated environment. To ensure real-time execution on Beckhoff hardware, the TE1400 TwinCAT 3 Target for Simulink is used. This tool generates real-time executable code from the Simulink models using Simulink Coder, bridging the gap between simulation and real-world deployment. The result of this automatic code generation process is a function block that can be utilized within the TwinCAT environment. This function block is illustrated in <xref ref-type="sec" rid="s12">Supplementary Material S5</xref> and encapsulates the entire CMPC algorithm and provides an interface for integration with other components in the control system. The block includes inputs and outputs necessary for executing the CMPC logic, allowing seamless interaction with the hardware and facilitating real-time control operations.</p>
</sec>
</sec>
</sec>
<sec id="s3">
<title>3 Testing and validation</title>
<p>To demonstrate the capabilities of the developed CB-MPC framework, a magnetic planar drive system is utilized with a 3 x 4 tile configuration and with four active movers representing the agents; compare <xref ref-type="fig" rid="F2">Figure 2</xref>. Physical dimensions are illustrated in <xref ref-type="fig" rid="F11">Figure 11</xref>. For evaluating the CB-MPC performance regarding MAPF success rate, computation time and robustness, 10 path finding scenarios are defined representing different challenges for the solver. <xref ref-type="fig" rid="F13">Figure 13</xref> illustrates the setup for each scenario, highlighting the initial positions (&#x25a0;) and target positions (<bold>x</bold>) of each mover (<bold>M</bold>
<sub>
<bold>1</bold>
</sub> <bold>&#x2013; M</bold>
<sub>
<bold>4</bold>
</sub>). Movers that are locked in place but are still part of the MAPF problem are marked with an anchor. Tiles that are defined as not accessible obstacles are blackened.</p>
<fig id="F13" position="float">
<label>FIGURE 13</label>
<caption>
<p>CB-MPC testing scenarios on a magnetic planar drive system.</p>
</caption>
<graphic xlink:href="fcteg-06-1645918-g013.tif">
<alt-text content-type="machine-generated">Grid of scenarios A1 to B5 illustrating paths of four movers across 12 tiles. Scenarios A1-A5 lack obstacles and are partially fixed in A4-A5, while B1-B5 feature black tile obstacles and are partially fixed in B1. Paths are marked by colored lines showing each mover's trajectory.</alt-text>
</graphic>
</fig>
<sec id="s3-1">
<title>3.1 Setup and configuration</title>
<p>The formulation of the optimization problem for the experimental setup is presented as follows. The objective is to minimize the deviation of each agent&#x2019;s state and control inputs from their respective reference trajectories while considering collision avoidance and constraints on states and control inputs. The time-discretized OPC is defined as follows (<xref ref-type="disp-formula" rid="e23">Equation 23</xref>):<disp-formula id="e23">
<mml:math id="m31">
<mml:mrow>
<mml:munder>
<mml:mi>min</mml:mi>
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mo>&#xb7;</mml:mo>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mo>&#xb7;</mml:mo>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mi>x</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mi>u</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mi>c</mml:mi>
</mml:msub>
</mml:mrow>
</mml:munder>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mo>&#x2211;</mml:mo>
<mml:mrow>
<mml:mi>&#x3d1;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:munderover>
</mml:mstyle>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mo>&#x2211;</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:msub>
<mml:mi>H</mml:mi>
<mml:mi>p</mml:mi>
</mml:msub>
</mml:munderover>
</mml:mstyle>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mi>&#x3d1;</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mrow>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">f</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">Q</mml:mi>
<mml:mi>&#x3d1;</mml:mi>
</mml:msub>
<mml:mn>2</mml:mn>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
</mml:mrow>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mo>&#x2211;</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mi>H</mml:mi>
<mml:mi>p</mml:mi>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:munderover>
</mml:mstyle>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mi>&#x3d1;</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mrow>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">f</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">R</mml:mi>
<mml:mi>&#x3d1;</mml:mi>
</mml:msub>
<mml:mn>2</mml:mn>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold-italic">&#x3c1;</mml:mi>
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mo>&#x2211;</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:msub>
<mml:mi>H</mml:mi>
<mml:mi>p</mml:mi>
</mml:msub>
</mml:munderover>
</mml:mstyle>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold-italic">&#x3c1;</mml:mi>
<mml:mrow>
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mo>&#x2211;</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mi>H</mml:mi>
<mml:mi>p</mml:mi>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:munderover>
</mml:mstyle>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold-italic">&#x3c1;</mml:mi>
<mml:mrow>
<mml:mi>c</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mo>&#x2211;</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:msub>
<mml:mi>H</mml:mi>
<mml:mi>p</mml:mi>
</mml:msub>
</mml:munderover>
</mml:mstyle>
<mml:msup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mrow>
<mml:mi>c</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mn>2</mml:mn>
</mml:msup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:math>
<label>(23)</label>
</disp-formula>subject to:<disp-formula id="e24">
<mml:math id="m32">
<mml:mrow>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mi>w</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mi>w</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>3</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>4</mml:mn>
<mml:mo>,</mml:mo>
</mml:mrow>
</mml:math>
<label>(24)</label>
</disp-formula>
<disp-formula id="e25">
<mml:math id="m33">
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>150</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2264;</mml:mo>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mi>w</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2264;</mml:mo>
<mml:mn>150</mml:mn>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>8</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>H</mml:mi>
</mml:mrow>
<mml:mi>p</mml:mi>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
</mml:mrow>
</mml:math>
<label>(25)</label>
</disp-formula>
<disp-formula id="e26">
<mml:math id="m34">
<mml:mrow>
<mml:mn>90</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2264;</mml:mo>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mi>w</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2264;</mml:mo>
<mml:mn>870</mml:mn>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>5</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>9</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>13</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>H</mml:mi>
</mml:mrow>
<mml:mi>p</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
</mml:mrow>
</mml:math>
<label>(26)</label>
</disp-formula>
<disp-formula id="e27">
<mml:math id="m35">
<mml:mrow>
<mml:mn>90</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2264;</mml:mo>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mi>w</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2264;</mml:mo>
<mml:mn>630</mml:mn>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>2</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>6</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>10</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>14</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>H</mml:mi>
</mml:mrow>
<mml:mi>p</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
</mml:mrow>
</mml:math>
<label>(27)</label>
</disp-formula>
<disp-formula id="e28">
<mml:math id="m36">
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>250</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2264;</mml:mo>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mi>w</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2264;</mml:mo>
<mml:mn>250</mml:mn>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>3</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>4</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>7</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>8</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>11</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>12</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>15</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>16</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>H</mml:mi>
</mml:mrow>
<mml:mi>p</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
</mml:mrow>
</mml:math>
<label>(28)</label>
</disp-formula>
<disp-formula id="e29">
<mml:math id="m37">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mi>w</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mi>w</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:mo>&#x2265;</mml:mo>
<mml:msubsup>
<mml:mi>d</mml:mi>
<mml:mi mathvariant="italic">min</mml:mi>
<mml:mn>2</mml:mn>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mrow>
<mml:mi>c</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3b4;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>3</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>4</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
<mml:mo>&#x2260;</mml:mo>
<mml:mi>&#x3b4;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>H</mml:mi>
</mml:mrow>
<mml:mi>p</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
<label>(29)</label>
</disp-formula>
<disp-formula id="e30">
<mml:math id="m38">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2265;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>16</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>H</mml:mi>
<mml:mi>p</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
</mml:mrow>
</mml:math>
<label>(30)</label>
</disp-formula>
<disp-formula id="e31">
<mml:math id="m39">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2265;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>8</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>H</mml:mi>
<mml:mi>p</mml:mi>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
</mml:mrow>
</mml:math>
<label>(31)</label>
</disp-formula>
<disp-formula id="e32">
<mml:math id="m40">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mrow>
<mml:mi>c</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x7c;</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2265;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>&#x3d1;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3b4;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>3</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>4</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>H</mml:mi>
<mml:mi>p</mml:mi>
</mml:msub>
<mml:mo>.</mml:mo>
</mml:mrow>
</mml:math>
<label>(32)</label>
</disp-formula>
</p>
<p>
<xref ref-type="disp-formula" rid="e24">Equation 24</xref> declare discrete states for each agent. <xref ref-type="disp-formula" rid="e25">Equation 25</xref> limits the acceleration of the movers to &#xb1;150&#xa0;mm/s<sup>2</sup>. <xref ref-type="disp-formula" rid="e26">Equations 26</xref>, <xref ref-type="disp-formula" rid="e27">27</xref> limit the accessible area of the planar drive system in X- and Y-direction. <xref ref-type="disp-formula" rid="e28">Equation 28</xref> limits the speeds of the movers to &#xb1;250&#xa0;mm/s. <xref ref-type="disp-formula" rid="e29">Equation 29</xref> defines the minimum distance that all movers must maintain to all other movers. <italic>d</italic>
<sub>
<italic>min</italic>
</sub> is specified to 200&#xa0;mm during all tests, compare <xref ref-type="fig" rid="F11">Figure 11</xref>. <inline-formula id="inf8">
<mml:math id="m41">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mi>x</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mi>u</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>&#x3f5;</mml:mi>
<mml:mi>c</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> are slack variables that allow for constraint violation within specified bounds, with corresponding penalty terms included in the cost function to minimize these violations (<xref ref-type="disp-formula" rid="e30">Equations 30</xref>&#x2013;<xref ref-type="disp-formula" rid="e32">32</xref>). Slack variables are relevant because otherwise the optimization solver can become infeasible during operation. Once the solver is infeasible, it is no longer able to find solutions. Since real operating conditions are often more stringent or unpredictable than in the simulation, slack variables allow boundary conditions to be violated in a controlled manner. This enables the MPC to work on a real controller.</p>
<p>The state vector for the four movers, with their respective positions and velocities is given by (<xref ref-type="disp-formula" rid="e33">Equation 33</xref>):<disp-formula id="e33">
<mml:math id="m42">
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>v</mml:mi>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>v</mml:mi>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>v</mml:mi>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>v</mml:mi>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mn>3</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mn>3</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>v</mml:mi>
<mml:mrow>
<mml:mn>3</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>v</mml:mi>
<mml:mrow>
<mml:mn>3</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mn>4</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mn>4</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>v</mml:mi>
<mml:mrow>
<mml:mn>4</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>v</mml:mi>
<mml:mrow>
<mml:mn>4</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:math>
<label>(33)</label>
</disp-formula>
</p>
<p>The <bold>
<italic>Q</italic>
</bold> matrix used for the state weights is a diagonal matrix of size 16 &#xd7; 16, where the weights 1 and 0,6 alternate for position and velocity respectively. This weighting prioritizes the position limits over the velocity limits. The control input vector is given by (<xref ref-type="disp-formula" rid="e34">Equation 34</xref>):<disp-formula id="e34">
<mml:math id="m43">
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mn>3</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mn>3</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mn>4</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mn>4</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:math>
<label>(34)</label>
</disp-formula>
</p>
<p>The <bold>
<italic>R</italic>
</bold> matrix used for the accelarations weights is a diagonal matrix of size 8 &#xd7; 8 with the following structure (<xref ref-type="disp-formula" rid="e35">Equation 35</xref>):<disp-formula id="e35">
<mml:math id="m44">
<mml:mrow>
<mml:mi mathvariant="bold-italic">Q</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:mn>1</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ef;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>1</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ef;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ef;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22f1;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ef;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mi mathvariant="double-struck">R</mml:mi>
<mml:mrow>
<mml:mn>4</mml:mn>
<mml:mo>&#xb7;</mml:mo>
<mml:mn>4</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>4</mml:mn>
<mml:mo>&#xb7;</mml:mo>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">R</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="[" close="]" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ef;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ef;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ef;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22f1;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ee;</mml:mo>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mo>&#x22ef;</mml:mo>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mi mathvariant="double-struck">R</mml:mi>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mo>&#xb7;</mml:mo>
<mml:mn>4</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>2</mml:mn>
<mml:mo>&#xb7;</mml:mo>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
<label>(35)</label>
</disp-formula>
</p>
<p>The CB-MPC framework is further configured with the hyperparameter settings listed in <xref ref-type="table" rid="T1">Table 1</xref>.</p>
<table-wrap id="T1" position="float">
<label>TABLE 1</label>
<caption>
<p>CB-MPC hyperparameters.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left">Parameter</th>
<th align="left">Value</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">Prediction horizon</td>
<td align="left">10</td>
</tr>
<tr>
<td align="left">Time horizon</td>
<td align="left">1&#xa0;s</td>
</tr>
<tr>
<td align="left">Sampling time</td>
<td align="left">0.1&#xa0;s</td>
</tr>
<tr>
<td align="left">nlp_solver</td>
<td align="left">Sqp_rti (max iteration one)</td>
</tr>
<tr>
<td align="left">nlp_solver warm start</td>
<td align="left">yes</td>
</tr>
<tr>
<td align="left">nlp_solver_tol_stat</td>
<td align="left">1E-3</td>
</tr>
<tr>
<td align="left">nlp_solver_tol_eq</td>
<td align="left">1E-3</td>
</tr>
<tr>
<td align="left">nlp_solver_tol_ineq</td>
<td align="left">1E-3</td>
</tr>
<tr>
<td align="left">nlp_solver_tol_comp</td>
<td align="left">1E-3</td>
</tr>
<tr>
<td align="left">nlp_solver step length</td>
<td align="left">1</td>
</tr>
<tr>
<td align="left">qp_solver</td>
<td align="left">full condensing HPIPM</td>
</tr>
<tr>
<td align="left">qp_solver iter max</td>
<td align="left">20</td>
</tr>
<tr>
<td align="left">qp_solver warm start</td>
<td align="left">1</td>
</tr>
<tr>
<td align="left">regularize method</td>
<td align="left">CONVEXIFY</td>
</tr>
<tr>
<td align="left">nlp_solver exact hessian</td>
<td align="left">False</td>
</tr>
</tbody>
</table>
</table-wrap>
</sec>
<sec id="s3-2">
<title>3.2 Path finding performance evaluation</title>
<p>
<xref ref-type="table" rid="T2">Table 2</xref> presents the performance evaluation of the CB-MPC framework across a set of simple (A1-A5) and complex scenarios (B1-B5); compare <xref ref-type="fig" rid="F13">Figure 13</xref>. These results highlight the framework&#x2019;s ability to manage collision avoidance in MAS under different conditions.</p>
<table-wrap id="T2" position="float">
<label>TABLE 2</label>
<caption>
<p>Performance evaluation of CB-MPC across different scenarios.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="center">Scenario</th>
<th align="center">Success</th>
<th align="center">Average ICBS Computation Time (s)</th>
<th align="center">ICBS Solution Cost</th>
<th align="center">Average CMPC Computation Time CMPC (ms)</th>
<th align="center">Makespan (s)</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="center">A1</td>
<td align="center">True</td>
<td align="center">0.014</td>
<td align="center">20</td>
<td align="center">19.71</td>
<td align="center">16.50</td>
</tr>
<tr>
<td align="center">A2</td>
<td align="center">True</td>
<td align="center">0.023</td>
<td align="center">12</td>
<td align="center">19.76</td>
<td align="center">16.00</td>
</tr>
<tr>
<td align="center">A3</td>
<td align="center">True</td>
<td align="center">0.099</td>
<td align="center">11</td>
<td align="center">19.75</td>
<td align="center">16.10</td>
</tr>
<tr>
<td align="center">A4</td>
<td align="center">True</td>
<td align="center">0.034</td>
<td align="center">12</td>
<td align="center">19.75</td>
<td align="center">21.20</td>
</tr>
<tr>
<td align="center">A5</td>
<td align="center">True</td>
<td align="center">5,814</td>
<td align="center">18</td>
<td align="center">19.75</td>
<td align="center">26.20</td>
</tr>
<tr>
<td align="center">B1</td>
<td align="center">True</td>
<td align="center">50,217</td>
<td align="center">26</td>
<td align="center">19.76</td>
<td align="center">25.90</td>
</tr>
<tr>
<td align="center">B2</td>
<td align="center">True</td>
<td align="center">0.018</td>
<td align="center">15</td>
<td align="center">19.75</td>
<td align="center">17.00</td>
</tr>
<tr>
<td align="center">B3</td>
<td align="center">True</td>
<td align="center">14,169</td>
<td align="center">34</td>
<td align="center">19.75</td>
<td align="center">35.90</td>
</tr>
<tr>
<td align="center">B4</td>
<td align="center">True</td>
<td align="center">228,815</td>
<td align="center">34</td>
<td align="center">20.60</td>
<td align="center">38.20</td>
</tr>
<tr>
<td align="center">B5</td>
<td align="center">True</td>
<td align="center">848,343</td>
<td align="center">36</td>
<td align="center">21.31</td>
<td align="center">39.10</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>All scenarios achieved a 100% success rate, indicating that CB-MPC can reliably finds collision-free paths. Even Scenario B5, where only one feasible path solution exists, could be solved. The ICBS solution times range from 0.014 to 5,814&#xa0;s for the A scenarios and from 0.018 to 848,343&#xa0;s for the B scenarios, indicating the higher complexity. The ICBS solution costs range from 11 to 36. The average CMPC computation times are stable around 20&#xa0;ms. The makespan, describing the path execution time, ranges from 16 to 39.1&#xa0;s.</p>
<p>A video showing the motion planning of the movers for all ten scenarios is accessible via the following link: <ext-link ext-link-type="uri" xlink:href="https://owncloud.fraunhofer.de/index.php/s/XRJ02l5Db5MjjOo">https://owncloud.fraunhofer.de/index.php/s/XRJ02l5Db5MjjOo</ext-link>. This video provides a demonstration of the CB-MPC framework&#x2019;s performance across different scenarios.</p>
<p>In addition to the uninterrupted execution of all scenarios, another run was performed with all scenarios, in which Mover <bold>M</bold>
<sub>
<bold>1</bold>
</sub> was temporarily blocked during the execution of the paths by holding it manually in place and then releasing it again after a few seconds. This simulates an external disturbance. In all scenarios, it was observed that this disturbance only affected Mover <bold>M</bold>
<sub>
<bold>1</bold>
</sub> if Mover <bold>M</bold>
<sub>
<bold>1</bold>
</sub> did not force other movers to stop due to a blocked path. In no scenario did the disturbance cause a collision or an error. After the disturbance, the paths were completed identically to the undisturbed trial. The makespan was extended in accordance with the duration of the disturbance.</p>
<p>The observations regarding the trajectories executed, which can be seen in the linked videos, are described and discussed hereafter.</p>
</sec>
</sec>
<sec sec-type="discussion" id="s4">
<title>4 Discussion</title>
<p>The successful solution of all scenarios demonstrates the suitability of ICBS for offline calculation of mover paths and thus for solving the MAPF problems. The test series with external disturbance and the result that no collisions or errors were generated demonstrate the suitability of MPC for the live execution of the path plans. A proof of principle that CB-MPC is suitable for motion planning on multi-agent systems was thus experimentally provided using a magnetic planar drive MAS demonstrator.</p>
<p>The performance evaluation of the ICBS in <xref ref-type="table" rid="T2">Table 2</xref> shows that the solution of some MAPF scenarios (A5, B1, B3, B4, B5) requires significantly more computing time (&#x3e;1&#xa0;s) and may therefore not be suitable for applications requiring fast response times. It was observed that the increased computing time occurs more frequently with specific properties of the scenarios: Firstly, when two movers must change positions in a narrow space, which causes both movers to move further away from their destination to enable the position swap. Secondly, when movers that have already reached their destination, must move away so that the other movers can reach their destination. Thirdly, when only few theoretical solutions exist for the MAPF problem in general. From these observations, it can be deduced that the quotient of free space and space blocked by movers should be above a certain value in order to reduce the complexity of the MAPF problem. At the same time, it must also be ensured that there are as few bottlenecks as possible. These bottleneck locations can be identified by analyzing all durations that individual tiles are blocked by traveling movers within a MAPF scenario. This could be visualized with a traffic heatmap. If these two aspects are considered when designing the layout of the system, the solution speed can be increased.</p>
<p>The number of agents involved in route planning also affects the performance of the solver. The scalability of the algorithm is a major limitation. With increasing the number of movers on the system, the number of collision constraints grows quadratically, significantly raising computational complexity. This increase leads to a greater number of optimization variables that the CB-MPC must solve in each iteration, resulting in higher computational loads. Also, more SQP iterations are required for the MPC to find acceptable solutions with more agents. <xref ref-type="sec" rid="s12">Supplementary Material S6</xref> investigates the average MPC computation time depended on the number of agents and shows an exponential growth from 19.7&#xa0;ms (4 Mover) to 2,866.9&#xa0;ms (10 Mover). This would accordingly increase the MAPF makespan drastically. This underscores the need for advanced heuristics and distributed control strategies to maintain scalability and enhance performance. Approaches to modify the algorithm to a non-optimal solver are also conceivable in order to increase scalability.</p>
<p>One criticism of this work is that no direct comparison was made between different established MAPF approaches and the CB-MPC developed. A direct comparison using the same scenarios would provide more quantitative statements about the performance and potentials. Such comparative studies should be carried out in the future in order to provide evidence that the state of the art was improved.</p>
</sec>
<sec sec-type="conclusion" id="s5">
<title>5 Conclusion</title>
<p>Building upon the results presented, the CB-MPC framework demonstrates its capability to handle complex multi-agent pathfinding and collision avoidance in dynamic environments and guarantees optimality. The integration of ICBS with MPC proves to be effective in balancing optimal path planning and real-time adaptability, which are crucial in modern industrial applications. CB-MPC allows agents to navigate between stations and perform nonlinear process steps without collisions. This adaptability is particularly beneficial in scenarios requiring customized processes and dynamic routing. The inclusion of a minimum jerk trajectory optimizer ensures smooth paths and reduces abrupt movements, enhancing overall system safety.</p>
<p>The main limitations of CB-MPC are linked to its scalability issues. As the number of agents grows, the framework struggles with the exponential increase in collision constraints and optimization variables, impacting real-time performance. Reliance on Euclidean distance for collision detection may introduce inefficiencies. Overall, CB-MPC offers a practical approach to multi-agent pathfinding and collision avoidance but requires further development to address its scalability limitations.</p>
</sec>
</body>
<back>
<sec sec-type="data-availability" id="s6">
<title>Data availability statement</title>
<p>The original contributions presented in the study are included in the article/<xref ref-type="sec" rid="s12">Supplementary Material</xref>, further inquiries can be directed to the corresponding author.</p>
</sec>
<sec sec-type="author-contributions" id="s7">
<title>Author contributions</title>
<p>KJ: Conceptualization, Data curation, Investigation, Methodology, Project administration, Supervision, Validation, Visualization, Writing &#x2013; original draft, Writing &#x2013; review and editing. AH: Conceptualization, Formal Analysis, Investigation, Methodology, Software, Validation, Writing &#x2013; original draft. CS: Conceptualization, Data curation, Methodology, Supervision, Writing &#x2013; review and editing. FE: Conceptualization, Methodology, Software, Supervision, Writing &#x2013; review and editing. LF: Investigation, Methodology, Software, Writing &#x2013; review and editing. LH: Project administration, Writing &#x2013; review and editing. BN: Funding acquisition, Project administration, Resources, Writing &#x2013; review and editing. RS: Resources, Writing &#x2013; review and editing, Funding acquisition.</p>
</sec>
<sec sec-type="funding-information" id="s8">
<title>Funding</title>
<p>The author(s) declare that no financial support was received for the research and/or publication of this article.</p>
</sec>
<sec sec-type="COI-statement" id="s9">
<title>Conflict of interest</title>
<p>The authors declare that the research was conducted in the absence of any commercial or financial relationships that could be construed as a potential conflict of interest.</p>
</sec>
<sec sec-type="ai-statement" id="s10">
<title>Generative AI statement</title>
<p>The author(s) declare that Generative AI was used in the creation of this manuscript. Generative AI was only used for translations and to help with linguistic phrasing.</p>
</sec>
<sec sec-type="disclaimer" id="s11">
<title>Publisher&#x2019;s note</title>
<p>All claims expressed in this article are solely those of the authors and do not necessarily represent those of their affiliated organizations, or those of the publisher, the editors and the reviewers. Any product that may be evaluated in this article, or claim that may be made by its manufacturer, is not guaranteed or endorsed by the publisher.</p>
</sec>
<sec sec-type="supplementary-material" id="s12">
<title>Supplementary material</title>
<p>The Supplementary Material for this article can be found online at: <ext-link ext-link-type="uri" xlink:href="https://www.frontiersin.org/articles/10.3389/fcteg.2025.1645918/full#supplementary-material">https://www.frontiersin.org/articles/10.3389/fcteg.2025.1645918/full&#x23;supplementary-material</ext-link>
</p>
<supplementary-material xlink:href="DataSheet1.pdf" id="SM1" mimetype="application/pdf" xmlns:xlink="http://www.w3.org/1999/xlink"/>
</sec>
<ref-list>
<title>References</title>
<ref id="B1">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Albin Rajasingham</surname>
<given-names>T.</given-names>
</name>
</person-group> (<year>2021</year>). <source>Nonlinear model predictive control of combustion engines: from fundamentals to applications</source>. <publisher-loc>Cham</publisher-loc>: <publisher-name>Springer International Publishing AG</publisher-name>. <comment>Available online at: <ext-link ext-link-type="uri" xlink:href="https://ebookcentral.proquest.com/lib/kxp/detail.action?docID=6577310">https://ebookcentral.proquest.com/lib/kxp/detail.action?docID&#x3d;6577310</ext-link>.</comment>
</citation>
</ref>
<ref id="B2">
<citation citation-type="book">
<collab>Beckhoff Automation GmbH and Co. KG</collab> (<year>2025</year>). <source>TwinCAT 3 ADS introduction</source>, <publisher-loc>Verl, Germany</publisher-loc>: <publisher-name>Beckhoff Automation GmbH and Co</publisher-name>. <comment>Available online at: <ext-link ext-link-type="uri" xlink:href="https://download.beckhoff.com/download/Document/Catalog/Beckhoff_TwinCAT3_d.pdf">https://download.beckhoff.com/download/Document/Catalog/Beckhoff_TwinCAT3_d.pdf</ext-link> (Accessed 3 June 2025)</comment>.</citation>
</ref>
<ref id="B3">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Bock</surname>
<given-names>H. G.</given-names>
</name>
<name>
<surname>Plitt</surname>
<given-names>K. J.</given-names>
</name>
</person-group> (<year>1984</year>). <article-title>A multiple shooting algorithm for direct solution of optimal control problems</article-title>. <source>IFAC Proc. Vol.</source> <volume>17</volume> (<issue>2</issue>), <fpage>1603</fpage>&#x2013;<lpage>1608</lpage>. <pub-id pub-id-type="doi">10.1016/s1474-6670(17)61205-9</pub-id>
</citation>
</ref>
<ref id="B31">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Boggs</surname>
<given-names>P. T.</given-names>
</name>
<name>
<surname>Tolle</surname>
<given-names>J. W.</given-names>
</name>
</person-group> (<year>1995</year>). <article-title>Sequential quadratic programming</article-title>, <source>Acta Numerica</source> <volume>4</volume>, <fpage>1</fpage>&#x2013;<lpage>51</lpage>.</citation>
</ref>
<ref id="B4">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Boyarski</surname>
<given-names>E.</given-names>
</name>
<name>
<surname>Felner</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Sharon</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Stern</surname>
<given-names>R.</given-names>
</name>
</person-group> (<year>2015</year>). <article-title>Don&#x27;t split, try to work it out: bypassing conflicts in multi-agent pathfinding</article-title>. <source>Proc. Int. Conf. Automated Plan. Sched.</source> <volume>25</volume>, <fpage>47</fpage>&#x2013;<lpage>51</lpage>. <pub-id pub-id-type="doi">10.1609/icaps.v25i1.13725</pub-id>
</citation>
</ref>
<ref id="B5">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Brecher</surname>
<given-names>C.</given-names>
</name>
</person-group> (<year>2012</year>). <source>Integrative production technology for high-wage countries</source>. <publisher-loc>Berlin, Heidelberg</publisher-loc>: <publisher-name>Springer Berlin Heidelberg</publisher-name>.</citation>
</ref>
<ref id="B6">
<citation citation-type="book">
<person-group person-group-type="editor">
<name>
<surname>Brecher</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Klocke</surname>
<given-names>F.</given-names>
</name>
<name>
<surname>Schmitt</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Schuh</surname>
<given-names>G.</given-names>
</name>
</person-group> (<year>2017</year>). <source>Internet of Production f&#xfc;r agile Unternehmen: AWK Aachener Werkzeugmaschinen-Kolloquium 2017, 18</source>. <publisher-name>bis 19. Mai, Aachen, Apprimus Verlag</publisher-name>.</citation>
</ref>
<ref id="B7">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Canny</surname>
<given-names>J. F.</given-names>
</name>
</person-group> (<year>1988</year>). <source>The complexity of robot motion planning</source>. (<publisher-loc>Cambridge, Mass</publisher-loc>: <publisher-name>Massachusetts Institut of Technology, Diss</publisher-name>).</citation>
</ref>
<ref id="B33">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Diehl</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Bock</surname>
<given-names>H. G.</given-names>
</name>
<name>
<surname>Schl&#x00F6;der</surname>
<given-names>J. P.</given-names>
</name>
</person-group> (<year>2005</year>). <article-title>A real-time iteration scheme for nonlinear optimization in optimal feedback control</article-title>, <source>SIAM Journal on Control and Optimization</source>, <volume>43</volume>, <issue>5</issue>, <fpage>1714</fpage>&#x2013;<lpage>1736</lpage>.</citation>
</ref>
<ref id="B8">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Diestel</surname>
<given-names>R.</given-names>
</name>
</person-group> (<year>2012</year>). <source>Graph theory: springer graduate text GTM 173</source>. (<publisher-loc>New York</publisher-loc>: <publisher-name>Springer</publisher-name>).</citation>
</ref>
<ref id="B9">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Ducho&#x148;</surname>
<given-names>F.</given-names>
</name>
<name>
<surname>Babinec</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Kajan</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Be&#x148;o</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Florek</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Fico</surname>
<given-names>T.</given-names>
</name>
<etal/>
</person-group> (<year>2014</year>). <article-title>Path planning with modified a star algorithm for a mobile robot</article-title>. <source>Procedia Eng.</source> <volume>96</volume>, <fpage>59</fpage>&#x2013;<lpage>69</lpage>. <pub-id pub-id-type="doi">10.1016/j.proeng.2014.12.098</pub-id>
</citation>
</ref>
<ref id="B10">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Felner</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Li</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Boyarski</surname>
<given-names>E.</given-names>
</name>
<name>
<surname>Ma</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Cohen</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Kumar</surname>
<given-names>T. K. S.</given-names>
</name>
<etal/>
</person-group> (<year>2018</year>). <article-title>Adding heuristics to conflict-based search for multi-agent path finding</article-title>. <source>Proc. Int. Conf. Automated Plan. Sched.</source> <volume>28</volume>, <fpage>83</fpage>&#x2013;<lpage>87</lpage>. <pub-id pub-id-type="doi">10.1609/icaps.v28i1.13883</pub-id>
</citation>
</ref>
<ref id="B34">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Frison</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Diehl</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>2020</year>). <article-title>HPIPM: a high-performance quadratic programming framework for model predictive control</article-title>, <source>IFAC-PapersOnLine</source>, <volume>53</volume>, <issue>2</issue>, <fpage>6563</fpage>&#x2013;<lpage>6569</lpage>.</citation>
</ref>
<ref id="B11">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Frey</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Schutter</surname>
<given-names>J. de</given-names>
</name>
<name>
<surname>Diehl</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>2023</year>). &#x201c;<article-title>Fast integrators with sensitivity propagation for use in CasADi</article-title>,&#x201d; in <source>2023 European control conference (ECC)</source>. <publisher-loc>Bucharest, Romania</publisher-loc>: <publisher-name>IEEE</publisher-name>, <fpage>1</fpage>&#x2013;<lpage>6</lpage>.</citation>
</ref>
<ref id="B12">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Gao</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Li</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Li</surname>
<given-names>X.</given-names>
</name>
<name>
<surname>Yan</surname>
<given-names>K.</given-names>
</name>
<name>
<surname>Lin</surname>
<given-names>K.</given-names>
</name>
<name>
<surname>Wu</surname>
<given-names>X.</given-names>
</name>
</person-group> (<year>2024</year>). <article-title>A review of graph-based multi-agent pathfinding solvers: from classical to beyond classical</article-title>. <source>Knowledge-Based Syst.</source> <volume>283</volume>, <fpage>111121</fpage>. <pub-id pub-id-type="doi">10.1016/j.knosys.2023.111121</pub-id>
</citation>
</ref>
<ref id="B13">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>G&#xf6;ppert</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>H&#xfc;ttemann</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Jung</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Grunert</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Schmitt</surname>
<given-names>R.</given-names>
</name>
</person-group> (<year>2018</year>). <article-title>Frei verkettete montagesysteme</article-title>. <source>Z. f&#xfc;r Wirtsch. Fabr.</source> <volume>113</volume> (<issue>3</issue>), <fpage>151</fpage>&#x2013;<lpage>155</lpage>. <pub-id pub-id-type="doi">10.3139/104.111889</pub-id>
</citation>
</ref>
<ref id="B14">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Hu</surname>
<given-names>S. J.</given-names>
</name>
<name>
<surname>Ko</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Weyand</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>ElMaraghy</surname>
<given-names>H. A.</given-names>
</name>
<name>
<surname>Lien</surname>
<given-names>T. K.</given-names>
</name>
<name>
<surname>Koren</surname>
<given-names>Y.</given-names>
</name>
<etal/>
</person-group> (<year>2011</year>). <article-title>Assembly system design and operations for product variety</article-title>. <source>CIRP Ann.</source> <volume>60</volume> (<issue>2</issue>), <fpage>715</fpage>&#x2013;<lpage>733</lpage>. <pub-id pub-id-type="doi">10.1016/j.cirp.2011.05.004</pub-id>
</citation>
</ref>
<ref id="B15">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Janning</surname>
<given-names>K.</given-names>
</name>
<name>
<surname>Koenig</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Herbst</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Niessing</surname>
<given-names>B.</given-names>
</name>
<name>
<surname>Schmitt</surname>
<given-names>R. H.</given-names>
</name>
</person-group> (<year>2025</year>). <article-title>Development of an end-to-end automated production concept for extrusion-based additive manufacturing of personalized medical scaffolds</article-title>. <source>Front. Manuf. Technol.</source> <volume>5</volume>. <pub-id pub-id-type="doi">10.3389/fmtec.2025.1572842</pub-id>
</citation>
</ref>
<ref id="B16">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Komesker</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Motsch</surname>
<given-names>W.</given-names>
</name>
<name>
<surname>Popper</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Sidorenko</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Wagner</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Ruskowski</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>2022</year>). <article-title>&#x27;Enabling a multi-agent system for resilient production flow in modular production systems</article-title>. <source>Procedia CIRP</source> <volume>107</volume>, <fpage>991</fpage>&#x2013;<lpage>998</lpage>. <pub-id pub-id-type="doi">10.1016/j.procir.2022.05.097</pub-id>
</citation>
</ref>
<ref id="B17">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Li</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Boyarski</surname>
<given-names>E.</given-names>
</name>
<name>
<surname>Felner</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Ma</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Koenig</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2019a</year>). <article-title>Improved heuristics for multi-agent path finding with conflict-based search: preliminary results</article-title>. <source>Proc. Int. Symposium Comb. Search</source> <volume>10</volume> (<issue>1</issue>), <fpage>182</fpage>&#x2013;<lpage>183</lpage>. <pub-id pub-id-type="doi">10.1609/socs.v10i1.18481</pub-id>
</citation>
</ref>
<ref id="B18">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Li</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Harabor</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Stuckey</surname>
<given-names>P. J.</given-names>
</name>
<name>
<surname>Felner</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Ma</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Koenig</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2019b</year>). <article-title>Disjoint splitting for multi-agent path finding with conflict-based search</article-title>. <source>Proc. Int. Conf. Automated Plan. Sched.</source> <volume>29</volume>, <fpage>279</fpage>&#x2013;<lpage>283</lpage>. <pub-id pub-id-type="doi">10.1609/icaps.v29i1.3487</pub-id>
</citation>
</ref>
<ref id="B19">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Liu</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Feng</surname>
<given-names>B.</given-names>
</name>
<name>
<surname>Bi</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Yu</surname>
<given-names>D.</given-names>
</name>
</person-group> (<year>2024</year>). <article-title>An integrated approach to precedence-constrained multi-agent task assignment and path finding for mobile robots in smart manufacturing</article-title>. <source>Appl. Sci.</source> <volume>14</volume> (<issue>7</issue>), <fpage>3094</fpage>. <pub-id pub-id-type="doi">10.3390/app14073094</pub-id>
</citation>
</ref>
<ref id="B20">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Lozer</surname>
<given-names>F.</given-names>
</name>
<name>
<surname>Scalera</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Boscariol</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Gasparetto</surname>
<given-names>A.</given-names>
</name>
</person-group> (<year>2025</year>). <article-title>Planning optimal minimum-jerk trajectories for redundant robots</article-title>. <source>Robotics Aut. Syst.</source> <volume>192</volume>, <fpage>105049</fpage>. <pub-id pub-id-type="doi">10.1016/j.robot.2025.105049</pub-id>
</citation>
</ref>
<ref id="B21">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Maciejowski</surname>
<given-names>J. M.</given-names>
</name>
</person-group> (<year>2002</year>). <source>Predictive control: with constraints</source>. <publisher-loc>Harlow, Munich</publisher-loc>: <publisher-name>Prentice Hall</publisher-name>.</citation>
</ref>
<ref id="B32">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Nocedal</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Wright</surname>
<given-names>S. J.</given-names>
</name>
</person-group> (<year>2006</year>). <source>Numerical optimization</source> [Online], <publisher-loc>New York, NY</publisher-loc>: <publisher-name>Springer</publisher-name>. <comment>Available online at: <ext-link ext-link-type="uri" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.loc.gov/catdir/enhancements/fy0818/2006923897-d.html">http://www.loc.gov/catdir/enhancements/fy0818/2006923897-d.html</ext-link>
</comment>.</citation>
</ref>
<ref id="B22">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Sharon</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Stern</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Felner</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Sturtevant</surname>
<given-names>N.</given-names>
</name>
</person-group> (<year>2012</year>). <article-title>Meta-agent conflict-based search for optimal multi-agent path finding</article-title>. <source>Proc. Int. Symposium Comb. Search</source> <volume>3</volume> (<issue>1</issue>), <fpage>97</fpage>&#x2013;<lpage>104</lpage>. <pub-id pub-id-type="doi">10.1609/socs.v3i1.18244</pub-id>
</citation>
</ref>
<ref id="B23">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Sharon</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Stern</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Felner</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Sturtevant</surname>
<given-names>N. R.</given-names>
</name>
</person-group> (<year>2015</year>). <article-title>Conflict-based search for optimal multi-agent pathfinding</article-title>. <source>Artif. Intell.</source> <volume>219</volume>, <fpage>40</fpage>&#x2013;<lpage>66</lpage>. <pub-id pub-id-type="doi">10.1016/j.artint.2014.11.006</pub-id>
</citation>
</ref>
<ref id="B24">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Stern</surname>
<given-names>R.</given-names>
</name>
</person-group> (<year>2019</year>). &#x201c;<article-title>Multi-agent path finding &#x2013; an overview</article-title>,&#x201d; in <source>Artificial intelligence: 5th RAAI summer School, dolgoprudny, Russia, july 4&#x2013;7, 2019, tutorial lectures</source>. Editors <person-group person-group-type="editor">
<name>
<surname>Osipov</surname>
<given-names>G. S.</given-names>
</name>
<name>
<surname>Panov</surname>
<given-names>A. I.</given-names>
</name>
<name>
<surname>Yakovlev</surname>
<given-names>K. S.</given-names>
</name>
</person-group> (<publisher-loc>Cham</publisher-loc>: <publisher-name>Springer</publisher-name>), <fpage>96</fpage>&#x2013;<lpage>115</lpage>.</citation>
</ref>
<ref id="B25">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Stern</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Sturtevant</surname>
<given-names>N.</given-names>
</name>
<name>
<surname>Felner</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Koenig</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Ma</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Walker</surname>
<given-names>T.</given-names>
</name>
<etal/>
</person-group> (<year>2019</year>). <article-title>Multi-agent pathfinding: definitions, variants, and benchmarks</article-title>.</citation>
</ref>
<ref id="B26">
<citation citation-type="web">
<collab>The MathWorks, Inc</collab> (<year>2021</year>). <article-title>Generate minimum jerk trajectory</article-title>. <comment>Available online at: <ext-link ext-link-type="uri" xlink:href="https://www.mathworks.com/help/robotics/ug/generate-minimum-jerk-trajectory.html">https://www.mathworks.com/help/robotics/ug/generate-minimum-jerk-trajectory.html</ext-link>.</comment>
</citation>
</ref>
<ref id="B27">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Verschueren</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Frison</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Kouzoupis</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Frey</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>van Duijkeren</surname>
<given-names>N.</given-names>
</name>
<name>
<surname>Zanelli</surname>
<given-names>A.</given-names>
</name>
<etal/>
</person-group> (<year>2022</year>). <article-title>&#x27;acados&#x2014;a modular open-source framework for fast embedded optimal control</article-title>. <source>Math. Program. Comput.</source> <volume>14</volume> (<issue>1</issue>), <fpage>147</fpage>&#x2013;<lpage>183</lpage>. <pub-id pub-id-type="doi">10.1007/s12532-021-00208-8</pub-id>
</citation>
</ref>
<ref id="B28">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Wang</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Zhang</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Yang</surname>
<given-names>K.</given-names>
</name>
</person-group> (<year>2024</year>). <article-title>&#x27;Overview of the development of planar motor technology</article-title>. <source>Energies</source> <volume>17</volume> (<issue>16</issue>), <fpage>3955</fpage>. <pub-id pub-id-type="doi">10.3390/en17163955</pub-id>
</citation>
</ref>
<ref id="B29">
<citation citation-type="book">
<person-group person-group-type="editor">
<name>
<surname>Yang</surname>
<given-names>Q.</given-names>
</name>
<name>
<surname>Wooldridge</surname>
<given-names>M. J.</given-names>
</name>
</person-group> (<year>2015</year>). <source>
<italic>Proceedings of the twenty-fourth international joint Conference on artificial intelligence: Buenos Aires, Argentina, 25-31 july 2015</italic>, palo alto, California, AAAI press international joint conferences on artificial intelligence</source>.</citation>
</ref>
<ref id="B30">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Yu</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>2016</year>). <article-title>Intractability of optimal multi-robot path planning on planar graphs</article-title>. <source>IEEE Robotics Automation Soc.</source> <volume>1</volume>, <fpage>33</fpage>&#x2013;<lpage>40</lpage>. <pub-id pub-id-type="doi">10.1109/lra.2015.2503143</pub-id>
</citation>
</ref>
</ref-list>
</back>
</article>