Added map solver for Reksio i Skarb Piratów
This commit is contained in:
57
risp_map_solver.py
Normal file
57
risp_map_solver.py
Normal file
@@ -0,0 +1,57 @@
|
||||
import pulp
|
||||
|
||||
adj = {
|
||||
0: [5],
|
||||
1: [2,4,5],
|
||||
2: [1,3,4],
|
||||
3: [2,4,7,8,10],
|
||||
4: [1,2,3,5,6,7],
|
||||
5: [0,1,4,6,12],
|
||||
6: [4,5,7,11,12],
|
||||
7: [3,4,6,8,9,11],
|
||||
8: [3,7,9,10,11,13],
|
||||
9: [7,8,11],
|
||||
10: [3,8,13,14],
|
||||
11: [6,7,8,9,12,13],
|
||||
12: [5,6,11,13,15],
|
||||
13: [8,10,11,12,14,15],
|
||||
14: [10,13,15],
|
||||
15: [12,13,14]
|
||||
}
|
||||
|
||||
n = 16
|
||||
A = [[0 for _ in range(n)] for _ in range(n)]
|
||||
|
||||
# A[click][affected]
|
||||
for click in range(n):
|
||||
A[click][click] = 2
|
||||
for affected in adj[click]:
|
||||
A[click][affected] = 1
|
||||
|
||||
prob = pulp.LpProblem("Map_Burning_Optimal", pulp.LpMinimize)
|
||||
|
||||
x = [pulp.LpVariable(f"x{i+1}", lowBound=0, cat="Integer") for i in range(n)]
|
||||
b = [pulp.LpVariable(f"b{i+1}", cat="Binary") for i in range(n)]
|
||||
|
||||
prob += pulp.lpSum(x)
|
||||
|
||||
# Pole startuje od -1, a końcowo ma być 3 albo 4
|
||||
# czyli suma wpływów ma dać 4 albo 5
|
||||
for j in range(n):
|
||||
lhs = pulp.lpSum(A[k][j] * x[k] for k in range(n))
|
||||
prob += lhs == 4 + b[j]
|
||||
|
||||
prob.solve(pulp.PULP_CBC_CMD(msg=0))
|
||||
|
||||
status = pulp.LpStatus[prob.status]
|
||||
objective = pulp.value(prob.objective)
|
||||
solution_x = [int(pulp.value(var)) for var in x]
|
||||
solution_v = [
|
||||
-1 + sum(A[k][j] * solution_x[k] for k in range(n))
|
||||
for j in range(n)
|
||||
]
|
||||
|
||||
print(f"Status: {status}")
|
||||
print(f"Minimal total clicks: {objective}")
|
||||
print("Clicks per pole (x1 to x16):", solution_x)
|
||||
print("Final burns per pole (v1 to v16):", solution_v)
|
||||
Reference in New Issue
Block a user