SAS中文论坛

标题: 求助:如何缩水让超大的循环得出结果 [打印本页]

作者: shiyiming    时间: 2009-2-23 00:27
标题: 求助:如何缩水让超大的循环得出结果
求助各位高手:
   有一个循环,变量ww1--ww10 共10个,每个变量从0-5循环,得到x=5的组合。
data aa ;
do ww1 =0 to 5;
do ww2 =0 to 5;
do ww3 =0 to 5;
do ww4 =0 to 5;
do ww5 =0 to 5;
do ww6 =0 to 5;
do ww7 =0 to 5;
do ww8 =0 to 5;
do ww9 =0 to 5;
do ww10 =0 to 5;
x=ww1+ww2+ww3+ww4+ww5+ww6+ww7+ww8+ww9+ww10;
i+1;
if x=5 then
do;
i1+1;
output;
end; end; end; end; end; end;
end; end; end; end; end;
run;

程序循环了50388481次,得到X=5的全部组合有2002个。怎样让这个循环次数缩水,最好只循环2002次?

如果有20个变量ww1--ww20,每个变量从0-5循环,得到x=5的全部组合,就需要循环9.536E13次,有没有解决办法?
作者: shiyiming    时间: 2009-3-2 20:44
标题: Re: 求助:如何缩水让超大的循环得出结果
如果有20个变量,看来用循环排列出所有的 X = 5 的组合是不可能。

用SAS/OR的规划能不能得到答案呢?

求助高手帮助,谢谢!!
作者: shiyiming    时间: 2009-3-3 00:29
标题: Re: 求助:如何缩水让超大的循环得出结果
不需要高手,你用点脑就行了。
[code:2zpuhdq9]
%macro doit(out=, n=10, k=5);
%local i;
data &out;
   array x[&n] _temporary_;
   x[1] = 0;
%do i=1 %to %eval(&n-1);
   do ww&i=0 to &k-x[&i];
      x[%eval(&i+1)] = x[&i]+ww&i;
%end;
      ww&n = &k-x[&n];
      output;
%do i=1 %to %eval(&n-1);
   end;
%end;
run;
%mend doit;
%doit(out=a)
%doit(out=b,n=20)
%doit(out=c,n=20,k=10)
[/code:2zpuhdq9]
作者: shiyiming    时间: 2009-3-3 20:39
标题: Re: 求助:如何缩水让超大的循环得出结果
非常谢谢回复!!

       我是新手,学过一点逐层嵌套循环 您这种交替嵌套循环真没搞懂,再请教您能简单说说这循环过程吗?
作者: shiyiming    时间: 2009-3-6 21:55
标题: Re: 求助:如何缩水让超大的循环得出结果
非常谢谢回复!!

我是新手,学过一点逐层嵌套循环 您这种交替嵌套循环,这两天怎么也没搞懂,请教您能简单说说这循环过程吗?




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2