77 lines
2.5 KiB
Python
77 lines
2.5 KiB
Python
from fastapi import APIRouter, HTTPException
|
|
from pydantic import BaseModel
|
|
from typing import List, Optional, Dict, Any
|
|
from problems.knapsack.problem import KnapsackProblem
|
|
|
|
router = APIRouter(
|
|
prefix="/knapsack",
|
|
tags=["knapsack"],
|
|
responses={404: {"description": "Not found"}},
|
|
)
|
|
|
|
problem_solver = KnapsackProblem()
|
|
|
|
class GenerateRequest(BaseModel):
|
|
num_items: int = 10
|
|
max_weight: int = 50
|
|
max_value: int = 100
|
|
|
|
class SolveRequest(BaseModel):
|
|
items: List[Dict[str, int]]
|
|
capacity: int
|
|
algorithms: List[str] = ["dp", "backtracking"]
|
|
|
|
class BenchmarkRequest(BaseModel):
|
|
sizes: List[int] = [10, 20, 30]
|
|
algorithms: List[str] = ["dp", "backtracking"]
|
|
|
|
@router.post("/generate")
|
|
async def generate_case(req: GenerateRequest):
|
|
return problem_solver.generate_case(num_items=req.num_items, max_weight=req.max_weight, max_value=req.max_value)
|
|
|
|
@router.post("/solve")
|
|
async def solve_case(req: SolveRequest):
|
|
input_data = {"items": req.items, "capacity": req.capacity}
|
|
results = []
|
|
for algo in req.algorithms:
|
|
try:
|
|
# Skip Backtracking for large inputs
|
|
if len(req.items) > 22 and algo == "backtracking":
|
|
results.append({
|
|
"algorithm": algo,
|
|
"error": "Input too large for Backtracking (limit 22)",
|
|
"skipped": True
|
|
})
|
|
continue
|
|
|
|
res = problem_solver.solve(input_data, algo)
|
|
results.append(res)
|
|
except ValueError as e:
|
|
results.append({"algorithm": algo, "error": str(e)})
|
|
return results
|
|
|
|
@router.post("/benchmark")
|
|
async def benchmark(req: BenchmarkRequest):
|
|
benchmark_results = []
|
|
for size in req.sizes:
|
|
input_data = problem_solver.generate_case(num_items=size)
|
|
|
|
size_result = {"size": size, "algorithms": []}
|
|
for algo in req.algorithms:
|
|
try:
|
|
if size > 22 and algo == "backtracking":
|
|
size_result["algorithms"].append({
|
|
"algorithm": algo,
|
|
"time_seconds": None,
|
|
"skipped": True
|
|
})
|
|
continue
|
|
|
|
res = problem_solver.solve(input_data, algo)
|
|
size_result["algorithms"].append(res)
|
|
except Exception as e:
|
|
size_result["algorithms"].append({"algorithm": algo, "error": str(e)})
|
|
|
|
benchmark_results.append(size_result)
|
|
return benchmark_results
|