Problem Guide

Certain problems are general enough, if only for educational purposes, to include into our API. This guide will demonstrate some of problems that are included in evol.

General Idea

In general a problem in evol is nothing more than an object that has .eval_function() implemented. This object can usually be initialised in different ways but the method must always be implemented.

Function Problems

There are a few hard functions out there that can be optimised with heuristics. Our library offers a few objects with this implementation.

The following functions are implemented.

from evol.problems.functions import Rastrigin, Sphere, Rosenbrock

Sphere(size=2).eval_function([2, 1])
Rosenbrock(size=3).eval_function([3, 2, 1])

You may notice that we pass a size parameter apon initialisation; this is because these functions can also be defined in higher dimensions. Feel free to check the wikipedia article for more explanation on these functions.

Routing Problems

Traveling Salesman Problem

It’s a classic problem so we’ve included it here.

import random
from evol.problems.routing import TSPProblem, coordinates

us_cities = coordinates.united_states_capitols
problem = TSPProblem.from_coordinates(coordinates=us_cities)

order = list(range(len(us_cities)))
for i in range(3):

Note that you can also create an instance of a TSP problem from a distance matrix instead. Also note that you can get such a distance matrix from the object.

same_problem = TSPProblem(problem.distance_matrix)

Magic Santa

This problem was inspired by a kaggle competition. It involves the logistics of delivering gifts all around the world from the north pole. The costs of delivering a gift depend on how tired santa’s reindeer get while delivering a sleigh full of gifts during a trip.

It is better explained on the website than here but the goal is to minimize the weighed reindeer weariness defined below:

\(WRW = \sum\limits_{j=1}^{m} \sum\limits_{i=1}^{n} \Big[ \big( \sum\limits_{k=1}^{n} w_{kj} - \sum\limits_{k=1}^{i} w_{kj} \big) \cdot Dist(Loc_i, Loc_{i-1})\)

In terms of setting up the problem it is very similar to a TSP except that we now also need to attach the weight of a gift per location.

import random
from evol.problems.routing import MagicSanta, coordinates

us_cities = coordinates.united_states_capitols
problem = TSPProblem.from_coordinates(coordinates=us_cities)

           home_coordinate=(0, 0),
           gift_weight=[random.random() for _ in us_cities])