Pourquoi cette contrainte d'élever un DCP Erreur?

0

La question

J'ai défini un problème qui va réduire le coût de l'exécuter d'une pompe. Qui est défini comme l'objectif du problème.

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

Le problème est défini:

problem = cp.Problem(objective, constraints)

J'ai couru les calculs à l'aide de la cp.multiply et cp.vec pour calculer la différence de réservoir volumes qui fournit de ma réponse je m'attends à voir avec l'corriger les différences.

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

Le problème se pose lorsque j'ai calculé une somme cumulée à l'aide de cp.cumsum. Il fonctionne et calcule correctement, mais lorsque je souhaite ajouter des contraintes autour de cette offre à moi avec la DCPErrorJe ne sais pas où je suis, ne va pas dans ce calcul car il a travaillé auparavant aucun problème pour moi.

Les contraintes que je souhaite à définir sont:

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]

L' volume_constraint fonctionne parfaitement. Le problème est avec le min_level_constraint et max_level_constraint.

Je cherche une solution à l'aide de

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

Un traceback dans lequel je suis est fourni avec:

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

J'ai regardé autour de la documentation sur CVXPY et sur un Débordement de Pile, mais je n'ai rien trouvé à ce qui fonctionne pour mon problème. Je suis perplexe car il a travaillé pour moi dans le passé.

1
2

Après quelques heures supplémentaires de délibération et de et de travailler sur le problème, j'ai été en mesure de comprendre la raison.

C'était comme je le pensais au départ et mon calcul pour mon flow_in n'était pas le DCP et je ne suis pas entièrement sûr ou à comprendre pourquoi, mais je serai certainement l'enseignement de moi-même dans le temps à aller de l'avant.

J'ai été en mesure d'ajuster le calcul de ressembler à la suivante, si quelqu'un vient à travers quelque chose comme cela dans l'avenir, et de voir comment mes calculs changé dans la question par rapport à la réponse.

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

Dans d'autres langues

Cette page est dans d'autres langues

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