Tree Initialization & Half and Half, Max Depth 2-6 \\
\hline
Max Tree Depth & 17 \\
\hline
Raw Fitness & See Fitness Evaluation \\
\hline
Standardized Fitness & = Raw Fitness \\
\hline
\end{tabularx}
\end{center}
*4 Tests were run, 0.9 crossover, 0.9 mutation with 0 elitism and 2 elitism, and 1.0 crossover, 1.0 mutation with 0 elitism and 2 elitism.
\subsection{Fitness Evaluation}
Fitness is evaluated by taking the absolute value of the predicted y value minus the actual y value.
If the difference is less than a user provided (default 1.e15) value cutoff it is added to the fitness value. If the difference value is less than the float epsilon value (\~= 0) the number of hits is incremented. Lower fitness values are preferred.
Tested on the input terminal values the GP produces a positive or negative value which is interpreted as either Cammeo (+) or Osmancik (-). Raw fitness is equal to the number of hits which is the number of correct identifications. The adjusted fitness is then calculated and subtracted from 1 in order to invert and produce the required lowest fitness better.
\subsection{Fitness Plots}
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{fp6}
\caption{2 Elites, 10 Runs Averaged}
\label{fig:fp6}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{fp7}
\caption{2 Elites, 10 Runs Averaged}
\label{fig:fp7}
\end{figure}
\subsection{Confusion Matrix}
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{fp10}
\caption{0.9 Crossover 0.1 Mutation 2 Elites Best Program Results}
\label{fig:fp10}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{fp11}
\caption{0.9 Crossover 0.1 Mutation 2 Elites 10 Run Average Results}
\label{fig:fp11}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{fp12}
\caption{0.9 Crossover 0.9 Mutation 2 Elites Best Program Results}
\label{fig:fp8}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{fp13}
\caption{0.9 Crossover 0.9 Mutation 2 Elites 10 Run Average Results}
\label{fig:fp9}
\end{figure}
\subsection{Analysis and Conclusion}
The best results found was a correct classification rate of 91.9\%. On average the 0.9 crossover with 0.1 mutation produced the best results with the 0.9/0.9 best result almost being equal.
This assignment was made for linux using GCC 13.2.0, however any C++17 compliant compiler should work.
The minimum GCC version appears to be 8.5, meaning this assignment can be built on sandcastle.
\begin{lstlisting}
cd your_path_to_this_source/
mkdir build
cd build
cmake ../
make -j 32
\end{lstlisting}
The actual assignment executable is called |Assignment_1| while the automatic run system is called |Assignment_1_RUNNER|. |Assignment_1_RUNNER| has a help menu with options but the defaults will work assuming you run from the build directory and are using part b only. If you want to build for Part A run |cmake -DPART_B=OFF| and run |Assignment_1_RUNNER| with |-b|
I made a few changes to lilgp, mostly memory fixes along with elitism with a number of individuals instead of a proportion. There appear to be some kind of issue in the GP, of which won't matter as assignment two will likely use my own gp system. I might look into it, but I was not aware there was an issue until compiling the stats here. My results have been generally positive, however, I did notice in the course of collecting data that at some point the Part A results stopped being consistently good however part B results have remained unchanged. Might have happened when I changed my custom random number seeder to not produce div by zero errors during testing. Could be anything. I don't like writing reports and have procrastinated on writing and instead have spent the last couple of weeks messing around with the GP. Fun fact a bunch of additions to my standard lib were made for this assignment. Next time will be better hopefully
\section{References}
Next assignment these will be proper. Latex is being annoying to setup for bib.\\\\