Bu kısıtlama neden bir DCP Hatasına neden oluyor?

0

Soru

Bir pompayı çalıştırmanın maliyetini en aza indirecek bir sorun tanımladım. Bu sorunun amacı olarak tanımlanır.

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

Tanımlanan sorun şu şekildedir:

problem = cp.Problem(objective, constraints)

Kullanarak hesaplamalar yaptım cp.multiply ve cp.vec cevabımı sağlayan rezervuar hacimlerindeki farkı hesaplamak için doğru farklılıklarla beklerdim.

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

Sorun, kümülatif bir toplamı kullanarak hesapladığımda ortaya çıkıyor cp.cumsum. Doğru çalışır ve hesaplar, ancak bunun etrafına kısıtlamalar eklemek istediğimde bana şunları sağlar DCPError Daha önce benim için sorun yaratmadığı için böyle bir hesaplamada nerede yanlış gittiğimden emin değilim.

Tanımlamak istediğim kısıtlamalar şunlardır:

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]

Bu volume_constraint mükemmel bir şekilde çalışıyor. Sorun ile min_level_constraint ve max_level_constraint.

Kullanarak bir çözüm deniyorum

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

Bana verilen bir geri dönüş:

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 ve Stack Overflow belgelerine baktım ancak sorunum için işe yarayan hiçbir şey bulamadım. Geçmişte benim için çalıştığı için şaşkınım.

1
2

Birkaç saat daha düşündükten ve sorun üzerinde çalıştıktan sonra nedenini anlayabildim.

Başlangıçta düşündüğüm gibi oldu ve benim için hesaplamam flow_in DCP değildi ve nedenini tam olarak bilmiyorum ya da anlamıyorum, ama ileriki zamanlarda kesinlikle kendime bunu öğreteceğim.

Gelecekte böyle bir şeyle karşılaşan varsa, hesaplamayı aşağıdaki gibi görünecek şekilde ayarlayabildim ve hesaplamalarımın cevaba karşı soruda nasıl değiştiğini görebiliyorum.

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

Diğer dillerde

Bu sayfa diğer dillerde

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