অন্ধ র্যান্ডম বাছাই


18

অ্যালগরিদম বাছাই করার জন্য এখানে একটি দুর্দান্ত সাধারণ প্যাটার্ন:

def sort(l):
    while not is_sorted(l):
         choose indices i, j
         assert i < j
         if l[i] > l[j]:
             l[i], l[j] = l[j], l[i]

এই অ্যালগরিদমগুলি সূচকগুলি কারণ খুব ভাল কাজ করে iএবং jতালিকার রাজ্যের উপর ভিত্তি করে সাবধানে বেছে নেওয়া হয় l

যাইহোক, যদি আমরা দেখতে না পেতাম l, এবং কেবল অন্ধভাবে বেছে নিতে হয়েছিল? তাহলে আমরা তালিকাটি কত দ্রুত বাছাই করতে পারি?


আপনার চ্যালেঞ্জটি হ'ল এমন একটি ফাংশন লিখুন যা কেবলমাত্র দৈর্ঘ্যের সূচী অনুসারে সূচকগুলির এলোমেলো জোড়াকে আউটপুট করে l। বিশেষত, আউটপুট দুই সূচকের, must i, j, সঙ্গে 0 <= i < j < len(l)। আপনার ফাংশনটি তালিকার যে কোনও দৈর্ঘ্যে কাজ করা উচিত, তবে এটি 100 দৈর্ঘ্যের তালিকায় তৈরি হবে।

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

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

জমাটি স্পষ্টভাবে অপ্রতিযোগিতামূলক বা অবসান না হলে আমি কম ট্রায়াল চালানোর অধিকার সংরক্ষণ করি এবং একক বিজয়ী সন্ধানের জন্য শীর্ষ প্রতিযোগীদের আলাদা করার জন্য আমি আরও ট্রায়াল চালাব। যদি আমার গণ্য সংস্থানসমূহের সীমাতে একাধিক শীর্ষ জমা দেওয়া ত্রুটির প্রান্তে থেকে যায় তবে আমি পূর্ববর্তী জমাটি বিজয়ী হিসাবে ঘোষণা করব, যতক্ষণ না আরও গণ্য সংস্থান বহন করা না যায়।


পাইথনে স্কোরিং প্রোগ্রামের একটি উদাহরণ এখানে:

import random
def is_sorted(l):
    for x in range(len(l)-1):
        if l[x] > l[x+1]:
            return False
    return True

def score(length, index_chooser):
    steps = 0
    l = list(range(length))
    random.shuffle(l)

    while not is_sorted(l):
        i, j = index_chooser(length)
        assert (i < j)
        if l[i] > l[j]:
            l[i], l[j] = l[j], l[i]
        steps += 1
    return steps

তোমার ফাংশন কোনো চপল রাষ্ট্র বজায় রাখা নাও হতে পারে, ইন্টারঅ্যাক্ট গ্লোবাল ভেরিয়েবল সঙ্গে, তালিকা প্রভাবিত l, ইত্যাদি আপনার ফাংশনের শুধুমাত্র ইনপুট তালিকার দৈর্ঘ্য হতে হবে l, এবং এটি আউটপুট সীমার মধ্যে পূর্ণসংখ্যার একটি আদেশ যুগল অবশ্যই [0, len(l)-1](অথবা আপনার ভাষা এর জন্য উপযুক্ত তালিকা সূচক)। মন্তব্যে কোনও কিছুর অনুমতি দেওয়া হয়েছে কিনা তা নির্দ্বিধায় জিজ্ঞাসা করুন।

জমাগুলি যে কোনও বিনামূল্যে ব্যবহারের ভাষা হতে পারে। আপনার ভাষার জন্য ইতিমধ্যে যদি কেউ পোস্ট না করা হয় তবে দয়া করে একটি স্কোরিং জোতা অন্তর্ভুক্ত করুন। আপনি একটি অস্থায়ী স্কোর পোস্ট করতে পারেন, তবে আমি অফিসিয়াল স্কোর নিয়ে একটি মন্তব্য করব।

স্কোরিং হ'ল দৈর্ঘ্যের 100 টি অভিন্ন এলোমেলোভাবে পরিবর্তিত তালিকায় বাছাই করা তালিকার গড় সংখ্যা number


2
@ জোকিং প্রকৃতপক্ষে - আপনার জমাটি একটি বিতরণ
isaacg

2
আপনি কেন পরিবর্তনযোগ্য রাষ্ট্রের অনুমতি দিচ্ছেন না? এর মঞ্জুরি দেওয়ার অর্থ হ'ল সাবমিশনগুলি তাদের অ্যালগোরিদমগুলিকে আরও ভাল করে সুর করতে পারে, এই আশায় যে সঠিক আইটেমগুলি বেছে নেওয়া হয়েছে।
নাথান মেরিল

