[英]Scipy Minimize - Unable to minimize objective function
我正在嘗試使用scipy minimise優化函數以找到rev_tot
最大值。 這里obj_data
是一個概率列表, prem
是一個常數, inc
可以采用任何實際值。 以下是我為目標函數編寫的代碼:
import numpy as np
import pandas as pd
import scipy
from scipy.optimize import minimize
def objective(x,*args):
prem = args[0]
prob = args[1]
inc = x[0]
rev_tot = 0
rev = 0
del_p = 0.2*(1-np.exp(-2*(1-np.exp(-inc/400))))
for i in range(len(prob)):
rev = (prob[i]*(1+del_p)*prem) - inc
rev_tot = rev_tot + rev
return 1/rev_tot
prem = 3300
par = [0.9,0.1,0.5,0.4]
x0 = np.array([3]) # initial guess
solve = minimize(objective,x0,args=(prem,par),method='SLSQP')
solve.x
我想找到inc
值,它將最小化1/rev_tot
(從而最大化rev_tot
。當我調用時:
minimize(objective,x0,args=(prem,par),method='SLSQP')
該函數運行,但是solve.x
初始值沒有變化。 我無法弄清楚為什么沒有發生最小化。
您的問題是由於您的return 1/rev_tot
,求解器必須處理極小的數字。 因此,x軸上的變化不能很好地反映在y值的變化中,並且求解器估計它已經收斂:
import numpy as np
import pandas as pd
import scipy
from scipy.optimize import minimize
def objective(x,*args):
prem = args[0]
prob = args[1]
inc = x[0]
rev_tot = 0
rev = 0
del_p = 0.2*(1-np.exp(-2*(1-np.exp(-inc/400))))
for i in range(len(prob)):
rev = (prob[i]*(1+del_p)*prem) - inc
rev_tot = rev_tot + rev
return 1/rev_tot
prem = 3300
par = [0.9,0.1,0.5,0.4]
x0 = np.array([2]) # initial guess
solve = minimize(objective,x0,args=(prem,par),method='SLSQP')
x_min = solve.x
print(x_min)
#plot your function to visualize the outcome
x_func = np.linspace(1, 100, 1000)
y_func = []
for item in x_func:
y_func.append((objective(np.asarray([item]), prem, par)))
y_min = objective(np.asarray([x_min]), prem, par)
plt.plot(x_func, y_func)
plt.plot(x_min, y_min, "ro")
plt.show()
輸出:
[2.]
解決方案1)
不同的求解器對某些問題的管理比其他解決方案要好。 將您的求解器更改為“ Nelder-Mead”。 輸出:
[63.07910156]
解決方案2)
使用求解器“ SLSQP”的返回值return 1000000/rev_tot
擴大返回值。 輸出:
[63.07110511]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.