여기에 한 가지 방법 (코드는 다음)입니다.
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)
, 고정 k에 대한 생성하려고 :
여기 파이썬 구현입니다. 그렇다면 당신은 얼마나 많은 사람들이 평등해야 하는지를 알고 있습니다. 그러므로 모든 평등 한 사람들의 모든 순열을 시험해보십시오. 그런 다음 순서에 따라 순서를 바꿀 수 있습니다. 이것은 언어에 독립적이지만 MATLAB은이 언어를위한 최상의 언어는 아닙니다. :) – kevmo314
고마워, 그래, 이건 내가 일하고있는 수학적 문제의 일부 야. 그래서 MATLAB,하지만 난 그걸로 무엇이든 그것을 생성하고 거기에 나중에 수학 물건을 가져올 수있다. – mach
이것을 위해 Java 클래스를 작성하는 것이 가장 편리 할 수 있습니다. 이렇게하면 MATLAB으로 가져올 수 있고 클래스를 컴파일 된 실행 파일보다 훨씬 쉽게 호출/호출 할 수 있습니다. 그것 또는 mex 파일. – kevmo314