大家好,本人算法菜鸟一枚,有个处理数据的问题想了好几天,也初步写了一点代码,总达不到理想的效果,希望高手们指点。
背景与数据细节这里先略过(考虑到公司数据的保密性与表达的无必要性)。
遇到的问题可以简单地归结到两个公式上面:
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迭代?