我有优化模型的问题。我的函数在迭代过程中递增变量(Dem)的值,以达到“WHILE”中设置的条件。
我不得不使用“FOR”和一些“IF”,我知道这会在R环境中进行非常缓慢的处理,但我必须在R中进行。 变量P是10958 obs的长度。变量A和C的长度为65511 obs。
使用system.time(myfunction),只使用变量Area [1]和C [1]中的一个元素,我的电脑需要2.5秒才能完成整个过程。但是对于Area和C的所有元素都需要45个小时。
我的教授说它太慢了,但我认为对于数据量是正常的,有一种方法可以优化这个吗?应该选择使用WHILE来优化函数(PSO,DEoptim等)吗?
myfunction = function(P,Area,C,Cap,Inc){
Vin<- Cap
Q<-NA
Ov<-NA
Def<-NA
Vf<-NA
Vp<-NA
Dem<-0
Dem_100<-NA
Fail<-0
for (i in 1:length(Area)){
while(Fail==0){
Dem<-Dem+Inc
for (j in 1:length(P)){
#-----------------------------------------------------------------------#
####################### Calculate Q #####################################
#-----------------------------------------------------------------------#
if (P[j]==0){
Q<-0
}else{
Q<-P[j]*Area[i]*C[i]
}
#-----------------------------------------------------------------------
################################ Calculate Vp ##########################
#-----------------------------------------------------------------------
Vp<- (Vin + Q) - Dem
if(Vp<0){
Fail<-1
break #stop For j and continue the while
}
#----------------------------------------------------------------------
###################################### Calculate OV ###################
#----------------------------------------------------------------------
if (Vp>Cap){
Ov<-Vp-Cap
}else{
Ov<-0
}
#---------------------------------------------------------------------
######################################## Calculate Def ###############
#---------------------------------------------------------------------
if (Vp<0){
Def<-0-Vp
}else{
Def<-0
}
#---------------------------------------------------------------------#
################################## Calculate Vf ###########
#---------------------------------------------------------------------#
if (Vp>Cap){
Vf<-Cap
}else{
if (Vp<0) {
Vf<-0
}else{
Vf<-Vp
}
}
#-----------------------------------------------------------------------#
################################## Update Vin ###########
#-----------------------------------------------------------------------#
Vin<-Vf
}
Vin<- Cap # Reset the var Vin for new j
}
Dem_100[i]<-Dem-Inc
Def<-NA
Dem<-0
Vin<- Cap
Fail<-0
}
return(list(DemGar100=Dem_100))
}
测试时间过程
P<-abs(rnorm(10958))
system.time(myfunction(P = P,Area = 100,C = 0.8,Cap = 10000,Inc = 1))
user system elapsed
2.45 0.00 2.50
答案 0 :(得分:0)
没有足够的代表发表评论,但由于没有完整答案,它应该去那里。
你有没有想过用ifelse替换一些ifs?这应该加快速度 例如,您可以用以下内容替换整个j循环:
for(i in 1:length(Area)){
而(失败== 0){
DEM&LT; -Dem +公司
Q&lt; -elelse(P == 0,0,P * Area [i] * C [i])## note Q是长度为(P)的向量 ......
另外我认为Def似乎永远不会计算(当Vp <= Cap时Vf总是Vp),因为如果Vp <0你跳出j循环甚至可能是while(你设置失败为1) ,但我不知道什么时候R检查条件,在周期结束时?或者开始)