왜 이러한 제약 조건을 높 DCP 오류가?

0

질문

저는 정의 문제는 것입니다 비용을 최소화를 실행하 펌프입니다. 는 것으로 정의의 목적은 문제입니다.

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

문제를 정의한다:

problem = cp.Problem(objective, constraints)

내가 사용하여 계산 cp.multiplycp.vec 을 계산하는 차이점에 저수지 볼륨을 제공하는 제 응답이 제가 기대하는 것으로 올바른 차이점이 있습니다.

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

문제가 발생하면 내가 계산한 누적적인 요약 사용 cp.cumsum. 그것은 작품과가 올바르게 계산하지만,때 나는 소원을 추가 제약 조건이 나를 제공합 DCPError에,나는 어디에 내가 잘못된 것 같은 계산에는 일 이전에 문제가 없습니다.

제약하고 싶을 정의는:

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]

volume_constraint 완벽하게 작동합니다. 문제입 min_level_constraintmax_level_constraint.

나는 시도를 사용하여 솔루션

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

A 추적에서는 제공된다:

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

을 봤어요 주위에 설명서에 CVXPY 및 스택에서 오버플로우 하지만 나는 아무것도 발견하는 작품에 대한 내 문제입니다. 나는 좌절로 그것이 나를 위해 일했다.

1
2

몇 시간 후에 추가의 심의와 문제에 대한 작업을 수 있었 파악하는 이유입니다.

었으로 생각 처음에는 내가 계산한 나 flow_in 지 않았 DCP 고 나는 전적으로 확인 또는 이유를 이해하지만,나는 확실히 자신을 가르치고 이 시간에 진정한 가치를 발견 할 수 있습니다

조정할 수 있었을 계산하는 다음과 같은 경우 사람에 걸쳐 제공됩에서 다음과 같이,미래를 볼 수 있는 방법을 내 계산 변경 질문에 대답.

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

다른 언어로

이 페이지는 다른 언어로되어 있습니다

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