Perché questo vincolo di alzare un DCP Errore?

0

Domanda

Ho definito un problema di minimizzare il costo di esecuzione di una pompa. Che è definita come l'obiettivo del problema.

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

Il problema è definito:

problem = cp.Problem(objective, constraints)

Ho eseguito i calcoli utilizzando il cp.multiply e cp.vec per calcolare la differenza nel serbatoio volumi che fornisce la mia risposta mi aspetterei che con la corretta differenze.

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

Il problema sorge quando ho calcolato un totale cumulativo di sommatoria utilizzando cp.cumsum. Funziona e calcola correttamente, ma quando voglio aggiungere vincoli di tutto questo è che mi fornisca il DCPErrorIo sono sicuro di dove sto andando di male in tale calcolo come ha lavorato in precedenza nessun problema per me.

I vincoli vorrei definire sono:

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]

Il volume_constraint funziona perfettamente. Il problema è con il min_level_constraint e max_level_constraint.

Io un tentativo di soluzione utilizzando

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

Un traceback in cui sono forniti con:

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():

Mi sono guardato intorno la documentazione CVXPY e su Stack Overflow, ma non ho trovato niente che funziona per il mio problema. Sono sconcertato come ha funzionato per me in passato.

1
2

Dopo un paio di ore extra di deliberazione e di e di lavoro sul problema, sono stato in grado di capire il motivo.

Era come pensavo inizialmente che il mio calcolo per il mio flow_in non era DCP e non sono del tutto sicuro o capire il perché, ma mi sarà sicuramente di insegnamento di me in questo in momento di andare avanti.

Sono stato in grado di regolare il calcolo per il seguente aspetto se qualcuno si imbatte in qualcosa di simile in futuro, e può vedere come i miei calcoli cambiato in questione contro la risposta.

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

In altre lingue

Questa pagina è in altre lingue

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