使用CVXPY的cp.Maximize功能最大化重量和分数的总和。添加了约束,即w不能大于零,但失败。
import cvxpy as cp
score = [0.5322351127,0.3196822284,0.5692263923,0.02034915925,0.2286454903,0.9427046072,0.348096277,0.9307845065,0.3239363128,0.7505620803,0.0594313546,0.3672346647,0.4161681319]
w = cp.Variable(13)
ret = score*w
prob = cp.Problem(cp.Maximize(ret), [cp.sum(w) == 1, w >= 0])
prob.solve(verbose=True)
print(w.value)
print(sum(w.value))
输出看起来像:
-----------------------------------------------------------------
OSQP v0.6.0 - Operator Splitting QP Solver
(c) Bartolomeo Stellato, Goran Banjac
University of Oxford - Stanford University 2019
-----------------------------------------------------------------
problem: variables n = 13, constraints m = 14
nnz(P) + nnz(A) = 26
settings: linear system solver = qdldl,
eps_abs = 1.0e-05, eps_rel = 1.0e-05,
eps_prim_inf = 1.0e-04, eps_dual_inf = 1.0e-04,
rho = 1.00e-01 (adaptive),
sigma = 1.00e-06, alpha = 1.60, max_iter = 10000
check_termination: on (interval 25),
scaling: on, scaled_termination: off
warm start: on, polish: on, time_limit: off
iter objective pri res dua res rho time
1 -1.7357e+01 7.24e+00 9.45e+01 1.00e-01 1.51e-04s
200 -9.4307e-01 5.73e-05 4.29e-05 1.29e+00 6.91e-04s
300 -9.4280e-01 1.44e-05 1.61e-05 2.31e-01 9.48e-04s
plsh -9.4270e-01 2.78e-23 5.23e-17 -------- 1.12e-03s
status: solved
solution polish: successful
number of iterations: 300
optimal objective: -0.9427
run time: 1.12e-03s
optimal rho estimate: 2.12e-01
[-1.71355380e-28 -1.71128890e-28 -1.71393898e-28 -1.70811497e-28
-1.71033364e-28 1.00000000e+00 -1.71159705e-28 1.38776160e-23
-1.71133513e-28 2.77554040e-23 -1.70853097e-28 -1.71179735e-28
-1.71232120e-28]
1.0
显然重量为负。
结果是最好的。否定条目接近零->科学计数法(具有很高的准确性)。
一些(更高级的)提示: