@@ -35,7 +35,7 @@ We believe that this problem can be mitigated by developing parameter sets that

Directability in our case means that the user can guide the search towards solutions that fulfil certain desired properties.

This is where the strength of our method lies.

User-defined quality functions and the weighted product were specifically included to give users lots of freedom to express preferences about the kind of solutions they desire.

User-defined quality functions, the weighted product, and resource affinity constraints were specifically included to give users instruments to express preferences about the kind of solutions they desire.

The example in \cref{sec:example-conflicting-objectives} shows how emphasizing the makespan produces quick solutions where less capable resources are being utilized, while de-emphasizing the makespan assigns more work to fewer high-quality resources, resulting in schedules that take longer to complete.

The example in \cref{sec:example-search-and-rescue} demonstrates how arbitrary constraints can be encoded in user-defined quality functions, in this case to prevent Bob from having to fly the helicopter.

@@ -18,11 +18,11 @@ This is what is meant by a heuristic using knowledge about the problem.

Evolutionary algorithms fit our problem well, for two reasons.

First we are interested in alternative solutions, not just one solution.

Our algorithm calculates a final population, which is the set of the best solutions it has discovered, ranked by the capability function.

Our algorithm calculates a final population, which is the set of the best solutions it has discovered, ranked by the quality function.

Second, user-defined capability functions make the search space unpredictable and non-continuous.

Because capability functions are Turing-complete calculations, it is impossible to estimate what kind of changes to a candidate will make it better or worse.

Meta-heuristics do not need knowledge about the function they are trying to optimize, which makes them a good fit for user-defined capability functions.

Second, user-defined quality functions make the search space unpredictable and non-continuous.

Because quality functions are Turing-complete calculations, it is impossible to estimate what kind of changes to a candidate will make it better or worse.

Meta-heuristics do not need knowledge about the function they are trying to optimize, which makes them a good fit for user-defined quality functions.

\citet{Deb2001, Deb2011} has conducted a lot of research about using evolutionary algorithms for multi-objective optimization and decision making.

His work has been a big inspiration for this article.

This section demonstrates our method using two examples.

The example in \cref{sec:example-conflicting-objectives} demonstrates the effect on weight on conflicting objectives, while the example in \cref{sec:example-crew-location} demonstrates how user-defined capability functions can take the location of crew members into account.

The example in \cref{sec:example-conflicting-objectives} demonstrates the effect on weight on conflicting objectives, while the example in \cref{sec:example-crew-location} demonstrates how user-defined quality functions can take the location of crew members into account.

\subsection{Conflicting Objectives}

...

...

@@ -84,14 +84,14 @@ Blanket search consists of one inspection task per room on the ship.

The weapon tasks demonstrate the resource affinity feature of our algorithm.

The scheduler must choose the same weapon for the preparation and usage tasks.

The blanket search tasks demonstrate user-defined capability functions.

The blanket search tasks demonstrate user-defined quality functions.

We assume a simple model of the ship's layout, where 30 rooms are located on one long corridor.

All crew members are randomly distributed across the first ten rooms.

The quality function evaluates people assigned to blanket search tasks according to the distance between the person and the room, where distance is a less-is-better objective.

Calculating the distance between a person and a room in this model is a simple subtraction, but one could imagine a more realistic calculation where distances are calculated using a model of an actual ship with decks, corridors, and staircases.

The cooking, swabbing and meeting tasks are there to provide some noise for the scheduler.

The swab deck tasks have no capability function, any crew member is equally suited to do them, even the commander.

The swab deck tasks have no quality function, any crew member is equally suited to do them, even the commander.

The staff meeting needs the commander and the section leaders present, there can be no variation in the assignment, the scheduler just has to find a time slot where all required people are free.

\Cref{fig:realistic-scenario} shows a solution for this scenario.

...

...

@@ -101,5 +101,5 @@ After all, it does not make sense to load ammunition for a gun but then engage w

In the problem instance this constraint is modelled using resource affinity, and the scheduler only produces solutions where the constraint is satisfied.

The model of the ship has 30 rooms, and the crew is distributed over the first ten.

The capability function tries to assign blanket search tasks of rooms to people who are close to the rooms.

The quality function tries to assign blanket search tasks of rooms to people who are close to the rooms.

This is why people in room 10 tend to get more blanket search tasks for rooms 11 to 30 than people in room 1.

@@ -7,7 +7,7 @@ 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 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.

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

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.