Our chromosome encoding scheme of assignments and the greedy schedule builder are inspired by the implementation by \citet{MyszkowskiLNS2018}.

They have a Java implementation of a genetic algorithm that solves the MSRCPSP with fixed costs, called salaries.

Our work combines and extends the following existing work.

Our chromosome encoding scheme of assignments, and the greedy schedule builder are inspired by the implementation by \citet{MyszkowskiLNS2018}.

They have a Java implementation of a genetic algorithm that solves the MSRCPSP with fixed costs.

They optimize total cost and makespan.

In their version of the MSRCPSP, one task has exactly one capability requirement, whereas our tasks can have multiple.

One consequence of this is that their chromosomes always encode valid solutions, while our chromosomes might encode invalid solutions, where not all capability requirements can have a resource assigned.

One consequence of this is that their chromosomes always encode valid solutions, while our chromosomes might encode invalid solutions, where not all capability requirements have a resource assigned.

We therefore had to add a measure of invalidity to our fitness function, that gives a negative score to solutions depending on the number of unassigned capability requirements.

Furthermore, our work extends theirs with user-defined capability functions and resource affinity constraints.

The evolutionary algorithm we use is based on the implementation by \citet{Alexeev2014SimpleGeneticAlgorithm}.

The evolutionary algorithm we use is based on the implementation in Haskell by \citet{Alexeev2014SimpleGeneticAlgorithm}.

We chose his implementation over others because we wanted our implementation to be in Clean, and his algorithm was small and simple, which made it easy to port and extend.

We extended his work in several ways to make it suitable for our needs.

We added support for invalid chromosomes, we preserve the best candidates in each generation, and we support additional parameters to the fitness function besides just the chromosome.

Instead of a single number, our fitness function returns a list of objectives, tagged as either less-is-better or more-is-better.

Finally, our genetic algorithm calculates the weighted product of the objectives of chromosomes in order to sort them.

\begin{itemize}[noitemsep]

\item Support for invalid chromosomes

\item Support for environment being passed to fitness function

\item Elitist preservation

\item Fitness function returns a list of objectives, tagged as either less-is-better or more-is-better

\item Support for weights in the objective list

\end{itemize}

Some other work related to ours is as follows.

\citet{DebAPM2000} have a genetic algorithm for solving multi-objective optimization problems.

Their algorithm is used for example by \citet{MyszkowskiLNS2018}.

We chose not to use their algorithm, because it depends on non-dominated sorting, which Deb himself describes as ineffective for more than a handful of objectives.

Our problem instances produce dozens of objectives, so we opted for a genetic algorithm that sorts solutions based the weighted product instead.

\item Deb, Kalyanmoy, et al. “A fast elitist non-dominated sorting genetic algorithm for multi-objective optimization: NSGA-II.” International Conference on Parallel Problem Solving From Nature. Springer Berlin Heidelberg, 2000