2014-11-06 4 views
2

Я пытаюсь свести к минимуму линейную функцию более тысячи переменных. Эти ограничения являются: (ш NumPy массив с типом элемента float64)scipy.optimize.minimize игнорирует ограничение

cons = ({'type': 'ineq', 'fun': lambda w: 0.01 - abs(np.sum(w))}, 
     {'type': 'ineq', 'fun': lambda w: 1 - abs(np.sum(vMax0(w)))}, 
     {'type': 'ineq', 'fun': lambda w: 1 - abs(np.sum(vMin0(w)))}) 

, где vMax0 и vMin0 только векторизованы функцию макс (х, 0) и (х мин, 0). Оператор оптимизации:

w_raw = minimize(totalRisk, w0, bounds = wBounds, constraints = cons, 
        method='SLSQP', options={'disp': True}) 

Но оптимальные параметры даже не в допустимой области. Фактически, оптимальные параметры выходят из допустимой области после 1 или 2 итераций. Какая может быть причина? Благодаря!

+0

Ваши ограничения <= 1 и <= 0,01? – ryanpattison

+3

Ваша строка 'cons' даже не синтаксически корректна. Просьба предоставить SSCCE (http://sscce.org/), который демонстрирует проблему. – NPE

+0

@rpattiso В принципе, я хочу, чтобы сумма компонентов w была близка к 1 (<0,01), а положительные компоненты имели сумму меньше или равную 1, а отрицательные компоненты имеют сумму, большую или равную -1. –

ответ

0

Первое ограничение на сумму составляет -0.01 <= sum(w) <= 0.01, которое не «близко к 1».

cons = ({'type': 'ineq', 'fun': lambda w: 0.01 - abs(1 - np.sum(w))}, 
    {'type': 'ineq', 'fun': lambda w: 1 - abs(np.sum(vMax0(w)))}, 
    {'type': 'ineq', 'fun': lambda w: 1 - abs(np.sum(vMin0(w)))}) 

Теперь абсолютная разница суммы в один не больше, чем 0,01 :)

+0

жаль, что это была опечатка - я имел в виду, что сумма (w) должна быть близка к 0 :( –

Смежные вопросы