Fix unreachable code in design_with_pyomo function
This commit is contained in:
93
mip.py
93
mip.py
@@ -75,99 +75,6 @@ def design_with_pyomo(
|
|||||||
total_invest_func,
|
total_invest_func,
|
||||||
get_max_capacity_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(
|
def design_with_mip(
|
||||||
|
|||||||
Reference in New Issue
Block a user