하다 마드 문제의 최적화 버전


11

먼저 몇 가지 정의가 있습니다.

마드 행렬은 그 항목 중되는 정방 행렬 인 +1 또는 -1과 그 행 서로 직교한다. 마드 추측 위하여 4K의하다 마드 행렬이 모든 양의 정수 k에 대한 존재한다는 것을 제안한다.

순환 행렬은 각 행 벡터는 이전의 행 벡터에 대해 우측으로 회전 한 소자 인 매트릭스의 특별한 종류이다. 즉, 행렬은 첫 번째 행으로 정의됩니다.

됩니다 알려진 4 사에 의한 행렬을 제외하고,이없는 것을 더 순환 마드 행렬 .

m 개의 행과 n> = m 개의 열이있는 행렬은 일부 순환 행렬의 첫 번째 m 행인 경우 부분 순환 입니다.

작업

2에서 시작하는 각 짝수 정수 n에 대해 + -1 개의 항목과 모든 행이 서로 직교하는 속성을 갖는 n 개의 열이있는 가장 큰 부분 순환 행렬의 크기를 출력합니다.

점수

당신의 점수는 가장 높은 n모든 있도록 k <= n, 다른 사람이 당신보다 더 높은 정답을 기록하지 않았다. 당신은 모든 최적의 답변을 가지고 있다면 분명히 당신은 n당신이 게시 한 최고 점수를 얻을 것이다 . 그러나 귀하의 답변이 최적이 아니더라도 다른 사람이 이길 수 없다면 여전히 점수를 얻을 수 있습니다.

언어와 라이브러리

원하는 언어와 라이브러리를 사용할 수 있습니다. 가능한 경우 코드를 실행할 수 있으면 좋을 것이므로 가능한 경우 Linux에서 코드를 실행 / 컴파일하는 방법에 대한 자세한 설명을 포함하십시오.

주요 항목

  • 64 Mitch Schwartz ( 파이썬)

답변:


7

파이썬 2

다음 n = 64과 같은 무차별 대입으로 최적의 검증 된 테이블 n = 32:

 4  4 0001
 8  4 00010001
12  6 000001010011
16  8 0000010011101011
20 10 00010001011110011010
24 12 000101001000111110110111
28 14 0001011000010011101011111011
32 14 00001101000111011101101011110010
36 18 001000101001000111110011010110111000
40 20 0010101110001101101111110100011100100100
44 18 00010000011100100011110110110101011101101111
48 24 001011011001010111111001110000100110101000000110
52 26 0011010111000100111011011111001010001110100001001000
56 28 00100111111101010110001100001101100000001010100111001011
60 30 000001101101100011100101011101111110010010111100011010100010
64 32 0001100011110101111111010010011011100111000010101000001011011001

여기서는을 0나타냅니다 -1. n4로 나눌 수 없으면 m = 1최적입니다. 이 코드 (또는 작은 변형)를 사용하여 생성되었지만 더 많은 시험이 있습니다 n.

from random import *

seed(10)

trials=10000

def calcm(x,n):
    m=1
    y=x
    while 1:
        y=((y&1)<<(n-1))|(y>>1)
        if bin(x^y).count('1')!=n/2:
            return m
        m+=1

def hillclimb(x,n,ns):
    bestm=calcm(x,n)

    while 1:
        cands=[]

        for pos in ns:
            xx=x^(1<<pos)
            m=calcm(xx,n)

            if m>bestm:
                bestm=m
                cands=[xx]
            elif cands and m==bestm:
                cands+=[xx]

        if not cands:
            break

        x=choice(cands)

    return x,bestm

def approx(n):
    if n<10: return brute(n)

    bestm=1
    bestx=0

    for trial in xrange(1,trials+1):
        if not trial&16383:
            print bestm,bin((1<<n)|bestx)[3:]

        if not trial&1:
            x=randint(0,(1<<(n/2-2))-1)
            x=(x<<(n/2)) | (((1<<(n/2))-1)^x)
            ns=range(n/2-2)

            if not trial&7:
                adj=randint(1,5)
                x^=((1<<adj)-1)<<randint(0,n/2-adj)
        else:
            x=randint(0,(1<<(n-2))-1)
            ns=range(n-2)

        x,m=hillclimb(x,n,ns)

        if m>bestm:
            bestm=m
            bestx=x

    return bestm,bestx

def brute(n):
    bestm=1
    bestx=0

    for x in xrange(1<<(n-2)):
        m=calcm(x,n)
        if m>bestm:
            bestm=m
            bestx=x

    return bestm,bestx

for n in xrange(4,101,4):
    m,x=approx(n)
    print n,m,bin((1<<n)|x)[3:]

이 접근법은 작은 것으로 눈에 띄는 패턴을 활용하여 언덕을 오르는 간단한 무작위 검색입니다 n. 패턴은 최적 m을 위해 첫 번째 행의 후반이 종종 첫 번째 반의 (비트) 부정에서 작은 편집 거리를 갖는 것입니다. 위의 코드에 대한 결과는 작지만 n, 무차별 대입이 불가능 해지 자마자 악화되기 시작합니다. 더 나은 접근 방식을 보게되어 기쁩니다.

일부 관찰 :

  • n홀수 일 때 홀수 m = 1와 1을 합산하여 0을 더할 수 없으므로 최적입니다. 직교는 내적이 0임을 의미합니다.
  • 언제 n = 4k + 2, 우리가 정확한 부호 반전을 해야 m = 1하기 때문에 최적 이며, 홀수의 부호 반전은 암시 합니다.m >= 2n/2{(a1,a2), (a2,a3), ... (a{n-1},an), (an,a1)}a1 = -a1
  • 두 개의 행 ij순환 행렬 의 내적 은에 의해 결정됩니다 abs(i-j). 예를 들어, row1 . row2 = 0그렇다면 row4 . row5 = 0. 이는 내적에 대한 요소 쌍이 동일하고 회전하기 때문입니다.
  • 결과적으로 상호 직교성을 검사하기 위해 첫 번째 행에 대해서만 연속 행만 검사하면됩니다.
  • 0대신에 이진 문자열로 행을 나타내는 경우 -1비트 xor를 취하고 popcount를와 비교하여 두 행의 직교성을 확인할 수 있습니다 n/2.
  • 우리는 첫 번째 행의 처음 두 요소를 임의로 고칠 수 있습니다. (1) 행렬을 음소거해도 내적이 0인지 여부에 영향을 미치지 않으며, (2) 동일한 부호를 가진 두 개 이상의 인접한 요소가 있어야합니다. 부호가 다른 인접한 요소가 있으므로 원하는 쌍을 시작 부분에 배치하기 위해 회전 할 수 있습니다.
  • 솔루션 (n0, m0)은 첫 번째 행을 자체에 (반복적으로) 연결하여 (k * n0, m0)임의 의 솔루션 을 자동으로 제공 k > 1합니다. 결과적 으로 4로 나눌 수있는 m = 4모든 것을 쉽게 얻을 수 있습니다 n.

when n/2에 대한 엄격한 상한 인 추측은 당연 하지만 그것이 어떻게 입증 될지는 모르겠습니다.mn > 4


16 개의 행과 32 개의 열이있는 솔루션이 없다는 것이 매우 흥미 롭습니다. 왜 그런지 아십니까?

@Lembik 아이디어가 있다면 답을 적었을 것입니다.
Mitch Schwartz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.