38 lines
1.5 KiB
Python
38 lines
1.5 KiB
Python
from typing import Any, Dict, List
|
|
from common.base_problem import BaseProblem
|
|
from problems.knapsack.generator import generate_knapsack_case
|
|
from problems.knapsack.solvers import solve_dp, solve_backtracking
|
|
from common.timer_utils import time_execution
|
|
|
|
class KnapsackProblem(BaseProblem):
|
|
def generate_case(self, num_items: int = 10, max_weight: int = 50, max_value: int = 100) -> Dict[str, Any]:
|
|
return generate_knapsack_case(num_items, max_weight, max_value)
|
|
|
|
def solve(self, input_data: Dict[str, Any], algorithm: str) -> Dict[str, Any]:
|
|
items = input_data.get("items", [])
|
|
capacity = input_data.get("capacity", 0)
|
|
|
|
result = None
|
|
duration = 0.0
|
|
|
|
if algorithm == "dp":
|
|
result, duration = time_execution(solve_dp)(items, capacity)
|
|
elif algorithm == "backtracking":
|
|
result, duration = time_execution(solve_backtracking)(items, capacity)
|
|
else:
|
|
raise ValueError(f"Unknown algorithm: {algorithm}")
|
|
|
|
return {
|
|
"algorithm": algorithm,
|
|
"max_value": result["max_value"],
|
|
"selected_items": result["selected_items"],
|
|
"time_seconds": duration
|
|
}
|
|
|
|
def verify(self, input_data: Any, result: Any) -> bool:
|
|
# Use DP as source of truth
|
|
items = input_data.get("items", [])
|
|
capacity = input_data.get("capacity", 0)
|
|
truth, _ = time_execution(solve_dp)(items, capacity)
|
|
return result["max_value"] == truth["max_value"]
|