2013-09-22 4 views
0

특정 시간 {t1, ..., tk}에 발생하는 n 개의 이벤트 {v1, ..., vn}이 있습니다. 여기서 k는 < = n 동시에), 나는 이것이 발생할 수있는 각 방법을 열거해야한다. 우리는이 사건이 있다면n 개의 요소를 k 범주로 나열하는 순서

예를 들어, 내가 할 수 :

{v1을 < V2}, {v2를 < (V1)} (2 회)

{V1 = V2} (1 시간)

우리는 3 사건이 있다면, 나는 3 별개의 시간이 모두 6 개 순서 부를 가질 수

플러스

{V1 = V2 < V3}, {V1 = V3 < V2}, {V2 = V3 < V1}, { v1 < v2 = v3}, {v2V1 = V3}, {V3 < V1 = V2} (2 회)

{V1 = V2 = V3} (1 시간)

그래서 실제로 가능한 모든 그룹을 원하지 않기 때문에 {V1 = v2 < v3}은 예를 들어 {v2 = v1 < v3}과 같습니다.

제 생각에는 k = n 어쨌든 할 사건이있는 경우 n 이벤트의 모든 순열을 생성해야하는데,이 방법은 제가 수행 할 수있는 방법입니다. 그래서 아마도 위에 가능한 범주를 생성 할 수 있습니다. 그런 다음 복제본을 잘라내는데, 예를 들어 {v3 = v4 = v2 < v1 = v6 < v5}가 이전에 효율적으로 수락 한 복제본인지 확인하는 방법을 모르겠습니다.

아마도 순열 목록에서 작동 할 때 더 체계적 일 수 있으며 지금까지 보관 한 목록을 다시 확인하지 않고 중복 된 데이터를 삭제하는 방법을 파악할 수 있습니까?

적당히 많은 수의 이벤트에 대해서는 적절한 시간 내에 작동하지 않지만 가능한 한 높게 설정하고 싶습니다. 6은 괜찮을 것이며, 8 또는 10은 더 좋습니다.

저는 MATLAB을 사용하고 있습니다 만, 나는 누군가가 그런 문제에 대해 최적이라고 제안 할 수있는 언어를 추구하고자하며 일반적인 언어 불가지론에 관한 조언은 매우 환영하고 감사합니다.

가 표준 알고리즘 (! N있다 순열, 분명히)를 사용하여 v1…vn의 순열을 생성합니다

+0

, 고정 k에 대한 생성하려고 :

여기 파이썬 구현입니다. 그렇다면 당신은 얼마나 많은 사람들이 평등해야 하는지를 알고 있습니다. 그러므로 모든 평등 한 사람들의 모든 순열을 시험해보십시오. 그런 다음 순서에 따라 순서를 바꿀 수 있습니다. 이것은 언어에 독립적이지만 MATLAB은이 언어를위한 최상의 언어는 아닙니다. :) – kevmo314

+0

고마워, 그래, 이건 내가 일하고있는 수학적 문제의 일부 야. 그래서 MATLAB,하지만 난 그걸로 무엇이든 그것을 생성하고 거기에 나중에 수학 물건을 가져올 수있다. – mach

+0

이것을 위해 Java 클래스를 작성하는 것이 가장 편리 할 수 ​​있습니다. 이렇게하면 MATLAB으로 가져올 수 있고 클래스를 컴파일 된 실행 파일보다 훨씬 쉽게 호출/호출 할 수 있습니다. 그것 또는 mex 파일. – kevmo314

답변

1

여기에 한 가지 방법 (코드는 다음)입니다.

vp1 R1 vp2 R2 vp3 … Rn-1 vpn

어디 Ri 항상 < 될 수 있으며, pi < pi+1 경우 = 수 있습니다 : 각 순열의 경우 vp1…vpn 가능한 모든 수식을 열거.

예를 들어, n은 3 인 경우

v1 v2 v3: v1 < v2 < v3; v1 < v2 = v3; v1 = v2 < v3; v1 = v2 = v3 
v1 v3 v2: v1 < v3 < v2; v1 = v3 < v2 
v2 v1 v3: v2 < v1 < v3; v2 < v1 = v3 
v2 v3 v1: v2 < v3 < v1; v2 = v3 < v1 
v3 v1 v2: v3 < v1 < v2; v3 < v1 = v2 
v3 v2 v1: v3 < v2 < v1 

당신은 재귀 적 관계를 열거 할 수 있습니다 (I 손으로, 위의 그것을 어떻게 효율적이었다).

편집 : 슬론 시퀀스 A000670입니다.이 링크에는 다양한 유용한 참조 정보가 들어 있습니다. n = 9 인 경우, 카운트는 7087261로 현저히 실용적입니다. n = 10 인 경우 102247563이며 현대 데스크톱 계산 범위 내에 쉽게 포함됩니다. (나는 matlab에 대해 모르지만). 당신은 단지 그들을 생성하기 위해 찾고 있다면

def rels(perm): 
    if len(perm) == 1: 
    yield perm 
    else: 
    for p in rels(perm[1:]): 
     yield (perm[0], '<') + p 
     if perm[0] < perm[1]: 
     yield (perm[0], '=') + p 

def orders(n): 
    return reduce(lambda a,b:a+b, 
       [[i for i in rels(p)] for p in itertools.permutations(range(n))]) 

