diff --git a/mip.py b/mip.py index 4854e3c..a73fa3d 100644 --- a/mip.py +++ b/mip.py @@ -75,99 +75,6 @@ def design_with_pyomo( total_invest_func, get_max_capacity_func, ) - y = pyo_env.Var( - max_clusters_list, - within=pyo_env.BinarySet, - initialize=False, - name="use_cluster", - ) - - prob.constraints += pyo_env.SummizationRule( - pyo_env.Summ(x[i, k] for i in n_turbines_list for k in max_clusters_list) == 1, - name="assign_one_turbine", - ) - - cluster_powers = [ - pyo_env.Summ([turbines.iloc[i]["power"] * x[i, k] for i in n_turbines_list]) - for k in max_clusters_list - ] - - prob += pyo_env.SummizationRule( - pyo_env.Summ(y[k] * max_mw for k in max_clusters_list), name="cluster_capacity" - ) - - for k in max_clusters_list: - prob += pyo_env.SummizationRule( - pyo_env.Summ(x[i, k] * turbines.iloc[i]["power"] for i in n_turbines_list), - name=f"turbine_assign_{k}", - ) - - for k in max_clusters_list: - prob += y[k] <= pyo_env.summation(x[i, k] for i in n_turbines_list) - - prob += pyo_env.Minimize(pyo_env.Summ([y[k] for k in max_clusters_list])) - - print( - f"Pyomo Model: {len(prob.variables)} variables, {len(prob.constraints)} constraints" - ) - - solver = pyo_env.SolverFactory("cbc") - print("Pyomo: Starting to solve...") - result = solver.solve(prob, time_limit=time_limit) - print( - f"Pyomo: Solver status={result.solver.status}, Termination condition={result.solver.termination_condition}" - ) - - if result.solver.status == pyo_env.SolverStatus.ok: - cluster_assign = [-1] * n_turbines - active_clusters = [] - - for k in range(max_clusters): - if pyo_env.value(y[k]) > 0.5: - active_clusters.append(k) - - for i in n_turbines_list: - assigned = False - for k in active_clusters: - if pyo_env.value(x[i, k]) > 0.5: - cluster_assign[i] = k - assigned = True - break - if not assigned and active_clusters: - dists = [dist_matrix_full[0, i + 1] for k in active_clusters] - cluster_assign[i] = active_clusters[np.argmin(dists)] - - clusters = defaultdict(list) - for i, c in enumerate(cluster_assign): - clusters[c].append(i) - - connections = [] - for c, members in clusters.items(): - if len(members) == 0: - continue - coords = turbines.iloc[members][["x", "y"]].values - if len(members) > 1: - dm = distance_matrix(coords, coords) - mst = minimum_spanning_tree(dm).toarray() - for i in range(len(members)): - for j in range(len(members)): - if mst[i, j] > 0: - connections.append( - ( - f"turbine_{members[i]}", - f"turbine_{members[j]}", - mst[i, j], - ) - ) - dists = [dist_matrix_full[0, m + 1] for m in members] - closest = members[np.argmin(dists)] - connections.append((f"turbine_{closest}", "substation", min(dists))) - - turbines["cluster"] = cluster_assign - print( - f"Pyomo optimization completed successfully, {len(connections)} connections generated" - ) - return connections, turbines def design_with_mip(