У меня проблема с оптимизацией функции, содержащей циклы.Я начинаю с определенного значения lista=[0.002,0.006,0.003,0.02,0.008,0.006,0.05]
с плавающей точкой и интервалов `(0, k * 0,0025), (0,005, k * 0,005), (0,005, k * 0,0125), где зависит верхняя граница.Таким образом, в зависимости от того, к какому из интервалов относится поплавок списка, я назначаю функции одно из значений k * 0,005, k * 0,01, k * 0,025 и k * 0,05, которые также зависят от k.
Я хочу минимизировать k
так, чтобы сумма (новая скалярная функция) значений assign(k)
или sum(assign(k))
была равна 0,32.
Я использовал scipy.optimize
процедуру, чтобы сделать это.Мое ограничение - constraint=sum(assign(k))-0.32
и целевая функция iz fun(k)=k
.Итак, я минимизировал k
для удовлетворения ограничения.
import scipy
from scipy.optimize import minimize
lista=[0.002,0.006,0.003,0.02,0.008,0.006,0.05]
def assign(k):
return list(map(lambda x:(k*0.005 if x in np.arange(0,k*0.0025,0.001)
else k*0.01 if x in np.arange(0.0025,k*0.005,0.001) else k*0.025 if x in
np.arange(0.005,k*0.0125,0.001) else k*0.05), lista))
def constraint(k):
return sum(assign(k))-0.32
def fun(k):
return k
k0=0
bnds=[(0,10)]
cons={'type':'eq','fun':constraint}
res=minimize(fun,k0,bounds=bnds,method='SLSQP',constraints=cons,options={'maxiter':2000})
print(res)
Я получил k = 1,1999 , что является странным результатом, он не удовлетворяет ограничению.Это должно быть 2
, так как sum(assign(2))=0.52
.Я также получил сообщение об ошибке:
message: 'Iteration limit exceeded'
Кто-нибудь знает, как преодолеть это ограничение?Заранее спасибо!