Skip to content

Latest commit

 

History

History
75 lines (56 loc) · 2.1 KB

README.md

File metadata and controls

75 lines (56 loc) · 2.1 KB

Pyheuristics logo

PyHeuristics

A toolkit for MetaHeuristics implemented in Python


PyHeuristics is a Metaheuristics toolkit, which facilitates the use of various metaheuristic algorithms, such as Simulated Annealing or Ant Colony Optimization among others.

How to Install

TODO

Basic Usage

Using the various abstractions of PyHeuristics, it is really easy to solve an optimization problem.

Using the various abstractions of PyHeuristics, it is really easy to solve an optimization problem. For example, we will show how to find the maximum of this expression using the Simulated Annealing algorithm.

$$f(x) = x^3 - 60x^2 + 900x + 100$$

First of all import SimulatedAnnealing and CoolingSchedule. CoolingSchedule is a class that regulated the temperature of the annealing process.

from pyheuristics.trajectory.annealing.cooling_schedules import GeometricCoolingSchedule
from pyheuristics.trajectory.annealing.simulated_annealing import SimulatedAnnealing

Then, implement a class of the problem that must implement the fn and the move methods.

class MaximizeSimpleFunction(SimulatedAnnealing):
    def fn(self, sol: Any) -> float:
        binary_to_decimal = int(sol, 2)
        return -(
            binary_to_decimal**3
            - 60 * (binary_to_decimal**2)
            + 900 * binary_to_decimal
            + 100
        )

    def move(self) -> Any:
        bit_to_flip = random.randint(0, 4)
        _list = list(self.sol)

        if self.sol[bit_to_flip] == "1":
            _list[bit_to_flip] = "0"
        else:
            _list[bit_to_flip] = "1"

        return "".join(_list)

Finally, run the algorithm to search for the maximum value.

cs = GeometricCoolingSchedule(initial_temp=25000.0, final_temp=2.5, alpha=0.9)
optim_problem = MaximizeSimpleFunction(init_sol="10011", cooling_schedule=cs)
execution_result = optim_problem.run()

print(execution_result.sol) # "01010"
print(execution_result.cost) # 4100