前のページ|次のページ

CALL ALLPERMルーチン

複数の変数の値のすべての順列を変化量の小さい順に生成します。

カテゴリ: 組み合わせ

構文

CALL ALLPERM(count, variable–1 <, variable–2 ...>);

必須引数

count

1から順列数までの範囲の整数の変数を指定します。

variable

すべての数値変数または同じ長さのすべての文字変数を指定します。これらの変数の値は置換されます。

制限事項 18個以内で変数を指定します。
要件 ALLPERMルーチンを呼び出す前にこれらの変数を初期化します。

詳細

CALL ALLPERMの処理

CALL ALLPERMルーチンをループで使用して、CALL ALLPERMの第1引数で各整数値(1から順列数まで)を受け入れます。最初の呼び出しで、引数の種類と長さに不整合がないか確認されます。後続の呼び出しで、2つの連続変数の値が交換されます。
注: 順列数は、PERM関数を使用して計算できます。詳細については、PERM関数を参照してください。
ALLPERルーチンを呼び出す場合に第1引数の順序が違っていると、その結果は役に立ちません。特に、変数を初期化した直後に第1引数にKを指定してALLPERMルーチンを呼び出しても、K番目の順列の結果は得られません(Kが1である場合を除く)。K番目の順列を取得するには、第1引数を1からKまでの値をそのままの順序で取得して、ALLPERMをK回呼び出す必要があります。
ALLPERMは、一部の変数に同じ値や欠損値が含まれている場合でも常にN!個の順列を生成します。同じ値があるときに重複しない順列のみを生成する場合や、順列から欠損値を除外する場合は、かわりにLEXPERM関数を使用します。

マクロとCALL ALLPERMルーチンを使用する

ALLPERMルーチンは、%SYSCALLマクロを使って呼び出せます。この場合、変数の引数を同一の種類または長さとする必要はありません。SYSCALLで引数が数値であることが識別されると、%SYSCALLは戻り値の形式を調整します。
CALL ALLPERMルーチンの実行中にエラーが発生すると、次の両方の値が設定されます。
  • &SYSERRには4よりも大きい値が割り当てられます。
  • &SYSINFOには-100よりも小さい値が割り当てられます。
エラーがない場合、&SYSERRはゼロに設定されて、&SYSINFOは次のいずれかの値に設定されます。
  • 0 (count=1の場合)
  • J(1<count<=N!、かつ variable-Jおよびvariable-Kの値が交換されていて、J+1=Kの場合)
  • –1 (count>N!の場合)

比較

SASには、すべての順列を生成する3つの関数またはCALLルーチンがあります。
  • ALLPERM: 複数の変数の値(欠損値または非欠損値)の考えられるすべての順列を生成します。各順列は、前の順列に基づいて形成されます(2つの連続する値を交換)。
  • LEXPERM:複数の変数の非欠損値の重複しないすべての順列を生成します。順列は、辞書式順序で生成されます。
  • LEXPERK: N個の変数の非欠損値からK個の重複しないすべての順列を生成します。順列は、辞書式順序で生成されます。
ALLPERMは最も速い関数およびCALLルーチンです。最も遅いのはLEXPERKです。

例1: DATAステップでCALL ALLPERMを使用する

次の例は、CALL ALLPERMルーチンを使って指定した値の順列を生成します。
data _null_;
   array x [4] $3 ('ant' 'bee' 'cat' 'dog'); 
   n=dim(x);
   nfact=fact(n); 
   do i=1 to nfact;   
      call allperm(i, of x[*]);
      put i 5. +2 x[*];
   end;
run;
次の出力がログに書き込まれます。
    1 ant bee cat dog 2 ant bee dog cat 3 ant dog bee cat 4 dog ant bee cat 5 dog ant cat bee 6 ant dog cat bee 7 ant cat dog bee 8 ant cat bee dog 9 cat ant bee dog 10 cat ant dog bee 11 cat dog ant bee 12 dog cat ant bee 13 dog cat bee ant 14 cat dog bee ant 15 cat bee dog ant 16 cat bee ant dog 17 bee cat ant dog 18 bee cat dog ant 19 bee dog cat ant 20 dog bee cat ant 21 dog bee ant cat 22 bee dog ant cat 23 bee ant dog cat 24 bee ant cat dog

例2: マクロとCALL ALLPERMを使用する

CALL ALLPERMルーチンをマクロで使用している例を次に示します。出力には%SYSINFOマクロ用の値が含まれます。
%macro test;            
   %let x1=ant;            
   %let x2=-.1234;            
   %let x3=1e10;            
   %let x4=hippopotamus;            
   %let nperm=%sysfunc(perm(4));            
   %do j=1 %to &nperm+1;               
      %syscall allperm(j, x1, x2, x3, x4);
      %let jfmt=%qsysfunc(putn(&j, 5.));               
      %put &jfmt:   &x1 &x2 &x3 &x4 sysinfo=&sysinfo;            
   %end;         
%mend;
               
%test; 
次の出力がログに書き込まれます。
    1:   ant -0.1234 10000000000 hippopotamus sysinfo=0 2:   ant -0.1234 hippopotamus 10000000000 sysinfo=3 3:   ant hippopotamus -0.1234 10000000000 sysinfo=2 4:   hippopotamus ant -0.1234 10000000000 sysinfo=1 5:   hippopotamus ant 10000000000 -0.1234 sysinfo=3 6:   ant hippopotamus 10000000000 -0.1234 sysinfo=1 7:   ant 10000000000 hippopotamus -0.1234 sysinfo=2 8:   ant 10000000000 -0.1234 hippopotamus sysinfo=3 9:   10000000000 ant -0.1234 hippopotamus sysinfo=1 10:   10000000000 ant hippopotamus -0.1234 sysinfo=3 11:   10000000000 hippopotamus ant -0.1234 sysinfo=2 12:   hippopotamus 10000000000 ant -0.1234 sysinfo=1 13:   hippopotamus 10000000000 -0.1234 ant sysinfo=3 14:   10000000000 hippopotamus -0.1234 ant sysinfo=1 15:   10000000000 -0.1234 hippopotamus ant sysinfo=2 16:   10000000000 -0.1234 ant hippopotamus sysinfo=3 17:   -0.1234 10000000000 ant hippopotamus sysinfo=1 18:   -0.1234 10000000000 hippopotamus ant sysinfo=3 19:   -0.1234 hippopotamus 10000000000 ant sysinfo=2 20:   hippopotamus -0.1234 10000000000 ant sysinfo=1 21:   hippopotamus -0.1234 ant 10000000000 sysinfo=3 22:   -0.1234 hippopotamus ant 10000000000 sysinfo=1 23:   -0.1234 ant hippopotamus 10000000000 sysinfo=2 24:   -0.1234 ant 10000000000 hippopotamus sysinfo=3 25:   -0.1234 ant 10000000000 hippopotamus sysinfo=-1

関連項目:

前のページ|次のページ|ページの先頭へ