Предположим, у меня есть 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() 'был бы полезен, если бы можно было сделать больше ... – Dietrich
Какова бы ни была природа' func() ', это проблема дискретной оптимизации. 'scipy.optimize.minimize' для непрерывных задач, поэтому здесь здесь не будет много пользы. 'cvxpy' может быть полезна при условии, что ваша функция стоимости фактически выпукла. Если он не выпуклый, вам нужно будет использовать какую-то глобальную стратегию оптимизации, такую как моделируемый отжиг. –
Hi @ali_m благодарит вас за ответ, я не уверен, что мой func выпуклый или вогнутый, я видел раздел [расширенный раздел] (http://www.cvxpy.org/en/latest/tutorial/functions /index.html?highlight=sum_entries) в cvxpy , но я думаю, что моя функция более сложная или, может быть, комбинация нескольких функций там. –