feat: build objective from factors dict in product or sum mode
This commit is contained in:
parent
43636d330e
commit
98eeb18e3c
1 changed files with 17 additions and 20 deletions
37
solve.py
37
solve.py
|
|
@ -1596,26 +1596,23 @@ def solve(
|
||||||
# ======================================================================
|
# ======================================================================
|
||||||
# OBJECTIVE IS SET HERE
|
# OBJECTIVE IS SET HERE
|
||||||
# ======================================================================
|
# ======================================================================
|
||||||
def Eprod(v):
|
if objective_mode == "sum":
|
||||||
return v * v
|
# Linear: CP-SAT takes weighted sums (negative weights included)
|
||||||
|
# directly, no auxiliary variables needed.
|
||||||
def Bprod(v):
|
m.Maximize(sum(f * finals[k] for k, f in obj_factors.items() if f))
|
||||||
return v
|
else:
|
||||||
|
# Product: maximize prod(finals[k] ** obj_factors[k]). Expand the
|
||||||
def Sprod(v):
|
# exponents into a flat factor list and fold pairwise, carrying a
|
||||||
return v * v
|
# running upper bound from the Phase-1 caps.
|
||||||
|
factor_keys = [k for k, f in obj_factors.items() for _ in range(f)]
|
||||||
prodEE = m.NewIntVar(0, Eprod(capE), "prodEE")
|
obj = finals[factor_keys[0]]
|
||||||
m.AddMultiplicationEquality(prodEE, [finalE, finalE])
|
bound = caps[factor_keys[0]]
|
||||||
prodSS = m.NewIntVar(0, Sprod(capS), "prodSS")
|
for k in factor_keys[1:]:
|
||||||
m.AddMultiplicationEquality(prodSS, [finalS, finalS])
|
bound *= caps[k]
|
||||||
prodBB = m.NewIntVar(0, Bprod(capB), "prodBB")
|
nxt = m.NewIntVar(0, bound, "")
|
||||||
m.AddMultiplicationEquality(prodBB, [finalB])
|
m.AddMultiplicationEquality(nxt, [obj, finals[k]])
|
||||||
prodEB = m.NewIntVar(0, Eprod(capE) * Bprod(capB), "prodEB")
|
obj = nxt
|
||||||
m.AddMultiplicationEquality(prodEB, [prodEE, prodBB])
|
m.Maximize(obj)
|
||||||
obj = m.NewIntVar(0, Eprod(capE) * Bprod(capB) * Sprod(capS), "obj")
|
|
||||||
m.AddMultiplicationEquality(obj, [prodEB, prodSS])
|
|
||||||
m.Maximize(obj)
|
|
||||||
|
|
||||||
# ---- Phase 2: solve the product to optimality ----
|
# ---- Phase 2: solve the product to optimality ----
|
||||||
solver = cp_model.CpSolver()
|
solver = cp_model.CpSolver()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue