我希望,我可以使我的问题尽可能清楚,这不是荒谬的。问题如下: 我需要最大化所有函数的变量必须具有相同值的函数结果的平均值(10,000)。但是,我对10,000个函数的单个结果有限制。
从我的角度来看,它应该很容易解决,但是由于我还不熟悉python中的优化,所以我真的不知道如何解决这个问题。
以下函数mean_revenue
需要通过更改biddingvol
进行优化,merged
是具有10,000个半随机行的数组,其中包含Allocation
的值,依此类推。
def mean_revenue(biddingvol,merged):
#Rev_df is a df with the 10,000 rows
Rev_df=pd.DataFrame({'Allocation':merged[:,0],'Price':merged[:,1],
'Consume':merged[:,2],'Feed':merged[:,3]})
Rev_df['Revenue']=calc_revenue(biddingvol,Rev_df.Allocation,Rev_df.Price,
Rev_df.Consume,Rev_df.Feed)
Mean_Rev=statistics.mean(Rev_df.Revenue)
Max_Rev=max(Rev_df.Revenue)
Min_Rev=min(Rev_df.Revenue)
df_Revenue_sorted=np.sort(Rev_df.Revenue)
VaR95=np.quantile(df_Revenue_sorted,0.05)
return Mean_Rev,Max_Rev,Min_Rev,VaR95
calc_revenue
计算每行的个人收入,这是一个线性函数,取决于带有一个可能不连续点的biddingvol。
通过使用while循环,我可以找到指定范围(0-14)内的不受限制的最大值。但是,我想确保风险值可能不会低于-1000。
bid=1
while True:
bid1=list(mean_revenue(bid,random_array))
bid0=list(mean_revenue(bid-1,random_array))
if (bid1[0]<bid0[0]) or bid>14:
overal.extend([bid0+[bid-1]])
break
bid=bid+1
将if行更改为if (bid1[0]<bid0[0] and bid1[3]<-1000) or bid>14:
并不符合期望的结果,因为VaR仍低于-1000。
为此使用scipy.optimize
中的方法是否明智?
谢谢!