zpetrea/LinearInteger_Programming
0
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 