De ce această constrângere ridica o DCP Eroare?

0

Problema

Am definit o problemă care va minimiza costul de a rula o pompă. Asta este definit ca obiectiv al problemei.

cost_cp = cp.sum(cp.multiply(cost_,selection))
objective = cp.Minimize(cost_cp)

Problema definiției este:

problem = cp.Problem(objective, constraints)

Am fugit calcule folosind cp.multiply și cp.vec pentru a calcula diferența în rezervor volume care oferă mea răspunsul m-aș aștepta cu diferențe corecte.

flow_in = cp.vec(cp.multiply(input_flow_, flow_in_minutes))
flow_out = cp.vec(flow_out_)
flow_diff = flow_in - flow_out

Problema apare atunci când am calculat o acumulare însumare folosind cp.cumsum. Acesta funcționează și calculează corect, dar cand am vrut pentru a adăuga constrângeri în jurul valorii de acest lucru este oferă mine cu DCPError, Nu sunt sigur în cazul în care am de gând greșit în astfel de calcul ca acesta a lucrat anterior nici o problema pentru mine.

Constrângerile aș vrea să definesc sunt:

volume_constraint = volume_cp >= 300000
min_level_constraint = res_level >= min_level
max_level_constraint = res_level <= max_level

constraints = [assignment_constraint, volume_constraint, min_level_constraint, max_level_constraint]

La volume_constraint functioneaza perfect. Problema este cu min_level_constraint și max_level_constraint.

Am încerca o soluție folosind

problem.solve(solver=cp.CPLEX, verbose=False)  

Un traceback în care sunt prevăzute cu este:

DCPError                                  Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_14560/1602474026.py in <module>
     33 
     34 # Problem solve
---> 35 problem.solve(solver=cp.CPLEX, verbose=False)

~\AppData\Local\Programs\Python\Python38\lib\site-packages\cvxpy\problems\problem.py in solve(self, *args, **kwargs)
    457         else:
    458             solve_func = Problem._solve
--> 459         return solve_func(self, *args, **kwargs)
    460 
    461     @classmethod

~\AppData\Local\Programs\Python\Python38\lib\site-packages\cvxpy\problems\problem.py in _solve(self, solver, warm_start, verbose, gp, qcp, requires_grad, enforce_dpp, **kwargs)
    936                 return self.value
    937 
--> 938         data, solving_chain, inverse_data = self.get_problem_data(
    939             solver, gp, enforce_dpp, verbose)
    940 

~\AppData\Local\Programs\Python\Python38\lib\site-packages\cvxpy\problems\problem.py in get_problem_data(self, solver, gp, enforce_dpp, verbose)
    563         if key != self._cache.key:
    564             self._cache.invalidate()
--> 565             solving_chain = self._construct_chain(
    566                 solver=solver, gp=gp, enforce_dpp=enforce_dpp)
    567             self._cache.key = key

~\AppData\Local\Programs\Python\Python38\lib\site-packages\cvxpy\problems\problem.py in _construct_chain(self, solver, gp, enforce_dpp)
    789         candidate_solvers = self._find_candidate_solvers(solver=solver, gp=gp)
    790         self._sort_candidate_solvers(candidate_solvers)
--> 791         return construct_solving_chain(self, candidate_solvers, gp=gp,
    792                                        enforce_dpp=enforce_dpp)
    793 

~\AppData\Local\Programs\Python\Python38\lib\site-packages\cvxpy\reductions\solvers\solving_chain.py in construct_solving_chain(problem, candidates, gp, enforce_dpp)
    153     if len(problem.variables()) == 0:
    154         return SolvingChain(reductions=[ConstantSolver()])
--> 155     reductions = _reductions_for_problem_class(problem, candidates, gp)
    156 
    157     dpp_context = 'dcp' if not gp else 'dgp'

~\AppData\Local\Programs\Python\Python38\lib\site-packages\cvxpy\reductions\solvers\solving_chain.py in _reductions_for_problem_class(problem, candidates, gp)
     89             append += ("\nHowever, the problem does follow DQCP rules. "
     90                        "Consider calling solve() with `qcp=True`.")
---> 91         raise DCPError(
     92             "Problem does not follow DCP rules. Specifically:\n" + append)
     93     elif gp and not problem.is_dgp():

M-am uitat în jurul valorii de documentare pe CVXPY și pe Stack Overflow, dar nu am găsit nimic în care funcționează pentru problema mea. Eu sunt uimit ca ea a lucrat pentru mine în trecut.

1
2

După câteva ore în plus la deliberare și de lucru pe problema, am fost în stare să-mi dau seama de motiv.

A fost așa cum am crezut inițial și calculul meu pentru a-mi flow_in nu DCP și eu nu sunt în totalitate sigur sau nu înțeleg de ce, dar nu va fi cu siguranta de predare mine acest lucru în timpul de acum înainte.

Am fost capabil să se adapteze calcul să arate în felul următor, dacă vine cineva peste așa ceva în viitor, și puteți vedea cât de calculele mele s-a schimbat în cauză versus răspunsul.

flow_in = cp.sum(cp.multiply(volume_,selection),axis=1)
flow_out = cp.vec(flow_out_) # Value in litres -> must convert to a volume
flow_diff = (flow_in - flow_out) / 1000
res_level = cp.cumsum(flow_diff) / 160.6 + 2.3
2021-10-22 13:34:16

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................