【发布时间】:2016-05-11 13:33:24
【问题描述】:
假设我有 N 个列表(向量),我想从中选择 x 个 1<x<[N](x 不是预先确定的)
所以我会得到 func(lists) 的最大值。
例如:
l1 = [3,4,7,-2]
l2 = [0.5,3,6,2.7]
l3 = [0,5,8,3.6]
mat = [l1, l2, l3]
result = maximize(func, mat)
def func(mat):
# doing some math between lists. For Example:
sum_list = list(mat[0])
for li in mat[1:]:
sum_list = map(operator.add, sum_list, li)
accum_min_lst = []
for i, val in enumerate(sum_list):
x = sum_list[:i + 1]
accum_min_lst.append(val - max(x))
return min(accum_min_lst)
可能的结果:
[l1], [l2], [l3], [l1,l2], [l1,l3], [l2,l3], [l1,l2,l3]
如果我要编写一个简单的解决方案并运行所有组合,它将永远花费 2^N。
我正在尝试使用cvxpy 或scipy.optimize.minimize 寻找解决方案 但我发现很难理解我需要使用哪种函数来解决我的问题,我想也许我应该尝试进化算法来找到一个近似的答案, 或者我应该改用portfolio optimization。
【问题讨论】:
-
如果您对
func()一无所知,这是一个组合问题,正如您已经指出的那样。func()的示例将有助于了解是否可以做更多事情...... -
无论
func()的性质如何,这都是一个离散优化问题。scipy.optimize.minimize是针对连续问题的,所以在这里用处不大。cvxpy可能很有用,前提是您的成本函数实际上是凸的。如果它不是凸的,那么您将需要使用某种全局优化策略,例如模拟退火。 -
嗨 @ali_m 谢谢你的回答,我不确定我的函数是凸的还是凹的,我在 cvxpy 中看到了 advanced function section 但我认为我的函数更复杂或者可能是那里有几个功能的组合。
标签: python scipy mathematical-optimization discrete-mathematics cvxopt