Source code for offline_solvers.base_solver

from abc import ABC, abstractmethod
from typing import Union, List


[docs]class BaseSolver(ABC): """Abstract class unifying methods for the offline solvers. Parameters ---------- values : list of list of (int or float) A list of instants, where each instant contains is a list of the available values of that instant. costs : list of list of list of (int or float) A list of instants, where each instant is a list of options available, and each option is a list containing this option's costs for each dimension. capacity : float The capacity of each dimension (each dimension have the same capacity). Attributes ---------- optimum_value : float or int The optimum value found for the LP problem. packed_items : list of int A list containing the indexes of the items chosen in each instant. packed_weight_sum : list of float A list containing the optimal solution's total cost for each dimension. Methods ------- solve() Abstract method, should solve the LP problem. print_result() Prints a report containing the optimum solution and the total weights in each dimension. """ _size: int _values: List[List[Union[float, int]]] _costs: List[List[List[Union[float, int]]]] _options_per_instant: int _cost_dimension: int optimum_value: Union[float, int] packed_items: List[int] packed_weight_sum: List[float] def __init__(self, values: List[List[Union[float, int]]], costs: List[List[List[Union[float, int]]]], capacity: float): self._size = len(values) self._options_per_instant = len(values[0]) if len(values) else 0 self._cost_dimension = len(costs[0][0]) if len(costs) and len(costs[0]) else 0 self._values = values self._costs = costs self._capacity = capacity self.optimum_value = 0.0 self.packed_items = list() self.packed_weight_sum = [0.0 for _ in range(self._cost_dimension)]
[docs] @abstractmethod def solve(self) -> None: """Abstract method that should solve the LP problem and set `optimum_value`, `packed_items` and `packed_weight_sum` attributes. """ pass
[docs] def print_result(self) -> None: """Prints a report containing the optimum solution and the total weights in each dimension """ print(f"Total value = {self.optimum_value:.4f}") for dim in range(self._cost_dimension): print( f"\tTotal weight dim {dim}: {self.packed_weight_sum[dim]:.5f} / {self._capacity:.5f}")