\chapter{Trajectory Optimization} \label{traj_optimization}

	\section{Optimization of Boundary Value Problems}

			An approach is necessary, in trajectory optimization and many other fields, to optimize
			highly non-linear, unpredictable systems such as this. The field that developed to
			approach this problem is known as Non-Linear Programming (NLP) Optimization.

			A Non-Linear Programming Problem involves finding a solution that optimizes a function
			$f(\vec{x})$, subject to constraints $\vec{g}(\vec{x}) \le 0$ and $\vec{h}(\vec{x}) = 0$
			where $n$ is a positive integer, $x$ is any subset of $R^n$, $g$ and $h$ can be vector
			valued functions of any size, and at least one of $f$, $\vec{g}$, and $\vec{h}$ must be
			non-linear.

			There are, however, two categories of approaches to solving an NLP. The first category,
			indirect methods, involve declaring a set of necessary and/or sufficient conditions for
			optimality. These conditions then allow the problem to be reformulated as a two point
			boundary value problem. Solving this boundary value problem involves determining a
			control law for the optimal path. Indirect approaches for spacecraft trajectory
			optimization have given us the Primer Vector Theory\cite{jezewski1975primer}.

			The other category is the direct methods. In a direct optimization problem, the cost
			function itself provides a value that an iterative numerical optimizer can measure
			itself against. The optimal solution is then found by varying the inputs $\vec{x}$ until
			the cost function is reduced to a minimum value, often determined by its derivative
			jacobian. A number of tools have been developed to formulate NLPs for optimization via
			this direct method in the general case.

			Both of these methods have been applied to the problem of low-thrust interplanetary
			trajectory optimization \cite{Casalino2007IndirectOM} to find local optima over
			low-thrust control laws. It has often been found that indirect methods are more
			difficult to converge and require a better initial guess than the direct methods.
			However, they also require less parameters to describe the trajectory, since the
			solution of a boundary value problem doesn't require discretization of the control
			states.

			In this implementation, robustness is incredibly valuable, as the Monotonic Basin
			Hopping algorithm, discussed later, is leveraged to attempt to find all minima basins in
			the solution space by ``hopping'' around with different initial guesses. It is,
			therefore, important that the optimization routine be robust to poor initial guesses.
			Therefore, a direct optimization method was leveraged by transcribing the problem into
			an NLP and using IPOPT to find the local minima.

			\subsection{Non-Linear Solvers}

				One of the most common packages for the optimization of NLP problems is
				SNOPT\cite{gill2005snopt}, which is a proprietary package written primarily using a
				number of Fortran libraries by the Systems Optimization Laboratory at Stanford
				University. It uses a sparse sequential quadratic programming algorithm as its
				back-end optimization scheme.

				Another common NLP optimization package (and the one used in this implementation)
				is the Interior Point Optimizer or IPOPT\cite{wachter2006implementation}. It  uses
				an Interior Point Linesearch Filter Method and was developed as an open-source
				project by the organization COIN-OR under the Eclipse Public License.

				Both of these methods utilize similar approaches to solve general constrained non-linear
				problems iteratively. Both of them can make heavy use of derivative Jacobians and Hessians
				to improve the convergence speed and both have been ported for use in a number of
				programming languages, including in Julia, which was used for this project.

				This is by no means an exhaustive list, as there are a number of other optimization
				libraries that utilize a massive number of different algorithms. For the most part, the
				libraries that port these are quite modular in the sense that multiple algorithms can be
				tested without changing much source code.

			\subsection{Interior Point Linesearch Method}

				As mentioned above, this project utilized IPOPT which leveraged an Interior Point
				Linesearch method. A linesearch algorithm is one which attempts to find the optimum
				of a non-linear problem by first taking an initial guess $x_k$. The algorithm then
				determines a step direction (in this case through the use of either automatic
				differentiation or finite differencing to calculate the derivatives of the
				cost function) and a step length. The linesearch algorithm then continues to
				step the initial guess, now labeled $x_{k+1}$ after the addition of the ``step''
				vector and iterates this process until predefined termination conditions are met.

			\subsection{Shooting Schemes for Solving a Two-Point Boundary Value Problem}

				One straightforward approach to trajectory corrections is a single shooting
				algorithm, which propagates a state, given some control variables forward in time to
				the epoch of interest. The controls over this time period are then modified in an
				iterative process, using the correction scheme, until the target state and the
				propagated state matches.

				As an example, we can consider the one-dimensional Two-Point Boundary Value Problem
				(TPBVP) defined by:
				\begin{equation}
					y''(t) = f(t, y(t), y'(t)), y(t_0) = y_0, y(t_f) = y_f
				\end{equation}
				We can then redefine the problem as an initial-value problem:
				\begin{equation}
					y''(t) = f(t, y(t), y'(t)), y(t_0) = y_0, y'(t_0) = \dot{y}_0
				\end{equation}
				With $y(t,x)$ as a solution to that problem. Furthermore, if $y(t_f, x) = y_f$, then
				the solution to the initial-value problem is also the solution to the TPBVP as well.
				Therefore, we can use a root-finding algorithm, such as the bisection method,
				Newton's Method, or even Laguerre's method, to find the roots of:
				\begin{equation}
					F(x) = y(t_f, x) - y_f
				\end{equation}
				To find the solution to the IVP at $x_0$, $y(t_f, x_0)$ which also provides a
				solution to the TPBVP. This technique for solving a Two-Point Boundary Value
				Problem can be visualized in Figure~\ref{single_shoot_fig}.

				\begin{figure}[H]
					\centering
					\includegraphics[width=\textwidth]{LaTeX/fig/single_shoot}
					\caption{Single shooting over a trajectory arc}
					\label{single_shoot_fig}
				\end{figure}

				In this example, the initial trajectory is the green arc, which contains a certain
				control thrust $\Delta V_{init}$ and is propagated for a certain amount of time and
				results in the end state $x_{init}$. The target state $x_{final}$ can be achieved by
				varying the control and propagating forward in time until this final state is
				achieved. This type of shooting algorithm can be quite useful for simple cases such
				as this one.

				However, some problems require the use of a more flexible algorithm. In these cases,
				sometimes a multiple-shooting algorithm can provide that flexibility and reduced
				sensitivity. In a multiple shooting algorithm, rather than having a single target
				point at which the propagated state is compared, the target orbit is broken down
				into multiple arcs, then end of each of which can be seen as a separate target. At
				each of these points we can then define a separate control, which may include the
				states themselves. The end state of each arc and the beginning state of the next
				must then be equal for a valid arc (with the exception of velocity discontinuities
				if allowed for maneuvers or gravity assists at that point), as well as the final
				state matching the target final state.

				\begin{figure}[H]
					\centering
					\includegraphics[width=\textwidth]{LaTeX/fig/multiple_shoot}
					\caption{Visualization of a multiple shooting technique over a trajectory arc}
					\label{multiple_shoot_fig}
				\end{figure}

				In this example, it can be seen that there are now more constraints (places where
				the states need to match up, creating an $\vec{x}_{error}$ term) as well as control
				variables (the $\Delta V$ terms in the figure). This technique actually lends itself
				very well to low-thrust arcs and, in fact, Sims-Flanagan Transcribed low-thrust arcs
				in particular, because there actually are control thrusts to be optimized at a
				variety of different points along the orbit. This is, however, not an exhaustive
				description of ways that multiple shooting can be used to optimize a trajectory.

	\section{Monotonic Basin Hopping Algorithms}

		The techniques discussed thus far are useful for finding local optima. However, we would
		also like to traverse the search space in an attempt to determine the global optima over the
		entire search space. One approach to this would be to discretize the search space and test
		each point as an input to a local optimization scheme. In order to achieve sufficient
		coverage of the search space, however, this often requires long processing times in a
		high-dimensional environment.

		To solve this problem, a technique was described by Wales and Doye in 1997
		\cite{wales1997global} called a basin-hopping algorithm. This algorithm performs a random
		perturbation of the input states, optimizes using a local optimizer, then either accepts the
		new coordinates and performs a further perturbation, or rejects them and tests a new set of
		randomly-generated inputs.

		This allows the algorithm to test many different regions of the search space in order to
		determine which ``basins'' contain local optima. If these local optima are found, the
		algorithm can attempt to improve the local optima based on parameters defined by the
		algorithm designer (by perturbation and re-applying the local optimization scheme) or search
		for a new basin in the search space.