>>> print '\n'.join(map(repr,[o for o in orders(4)])) 
(0, '<', 1, '<', 2, '<', 3) 
(0, '=', 1, '<', 2, '<', 3) 
(0, '<', 1, '=', 2, '<', 3) 
(0, '=', 1, '=', 2, '<', 3) 
(0, '<', 1, '<', 2, '=', 3) 
(0, '=', 1, '<', 2, '=', 3) 
(0, '<', 1, '=', 2, '=', 3) 
(0, '=', 1, '=', 2, '=', 3) 
(0, '<', 1, '<', 3, '<', 2) 
(0, '=', 1, '<', 3, '<', 2) 
(0, '<', 1, '=', 3, '<', 2) 
(0, '=', 1, '=', 3, '<', 2) 
(0, '<', 2, '<', 1, '<', 3) 
(0, '=', 2, '<', 1, '<', 3) 
(0, '<', 2, '<', 1, '=', 3) 
(0, '=', 2, '<', 1, '=', 3) 
(0, '<', 2, '<', 3, '<', 1) 
(0, '=', 2, '<', 3, '<', 1) 
(0, '<', 2, '=', 3, '<', 1) 
(0, '=', 2, '=', 3, '<', 1) 
(0, '<', 3, '<', 1, '<', 2) 
(0, '=', 3, '<', 1, '<', 2) 
(0, '<', 3, '<', 1, '=', 2) 
(0, '=', 3, '<', 1, '=', 2) 
(0, '<', 3, '<', 2, '<', 1) 
(0, '=', 3, '<', 2, '<', 1) 
(1, '<', 0, '<', 2, '<', 3) 
(1, '<', 0, '=', 2, '<', 3) 
(1, '<', 0, '<', 2, '=', 3) 
(1, '<', 0, '=', 2, '=', 3) 
(1, '<', 0, '<', 3, '<', 2) 
(1, '<', 0, '=', 3, '<', 2) 
(1, '<', 2, '<', 0, '<', 3) 
(1, '=', 2, '<', 0, '<', 3) 
(1, '<', 2, '<', 0, '=', 3) 
(1, '=', 2, '<', 0, '=', 3) 
(1, '<', 2, '<', 3, '<', 0) 
(1, '=', 2, '<', 3, '<', 0) 
(1, '<', 2, '=', 3, '<', 0) 
(1, '=', 2, '=', 3, '<', 0) 
(1, '<', 3, '<', 0, '<', 2) 
(1, '=', 3, '<', 0, '<', 2) 
(1, '<', 3, '<', 0, '=', 2) 
(1, '=', 3, '<', 0, '=', 2) 
(1, '<', 3, '<', 2, '<', 0) 
(1, '=', 3, '<', 2, '<', 0) 
(2, '<', 0, '<', 1, '<', 3) 
(2, '<', 0, '=', 1, '<', 3) 
(2, '<', 0, '<', 1, '=', 3) 
(2, '<', 0, '=', 1, '=', 3) 
(2, '<', 0, '<', 3, '<', 1) 
(2, '<', 0, '=', 3, '<', 1) 
(2, '<', 1, '<', 0, '<', 3) 
(2, '<', 1, '<', 0, '=', 3) 
(2, '<', 1, '<', 3, '<', 0) 
(2, '<', 1, '=', 3, '<', 0) 
(2, '<', 3, '<', 0, '<', 1) 
(2, '=', 3, '<', 0, '<', 1) 
(2, '<', 3, '<', 0, '=', 1) 
(2, '=', 3, '<', 0, '=', 1) 
(2, '<', 3, '<', 1, '<', 0) 
(2, '=', 3, '<', 1, '<', 0) 
(3, '<', 0, '<', 1, '<', 2) 
(3, '<', 0, '=', 1, '<', 2) 
(3, '<', 0, '<', 1, '=', 2) 
(3, '<', 0, '=', 1, '=', 2) 
(3, '<', 0, '<', 2, '<', 1) 
(3, '<', 0, '=', 2, '<', 1) 
(3, '<', 1, '<', 0, '<', 2) 
(3, '<', 1, '<', 0, '=', 2) 
(3, '<', 1, '<', 2, '<', 0) 
(3, '<', 1, '=', 2, '<', 0) 
(3, '<', 2, '<', 0, '<', 1) 
(3, '<', 2, '<', 0, '=', 1) 
(3, '<', 2, '<', 1, '<', 0) 
+0

감사합니다. 이와 비슷한 것이 나에게 발생했지만 중복을 피하는 방법을 잘 모르겠습니다. 재귀 적으로 정확하게 수행되는 작업은 무엇입니까? (단어가 좋다면 아이디어를 얻으면 코드를 찾을 수 있습니다.) – mach

+0

동등한 클래스가 정식 순서로 (이벤트 인덱스를 늘림으로써) 생성되므로 중복되지 않습니다. '<'시퀀스는 vi의 두 순열 사이에서 반복 될 수 없다는 것이 분명해야합니다. 필자는 python으로 재귀를 작성했다. 잠시 후에 대답에 첨부하겠습니다. – rici

+0

@mach : 너 거기 간다. 예제 출력과 함께 완벽한 실행 프로그램. – rici

관련 문제