大家好,本人算法菜鳥一枚,有個處理數據的問題想了好幾天,也初步寫了一點代碼,總達不到理想的效果,希望高手們指點。
背景與數據細節這里先略過(考慮到公司數據的保密性與表達的無必要性)。
遇到的問題可以簡單地歸結到兩個公式上面:
1、K0 = A1*Px
2、Kt = It+(1-Jt)*Kt-1
公式中變量及要求說明:
1、目前收集的數據是從1978年到2012年,計算時需要選定某一年為基年,然后以該基年的數據為起點開始往下計算某些屬性值。如基年選定1978,則以1978年的數據為起點,一直計算到2012,同理,若基年為1995,則以1995年的數據為起點,一直計算到2012。
2、上面提到以基年為起點能算到一些屬性值,如A, I,易知這兩個屬性變量均為向量,元素個數為最新數據年份-基年+1,如基年為1995,則個數為2012-1995+1 = 18,It表示第t年的I值,t范圍[1,18]。但還有些屬性值需要通過兩個不定因素的迭代計算得到,如K:K0和A1,P有關,這里的P為第一個不定因素,變化范圍[4.0,5.5],亦是迭代的第一層。
寫過代碼的朋友都清楚,這一層迭代只要一個for循環即可完成,這里給出Matlab代碼,基年假定為1995。
1 for Px = 4.0:0.1:5.5 2 K(1,1) = A(1,1)*Px; % Matlab中(i,j)表示取矩陣或向量的第i行,第j列元素,這里的變量均為列向量 3 for t = 2:18 % 后面年份K值的計算 4 K(t,1) = I(t,1)+(1-J(t,1))*K(t-1,1);
end 5 end
若在Px這個迭代過程中加入最優解評判標准,則可知對於某一個基年,Px最優取值只有一個(假定評判時沒有相同的最優結果),也可以說Px參數只針對基年,和后面年份無直接關系。如1995對應4.5,1998對應4.7,這個沒有什么難處,也很好理解。
問題就在於第二個不定因素:J。在計算最優解過程中,J參數和基年無關,但和后面年份相關且每年對應的J值均在范圍[0.1,0.23]。
說到這,本人的本能反應是在第一層迭代中加入J的多層迭代,如基年為2010,則還需加入2011,2012這兩年的J值迭代過程。代碼如下:
for Px = 4.0:0.1:5.5 K(1,1) = A(1,1)*Px; % Matlab中(i,j)表示取矩陣或向量的第i行,第j列元素,這里的變量均為列向量 for J1 = 0.1:0.001:0.23 for J2 = 0.1:0.001:0.23 J = [1,J1,J2]'; % 符號'表示行向量轉為列向量,第一個元素無效,只做占位用,因為需從基年的下一年開始計算 for t = 2:3 % 后面年份K值的計算 K(t,1) = I(t,1)+(1-J(t,1))*K(t-1,1); % 最優解評判過程在此處 end end end end
表面上看,問題解決了,至少在不管最優解能否滿足實際需求的前提下。但是仔細一想,忽略了至關重要的一點——最新年份與基年的變動性。看下面列出的幾種可能的情況就能知道問題所在:
1、上述代碼中的例子,基年為2010,最新年份為2012,則迭代嵌套為兩層;
2、最初提到的基年為1978,最新年份為2012,需35層;
3、后面提到的基年1995,最新年份為2012,需18層;
4、用戶提供的數據也許最新年份為2013或2014等,同樣,基年選擇1999或2005等;面對這種最新年份與基年都不確定的情況,不定因素J的迭代過程該如何實現?
本人的能力確實想不出好的方法,目前能做到的只是能確定迭代的次數,如最新年份為2015,基年選取為2000,則迭代嵌套為2015-2000 = 15層。
提醒一點,確定了層數之后不管其大小如何,是可以實現,如30層就寫30個for循環。隨着最新年份與基年的變動,層數也跟着變,但是怎么讓實現過程也相應地等價層數呢?
換句話說,上面的疑問即是:
1、若層數為2,則為兩個for循環;
2、若層數為10,則對應十個for循環;
3、但是數據的最新年份由統計時間或要求決定,基年選擇也不能事先確定,怎么做到:根據用戶的數據與基年的選擇情況,實現相應的J迭代?