হাডামারড সমস্যার একটি অপ্টিমাইজেশন সংস্করণ


11

প্রথম, কিছু সংজ্ঞা।

একটি হাডামার্ড ম্যাট্রিক্স একটি বর্গ ম্যাট্রিক্স যার প্রবেশগুলি হয় +1 বা −1 এবং যার সারিগুলি পারস্পরিক অর্থেগোনাল। Hadamard অনুমান প্রস্তাব, যাতে 4K একটি Hadamard ম্যাট্রিক্স সকল ধনাত্মক পূর্ণসংখ্যাকে ট জন্য বিদ্যমান।

একটি সার্কুল্যান্ট ম্যাট্রিক্স একটি বিশেষ ধরণের ম্যাট্রিক্স যেখানে প্রতিটি সারি ভেক্টর একটি উপাদানকে পূর্ববর্তী সারি ভেক্টরের সাথে ডানদিকে ঘোরানো হয়। এটি ম্যাট্রিক্সকে তার প্রথম সারিতে সংজ্ঞায়িত করা হয়েছে।

এটা তোলে হয় পরিচিত যে, 4 দ্বারা 4 ম্যাট্রিক্স ছাড়া, আছে কোন circulant Hadamard ম্যাট্রিক্স

এম সারি এবং n> = মি কলাম সহ একটি ম্যাট্রিক্স আংশিক সার্কুল্যান্ট , যদি এটি কোনও পরিবাহী ম্যাট্রিক্সের প্রথম এম সারি হয়।

কাজটি

2 থেকে শুরু হওয়া প্রতিটি সমান পূর্ণসংখ্যার জন্য, + -1 এন্ট্রি এবং এন কলামগুলির সাথে বৃহত্তম আংশিক সার্কুল্যান্ট ম্যাট্রিক্সের আকার আউটপুট করুন যার বৈশিষ্ট্য রয়েছে যে এর সমস্ত সারি পরস্পর অরথোগোনাল।

স্কোর

আপনার স্কোর সবচেয়ে বেশি nযে সবার জন্য k <= n, আপনার চেয়ে উচ্চতর সঠিক উত্তর আর কেউ পোস্ট করেনি। স্পষ্টত যদি আপনার কাছে সর্বোত্তম উত্তর থাকে তবে nআপনি পোস্ট করা সর্বাধিকের জন্য স্কোর পাবেন । তবে, আপনার উত্তরটি সর্বোত্তম না হলেও, অন্য কেউ এটি পরাজিত করতে না পারলে আপনি এখনও স্কোরটি পেতে পারেন।

ভাষা ও গ্রন্থাগার

আপনার পছন্দ মতো যে কোনও উপলভ্য ভাষা এবং গ্রন্থাগার ব্যবহার করতে পারেন। যেখানে সম্ভব, আপনার কোডটি চালাতে সক্ষম হওয়াই ভাল হবে সুতরাং যদি সম্ভব হয় তবে লিনাক্সে কীভাবে আপনার কোডটি চালাবেন / সংকলন করবেন তার সম্পূর্ণ ব্যাখ্যা অন্তর্ভুক্ত করুন।

নেতৃস্থানীয় এন্ট্রি

  • 64 সালে মিচ শোয়ার্জ দ্বারা পাইথন

উত্তর:


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সর্বোত্তম হয় কারণ একটি বিজোড় সংখ্যা এবং নেতিবাচকগুলি শূন্য পর্যন্ত যোগ করতে পারে না। (অরথোগোনাল মানে ডট পণ্য শূন্য)
  • কখন n = 4k + 2, m = 1অনুকূল হয় কারণ আমাদের মধ্যে m >= 2সঠিকভাবে n/2স্বাক্ষর বিপরীতমুখী হওয়া প্রয়োজন {(a1,a2), (a2,a3), ... (a{n-1},an), (an,a1)}, এবং একটি বিজোড় সংখ্যার সাইন রিভার্সালগুলি বোঝায় a1 = -a1
  • দুই সারির ডট পণ্য iএবং jএকটি circulant ম্যাট্রিক্স মধ্যে দ্বারা নির্ধারিত হয় abs(i-j)। উদাহরণস্বরূপ, row1 . row2 = 0তারপর যদি row4 . row5 = 0। এটি কারণ ডট পণ্যের জন্য উপাদানগুলির জোড়গুলি একই, কেবল ঘোরানো।
  • ফলস্বরূপ, পারস্পরিক orthogonality পরীক্ষা করার জন্য, আমাদের কেবল প্রথম সারির বিপরীতে ক্রমাগত সারিগুলি পরীক্ষা করা দরকার।
  • যদি আমরা 0এর স্থানে বাইনারি স্ট্রিং হিসাবে একটি সারিটি উপস্থাপন করি তবে আমরা -1বিটওয়াইজ জোর নিয়ে এবং পপকন্টের সাথে তুলনা করে দুটি সারিগুলির অরথোগোনালিটি পরীক্ষা করতে পারি n/2
  • আমরা প্রথম সারির প্রথম দুটি উপাদানকে নির্বিচারে স্থির করতে পারি, কারণ (1) একটি ম্যাট্রিক্স নেতিবাচকভাবে ডট পণ্যগুলি শূন্যের সমান কিনা তা প্রভাবিত করে না এবং (২) আমরা জানি যে একই চিহ্ন এবং দুটি সহ কমপক্ষে দুটি সংলগ্ন উপাদান থাকতে হবে পৃথক পৃথক চিহ্নের সাথে সংলগ্ন উপাদানগুলি, যাতে আমরা শুরুতে পছন্দসই জোড় স্থাপন করতে ঘুরতে পারি।
  • একটি সমাধান (n0, m0)স্বয়ংক্রিয়ভাবে (k * n0, m0)সালিসের জন্য সমাধান দেয় k > 1, (বারবার) নিজেই প্রথম সারিটি সংশ্লেষ করে। একটি পরিণতি হ'ল আমরা সহজেই 4 এর মাধ্যমে যে m = 4কোনও nবিভাজ্যদের জন্য পেতে পারি ।

এটা তোলে অনুমান যে স্বাভাবিক n/2একটা সংকুচিত উপরের জন্য আবদ্ধ হয় mযখন n > 4, কিন্তু আমি জানি না কিভাবে প্রমাণিত হবে।


এটি অত্যন্ত আকর্ষণীয় যে 16 টি সারি এবং 32 কলাম সহ কোনও সমাধান নেই। আপনি কেন কোন ধারণা আছে?

@ ল্যাম্বিক যদি আমার ধারণা থাকে তবে আমি এটি উত্তরে লিখতাম।
মিচ শোয়ার্জ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.