3
@ নাথানম্যারিল যদি পরিবর্তনযোগ্য রাষ্ট্রের অনুমতি দেওয়া হয় তবে বিজয়ী কেবল একটি বাছাই করার নেটওয়ার্ক হবে যা ইতিমধ্যে একটি ভাল অধ্যয়নিত সমস্যা।
অ্যান্ডার্স কাসেরগ

3
@ নাথানমারিল যদি আপনি এই প্রশ্নটি পোস্ট করতে চান তবে নির্দ্বিধায়। এটি অবশ্য এই প্রশ্ন নয়।
isaacg

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

উত্তর:


10

পাইথন, স্কোর = 4508

def half_life_3(length):
    h = int(random.uniform(1, (length / 2) ** -3 ** -0.5) ** -3 ** 0.5)
    i = random.randrange(length - h)
    return i, i + h

হাফ-লাইফ 3 নিশ্চিত হয়েছে।

পাইথন, স্কোর = 11009

def bubble(length):
    i = random.randrange(length - 1)
    return i, i + 1

স্পষ্টতই একটি এলোমেলোনা বুদ্বুদ বাছাই সাধারণ বুদবুদ সাজানোর চেয়ে এত খারাপ কিছু করে না।

ছোট দৈর্ঘ্যের জন্য অনুকূল বিতরণ

এটির দৈর্ঘ্য 100 পর্যন্ত বাড়ানোর কোনও উপায় নেই তবে যাইহোক এটি দেখতে আকর্ষণীয়। আমি গ্রেডিয়েন্ট বংশদ্ভুত এবং প্রচুর ম্যাট্রিক্স বীজগণিত ব্যবহার করে ছোট মামলার (দৈর্ঘ্য ≤ 7) জন্য অনুকূল বিতরণ গণনা করি। ম কলাম শো দুরত্ব প্রতিটি swap 'র সম্ভাবনা

length=1
score=0.0000

length=2
1.0000
score=0.5000

length=3
0.5000 0.0000
0.5000
score=2.8333

length=4
0.2957 0.0368 0.0000 
0.3351 0.0368 
0.2957 
score=7.5106

length=5
0.2019 0.0396 0.0000 0.0000 
0.2279 0.0613 0.0000 
0.2279 0.0396 
0.2019 
score=14.4544

length=6
0.1499 0.0362 0.0000 0.0000 0.0000 
0.1679 0.0558 0.0082 0.0000 
0.1721 0.0558 0.0000 
0.1679 0.0362 
0.1499 
score=23.4838

length=7
0.1168 0.0300 0.0041 0.0000 0.0000 0.0000 
0.1313 0.0443 0.0156 0.0000 0.0000 
0.1355 0.0450 0.0155 0.0000 
0.1355 0.0443 0.0041 
0.1313 0.0300 
0.1168 
score=34.4257

আপনার স্কোর: 11009
isaacg

2
আপনি কি আপনার অর্ধ জীবন 3 উত্তর কিছুটা ব্যাখ্যা করতে পারেন? পয়েন্টটি কি কেবল তালিকার সামনের দিকে এলোমেলো সংখ্যার পক্ষপাত করা?
সর্বোচ্চ

1
ছোট দৈর্ঘ্যের জন্য অনুকূল বিতরণগুলি খুব আকর্ষণীয় - আমি লক্ষ্য করেছি যে কেন্দ্রের দিকে বায়াসিং দরকারী, বিশেষত বৃহত্তর অদলবদলের জন্য।
isaacg

@ ম্যাক্স পুরো সমস্যাটি এলোমেলো সংখ্যাকে উপকারী উপায়ে বাইজিং করা; এই উপায় কার্যকর হতে পারে। দ্রষ্টব্য যে hঅদলবদলের উপাদানগুলির মধ্যে দূরত্ব; এটি সামনে বা পিছনে উপস্থাপন করে না।
অ্যান্ডারস কাসরগ

1
আপনার অর্ধ জীবনের স্কোর: 10000 নমুনায় 4508।
isaacg

7

স্কোর: 4627

def rand_step(n):
	step_size = random.choice([1, 1, 4, 16])
	
	if step_size > n - 1:
		step_size = 1 
	
	start = random.randint(0, n - step_size - 1)
	return (start, start + step_size)

এটি অনলাইন চেষ্টা করুন!

আউটপুটগুলি এলোমেলো সূচকগুলি যার দূরত্ব পৃথক পৃথক থেকে বেছে নেওয়া হয় [1,1,4,16]। বড় আকারের স্কেলগুলিতে অদলবদলের সাথে 1-পদক্ষেপের অদলবদলের মিশ্রণটি ধারণা রাখে।

আমি 100 টি দৈর্ঘ্যের তালিকাগুলির জন্য এই মানগুলিকে হ্যান্ড-টিক করেছি এবং এগুলি সম্ভবত অনুকূল থেকে অনেক দূরে। কিছু মেশিন অনুসন্ধান সম্ভবত পছন্দসই-চয়ন-দূরত কৌশলটির সাথে এলোমেলো-জুড়ি-দূরত্বের বিতরণটিকে অনুকূল করতে পারে।


