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
|
||||
# ======================================================================
|
||||
def Eprod(v):
|
||||
return v * v
|
||||
|
||||
def Bprod(v):
|
||||
return v
|
||||
|
||||
def Sprod(v):
|
||||
return v * v
|
||||
|
||||
prodEE = m.NewIntVar(0, Eprod(capE), "prodEE")
|
||||
m.AddMultiplicationEquality(prodEE, [finalE, finalE])
|
||||
prodSS = m.NewIntVar(0, Sprod(capS), "prodSS")
|
||||
m.AddMultiplicationEquality(prodSS, [finalS, finalS])
|
||||
prodBB = m.NewIntVar(0, Bprod(capB), "prodBB")
|
||||
m.AddMultiplicationEquality(prodBB, [finalB])
|
||||
prodEB = m.NewIntVar(0, Eprod(capE) * Bprod(capB), "prodEB")
|
||||
m.AddMultiplicationEquality(prodEB, [prodEE, prodBB])
|
||||
obj = m.NewIntVar(0, Eprod(capE) * Bprod(capB) * Sprod(capS), "obj")
|
||||
m.AddMultiplicationEquality(obj, [prodEB, prodSS])
|
||||
m.Maximize(obj)
|
||||
if objective_mode == "sum":
|
||||
# Linear: CP-SAT takes weighted sums (negative weights included)
|
||||
# directly, no auxiliary variables needed.
|
||||
m.Maximize(sum(f * finals[k] for k, f in obj_factors.items() if f))
|
||||
else:
|
||||
# Product: maximize prod(finals[k] ** obj_factors[k]). Expand the
|
||||
# exponents into a flat factor list and fold pairwise, carrying a
|
||||
# running upper bound from the Phase-1 caps.
|
||||
factor_keys = [k for k, f in obj_factors.items() for _ in range(f)]
|
||||
obj = finals[factor_keys[0]]
|
||||
bound = caps[factor_keys[0]]
|
||||
for k in factor_keys[1:]:
|
||||
bound *= caps[k]
|
||||
nxt = m.NewIntVar(0, bound, "")
|
||||
m.AddMultiplicationEquality(nxt, [obj, finals[k]])
|
||||
obj = nxt
|
||||
m.Maximize(obj)
|
||||
|
||||
# ---- Phase 2: solve the product to optimality ----
|
||||
solver = cp_model.CpSolver()
|
||||
|
|
|
|||
Loading…
Reference in a new issue