CoolFace
Apppublic

zpetrea/LinearInteger_Programming

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes
cell_towers.py65 linesDownload Raw Back to root
1from pyomo.environ import *2 3def solve_cell_towers():4    model = ConcreteModel()5 6    towers = ["Tower0", "Tower1", "Tower2", "Tower3", "Tower4", "Tower5"]7    regions = ["Region0", "Region1", "Region2", "Region3", "Region4", "Region5", "Region6", "Region7", "Region8"]8 9    P = {10        "Region0": 523, "Region1": 690, "Region2": 420,11        "Region3": 1010, "Region4": 1200, "Region5": 850,12        "Region6": 400, "Region7": 1008, "Region8": 95013    }14 15    C = {16        "Tower0": 4.2, "Tower1": 6.1, "Tower2": 5.2,17        "Tower3": 5.5, "Tower4": 4.8, "Tower5": 9.218    }19 20    V = {21        ("Tower0", "Region0"): 1, ("Tower0", "Region1"): 1, ("Tower0", "Region2"): 1,22        ("Tower0", "Region7"): 1, ("Tower0", "Region8"): 1,23        ("Tower1", "Region3"): 1, ("Tower1", "Region4"): 1,24        ("Tower2", "Region4"): 1, ("Tower2", "Region5"): 1, ("Tower2", "Region6"): 1,25        ("Tower3", "Region0"): 1, ("Tower3", "Region1"): 1, ("Tower3", "Region3"): 1,26        ("Tower3", "Region6"): 1, ("Tower3", "Region8"): 1,27        ("Tower4", "Region5"): 1,28        ("Tower5", "Region4"): 1, ("Tower5", "Region8"): 129    }30 31    model.y = Var(towers, domain=Binary)32    model.x = Var(regions, domain=Binary)33 34    model.objective = Objective(35        expr=sum(P[r] * model.x[r] for r in regions),36        sense=maximize37    )38 39    def coverage_rule(model, r):40        return sum(V.get((t, r), 0) * model.y[t] for t in towers) >= model.x[r]41    model.coverage = Constraint(regions, rule=coverage_rule)42 43    model.budget = Constraint(expr=sum(C[t] * model.y[t] for t in towers) <= 20)44 45    solver = SolverFactory("cbc")46    result = solver.solve(model, tee=False)47 48    if result.solver.termination_condition != TerminationCondition.optimal:49        return "โŒ Solver failed to find an optimal solution."50 51    active_towers = [t for t in towers if model.y[t]() >= 0.5]52    covered_regions = [r for r in regions if model.x[r]() >= 0.5]53    total_covered = sum(P[r] for r in covered_regions)54 55    summary = (56        "๐Ÿ“ก **Optimal Cell Tower Placement**\n\n"57        f"โœ… **Active Towers:** {', '.join(active_towers)}\n"58        f"๐ŸŒ **Covered Regions:** {', '.join(covered_regions)}\n"59        f"๐Ÿ‘ฅ **Total Population Covered:** {total_covered}\n"60        f"๐Ÿ’ฐ **Budget Used:** {sum(C[t] for t in active_towers):.2f} / 20"61    )62 63    return summary64 65