1
আপনার স্কোর: 10,000 স্যাম্পলগুলিতে 4627। যদি আপনি কয়েক দিন পরে নেতাদের মধ্যে থাকেন তবে আমি আরও নমুনা নিয়ে এটি আবার চালাব।
isaacg

3

স্কোর: 28493

def x_and_y(l):
    x = random.choice(range(l))
    y = random.choice(range(l))
    while y == x and l != 1: y = random.choice(range(l))
    return sorted([x,y])

এটি অনলাইন চেষ্টা করুন!

এই সমাধানটি কেবল পরিসীমা থেকে xএবং yএলোমেলোভাবে স্বতন্ত্র মান নির্বাচন করে এবং তাদের সাজানো ক্রমে প্রদান করে। আমি যতদূর বলতে পারি, বাকি মানগুলি থেকে xবেছে নেওয়ার পরে এটি বেছে নেওয়ার চেয়ে ভাল সম্পাদন করে y


আপনার স্কোর: 28493
isaacg


2

পাইথন, স্কোর ≈ 5000

def exponentialDistance(n):
    epsilon = 0.25
    for dist in range(1, n):
        if random.random() < epsilon:
            break
    else:
        dist = 1
    low = random.randrange(0, n - dist)
    high = low + dist
    return low, high

একগুচ্ছ ইপসিলন মান দিয়ে চেষ্টা করা, 0.25 সেরা বলে মনে হচ্ছে।

স্কোর ≈ 8881

def segmentedShuffle(n):
    segments = 20
    segmentLength = (n - 1) // segments + 1

    if random.random() < 0.75:
        a = b = 0
        while a == b or a >= n or b >= n:
            segment = random.randrange(segments)
            a = random.randrange(segmentLength) + segment * segmentLength
            b = random.randrange(segmentLength) + segment * segmentLength
        return sorted([a, b])

    highSegment = random.randrange(1, segments)
    return highSegment * segmentLength - 1, highSegment * segmentLength

একটি ভিন্ন পদ্ধতির। ততটা ভাল নয় এবং এটি ভাগের সংখ্যায় বিভাজ্য নয় দৈর্ঘ্যের সাথে মারাত্মকভাবে মারা যায়, তবে এখনও এটি মজাদার।


আপনার স্কোর: তাত্পর্যপূর্ণ দূরত্ব: 5055. সেগমেন্টেড এলোমেলো: 8901
isaacg

1

স্কোর: 4583

def rand_shell(l):
    steps = [1, 3, 5, 9, 17, 33, 65, 129]
    candidates = [(left, left + step)
            for (step, nstep) in zip(steps, steps[1:])
            for left in range(0, l - step)
            for i in range(nstep // step)
    ]
    return random.choice(candidates)

এটি অনলাইন চেষ্টা করুন!

আমি জানি না কেন। আমি কেবল শেলসোর্টের জন্য উইকিপিডিয়াতে শৈল্পিকের তালিকাভুক্ত ক্রমগুলি চেষ্টা করেছি । এবং এই এক ভাল কাজ বলে মনে হচ্ছে। এটি পোস্ট করা একজন এক্সনরের সাথে একই স্কোর পান ।


আপনার স্কোর: 10,000 স্যাম্পলগুলিতে 4583। আপনি যদি কয়েক দিনের মধ্যে নেতাদের মধ্যে থাকেন তবে আমি আরও নমুনা নিয়ে এটি আবার চালাব
isaacg

এছাড়াও, আমি একটি দ্রুত প্রোগ্রাম চালাচ্ছি যা একই বন্টনকে নমুনা দেয়, তাই আমি আরও নমুনা পেতে পারি।
isaacg

2
@ আইসাকগ আরও ভাল পরীক্ষার পারফরম্যান্সের জন্য, candidatesবৈশ্বিক ভেরিয়েবল হিসাবে ফাংশন থেকে সরে যাওয়ার কাজ করা উচিত।
tsh

1
ধন্যবাদ, আমি যা করছি তার থেকে অনেক দ্রুত faster
isaacg

1

পাইথন 2 , 4871

import random
def index_chooser(length):
    e= random.choice([int(length/i) for i in range(4,length*3/4)])
    s =random.choice(range(length-e))
    return [s,s+e]
def score(length, index_chooser):
    steps = 0
    l = list(range(length))
    random.shuffle(l)
    while True:
        for x in range(length-1):
            if l[x] > l[x+1]:
                break
        else:
            return steps
        i, j = index_chooser(length)
        assert(i < j)
        if l[i] > l[j]:
            l[i], l[j] = l[j], l[i]
        steps += 1

print sum([score(100, index_chooser) for t in range(100)])

এটি অনলাইন চেষ্টা করুন!


আপনার স্কোর: 10000 নমুনায়
4871
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.