25-cxsj-final/backend/problems/knapsack/problem.py

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"]