diff --git a/solve.py b/solve.py index f598df5..2baa9ee 100644 --- a/solve.py +++ b/solve.py @@ -1582,12 +1582,16 @@ def solve( else max_res ) - capE = _ceiling(finalE) - capB = _ceiling(finalB) - capS = _ceiling(finalS) - m.Add(finalE <= capE) - m.Add(finalB <= capB) - m.Add(finalS <= capS) + finals = {"E": finalE, "B": finalB, "S": finalS, "C": C[NUM_STEPS + 1]} + + # Ceilings only for resources that appear in the objective: each + # ceiling solve costs up to 20s, and only objective resources need + # bounds (product mode) / benefit from the redundant cap constraint. + caps = {} + for k, var in finals.items(): + if obj_factors[k] != 0: + caps[k] = _ceiling(var) + m.Add(var <= caps[k]) # ====================================================================== # OBJECTIVE IS SET HERE @@ -1629,7 +1633,8 @@ def solve( status = solver.Solve(m) if verbose: - print(f"(resource ceilings used: E<={capE} B<={capB} S<={capS})") + caps_str = " ".join(f"{k}<={v}" for k, v in caps.items()) + print(f"(resource ceilings used: {caps_str})") _report( solver, status,