我有一个优化模型的问题。我的函数在迭代过程中递增变量(Dem)的值,以达到"WHILE“中设置的条件。
我必须使用"FOR's“和一些"IF's",我知道这使得R环境中的处理非常慢,但我必须在R中这样做。变量P是10958个of的长度。变量A和C的长度为65511个obs。
使用system.time (myfunction),只使用变量Area 1和C1中的一个元素,我的计算机需要2.5秒来完成这个过程。但对于Area和C的所有元素,将需要45个小时。
我的教授说它太慢了,但我认为数据量是正常的,有什么方法可以优化它吗?选项是否应该优化函数(PSO、DEoptim等)而不是使用WHILE?
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发布于 2014-11-19 19:21:12
没有足够的代表来评论,但既然不是一个完整的答案,它应该放在那里。
你有没有想过用if替换掉一些if?这应该会加快速度,例如,你可以用下面这样的东西替换整个j-loop:
(i in 1:长度(面积)){
while(Fail==0){
Dem<-Dem+Inc
Q <-如果##note (P==0,0,P*Areai*Ci) q是一个长度为(P)的向量...
此外,我认为Def似乎从未计算过(当失败时,Vf总是Vp ),因为如果失败,你会跳出j循环,甚至可能跳出while (你将Vp<0设置为1,但我不知道R何时检查条件,在循环结束时?还是在开始时)
https://stackoverflow.com/questions/27007029
复制相似问题