我的优化器的目标是计算列D的新值,使得新值总是(D * 0.8和lt=NexYd(或x以下)& lt;=D*1.2),我们调用这些x的边界。
最大化功能是:
cvx.sum[cvx.multiply((data['c']*data['f']/data['d']).tolist(),x)]
我还有一个限制:
cvx.sum[cvx.multiply((data['f']*data['e']*data['c']/data['d']).tolist(),x**2]==data['c'].sum()
import pandas as pd
import numpy as np
import re
import cvxpy as cvx
data = pd.DataFrame(data={
'A': [1, 2, 3, 4, 5],
'B': [100, 50, 40, 80, 20],
'C': [1200, 600, 900, 6500, 200],
'D': [0.4, 1.2, 0.8, 1.6, 1.1],
'E': [0.4, 0.5, 0.6, 0.4, 0.5],
'F': [0.8, 0.4, 1.2, 1.6, 1],
})
x = cvx.Variable(data.index.size)
现在,我想添加一个第三附加的二次约束,它表示列C的总和总是常数。
constraints = [
x * 0.8 <= x,
x <= x * 1.2,
cvx.sum(
cvx.multiply((data['F']*data['E']*data['C']/data['D']).tolist(), x**2)
) == data['C'].sum()
]
你可以看到的最小化函数很简单,是线性的。但是,如何将此转换为最大化函数?
objective = cvx.Minimmize(
cvx.sum(
cvx.multiply((data['C']*data['F']/data['D']).tolist(), x)
)
)
prob = cvx.Problem(objective, constraints)
prob.solve()
print(x.value)
我正在浏览CVXPY文档,它帮助了我很多!但我没有看到任何例子有第三个约束设计类似于我的,我得到了错误“dcperror:problem does not follow dcp rules”。