JSL 도움말: 벡터 또는 목록의 모든 순열을 만드는 방법벡터나 목록의 모든 순열을 열거하기 위해 일부 JSL을 작성하는 가장 좋은 방법을 찾으려고 노력 중입니다.
제가 찾은 유망해 보이는 알고리즘 중 하나는 다음과 같습니다. 힙의 알고리즘 https://en.wikipedia.org/wiki/Heap%27s_algorithm , 하지만 이것을 코딩하는 방법을 알 수 없는 것 같습니다.누군가 나를 도와줄 수 있나요?
벡터나 목록의 크기가 클수록 출력 크기도 계승적으로 증가한다는 것을 알고 있습니다(k 항목의 순열 수는 k입니다! ), 따라서 순열 목록의 각 항목을 생성하고 해당 순열에 대해 작업을 수행한 다음 다음 순열을 생성하는 데 더 이상 필요하지 않을 때 이를 삭제하는 방법에도 관심이 있습니다.
Re: JSL 도움말: 벡터 또는 목록의 모든 순열을 만드는 방법다음은 Craige의 스크립트를 기반으로 제가 만든 함수입니다.
</CODE></PRE><PRE><CODE class="">Names Default To Here( 1 );
Clear Log();
permutate = Function( {list},
per = New Namespace();
per:swap = Function( {targetList, firstPosition, secondPosition}, //returns a list with elements in firstPosition and secondPosition swapped
{temp},
temp = targetList[firstPosition];
targetList[firstPosition] = targetList[secondPosition];
targetList[secondPosition] = temp;
Return( targetList );
);
per:generate = Function( {k},
{i, temp},
If( k == 1,
Insert Into( per:result, Eval List( List( per:A ) ) ), //else
per:generate( k - 1 );
// Generate permutations for kth swapped with each k-1 initial
For( i = 0, i < k - 1, i += 1,
// Swap choice dependent on parity of k (even or odd)
If( Mod( k, 2 ) == 0,
per:A = per:swap( per:A, k, i + 1 ), //else
per:A = per:swap( per:A, 1, k )
);
per:generate( k - 1 );
);
)
);
per:result = {};
per:A = list;
per:generate( N Items( per:A ) );
result = per:result;
Delete Namespaces( per );
Return( result );
);
A = {"a", "b", "c", "d"};
permutate( A );
Re: JSL 도움말: 벡터 또는 목록의 모든 순열을 만드는 방법코드를 보내주셔서 감사합니다. 두 분 모두 도움이 되었습니다.재귀는 항상 머리를 아프게 하며, JSL에서는 순열 시퀀스의 출력을 목록이나 행렬에 할당하는 방식으로 재귀를 쉽게 수행할 수 없는 것 같습니다.
생성기 함수를 사용한 후, 내가 하고 싶은 일이 계산 시간이 너무 많이 걸린다는 것을 깨달았습니다.
문제는 다음과 같습니다. 질병의 중증도를 예방할 수는 없지만 감소시킬 수 있는 백신에 사용되는 효능 척도가 있습니다. 완화된 분수(MF).설명되어 있습니다 여기 .두 그룹의 비교를 위해 Wilcoxson Rank-Sum 검정 통계량(W)을 기반으로 합니다.그래서 제가 하고 싶었던 것은 주어진 표본 크기를 가진 두 그룹에 대해 가능한 모든 순위 순열을 사용하여 W의 가능한 모든 값을 나열한 다음, 그로부터 가능한 모든 MF 값을 얻는 것이었습니다.제가 정말로 보여주고 싶었던 것은 두 그룹의 분포가 동일하다는 귀무가설 하에서 W 분포의 임계값과 동일하다는 효능을 입증하기 위해 MF에 사용하는 기준이라는 것입니다.
제가 문제를 해결한 방법은 각 그룹에 대한 기본 분포를 가정하고 이러한 가정 하에서 MF 분포를 얻기 위해 시뮬레이션 연구를 수행하는 것이었습니다.(또한 더 큰 표본 크기의 경우 W는 H0:(모집단의 차이 없음)에서 점근적으로 정규이므로 이는 문제의 일부를 해결하는 또 다른 방법이기도 합니다.하지만 시뮬레이션을 사용하면 다른 대립 가설 하의 검정력도 조사할 수 있어 분석이 더욱 완벽해졌습니다.
Re: JSL 도움말: 벡터 또는 목록의 모든 순열을 만드는 방법질문의 후반부, 방법 ~ 아니다 전체 목록을 저장하시겠습니까?
좋은 질문입니다. JMP가 제공하는 유일한 대답은 JIM의 솔루션이 print()를 수행하거나 제 솔루션이 write()를 수행하는 위치에서 코드를 호출하도록 만드는 것입니다. JMP가 생성기 또는 코루틴을 제공하는 경우 @XanGregg , 코드가 필요한 지점에서 다음 시퀀스를 생성기에 요청할 수 있는 보다 유연한 솔루션을 가질 수 있습니다. 필요한 경우 미리 테이블에 나열하는 것이 최선의 선택일 수 있습니다.
프로젝트에 대한 자세한 내용을 자유롭게 공유할 수 있나요? 14개를 다 보는 데 걸리는 시간! 아니면 15! 순열은 아마도 금지되어 있습니다. 모든 순열을 살펴보기 전에 충분한 답을 찾으려면 어닐링 알고리즘과 함께 무작위 순열을 사용하는 것이 더 나은 선택일 수 있습니다.
Re: JSL 도움말: 벡터 또는 목록의 모든 순열을 만드는 방법// Heap's algorithm from https://en.wikipedia.org/wiki/Heap%27s_algorithm
// note: the above uses 0-based arrays, JMP uses 1-based. The above also
// must be using call-by-reference and JMP uses call-by-value. below uses
// a global array A rather than trying to find a way to pass the array by
// reference. For similar reasons, swap(x,y) is expanded in-line.
generate = Function( {k},
{i, temp},
If( k == 1,
Write( "\!n", A );//
, //else
// Generate permutations with kth unaltered
// Initially k == length(A)
generate( k - 1 );
// Generate permutations for kth swapped with each k-1 initial
For( i = 0, i < k - 1, i += 1,
// Swap choice dependent on parity of k (even or odd)
If( Mod( k, 2 ) == 0,
temp = A[i + 1];
A[i + 1] = A[k];
A[k] = temp;
, //else
temp = A[1];
A[1] = A[k];
A[k] = temp;
);
generate( k - 1 );
);
)
);
A = [1 2];
generate( N Cols( A ) );
A = {"a", "b", "c"};
generate( N Items( A ) );
A = 1 :: 4;
generate( N Cols( A ) );
[1 2]
[2 1]
{"a", "b", "c"}
{"b", "a", "c"}
{"c", "a", "b"}
{"a", "c", "b"}
{"b", "c", "a"}
{"c", "b", "a"}
[1 2 3 4]
[2 1 3 4]
[3 1 2 4]
[1 3 2 4]
[2 3 1 4]
[3 2 1 4]
[4 2 1 3]
[2 4 1 3]
[1 4 2 3]
[4 1 2 3]
[2 1 4 3]
[1 2 4 3]
[1 3 4 2]
[3 1 4 2]
[4 1 3 2]
[1 4 3 2]
[3 4 1 2]
[4 3 1 2]
[4 3 2 1]
[3 4 2 1]
[2 4 3 1]
[4 2 3 1]
[3 2 4 1]
[2 3 4 1]
Wikipedia 버전을 다시 방문하게 해주셔서 감사합니다! 지난번에 변환하기 더 쉬운 다른 변형을 찾았습니다.
Re: JSL 도움말: 벡터 또는 목록의 모든 순열을 만드는 방법비재귀적 형식의 코드를 JMP로 변환했습니다.이것이 도움이 되는지 확인하세요
generate = Function( {n, A},
//c is an encoding of the stack state. c[k] encodes the for-loop counter for when generate(k+1, A) is called
c = {};
For( i = 1, i <= n, i++, c[i] = 1 );
Print( A );
//i acts similarly to the stack pointer
i = 1;
While( i <= n,
If( c[i] < i,
If( Mod( i, 2 ) == 0,
//swap(A[0], A[i])
temp = A[1];
A[1] = A[i];
A[i] = temp;
,
//swap(A[c[i]], A[i])
temp = A[c[i]];
a[c[i]] = a[i];
a[i] = temp;
);
Print( A );
//Swap has occurred ending the for-loop. Simulate the increment of the for-loop counter
c[i] = c[i] + 1;
//Simulate recursive call reaching the base case by bringing the pointer to the base case analog in the array
i = 1;
,
//else
//Calling generate(i+1, A) has ended as the for-loop terminated. Reset the state and simulate popping the stack by incrementing the pointer.
c[i] = 1;
i = i + 1;
)
);
);