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}.

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.

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

They optimize total cost and makespan.

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.

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.

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.

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]

Some other work related to ours is as follows.

\item Support for invalid chromosomes

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

\item Support for environment being passed to fitness function

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

\item Elitist preservation

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.

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

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