সংযোজনের জন্য সুপারোপটিমায়ার প্রয়োগ করুন


11

টাস্কটি এমন কোড লেখা যা বিটগুলির পরিমাণের জন্য ছোট লজিকাল সূত্রগুলি খুঁজে পেতে পারে।

সামগ্রিক চ্যালেঞ্জটি হ'ল y বাইনারি 0/1 ভেরিয়েবলের যোগফল কিছু মান x সমান কিনা তা পরীক্ষা করতে আপনার কোডটি সবচেয়ে ছোট সম্ভাব্য প্রজোজিক লজিকাল সূত্রটি সন্ধান করা। আসুন x1, x2, x3, x4 ভেরিয়েবলগুলিকে কল করুন আপনার অভিব্যক্তি যোগফলের সমতুল্য হওয়া উচিত। অর্থাত্, যৌক্তিক সূত্রটি সঠিক হওয়া উচিত এবং যদি যোগফল x এর সমান হয়।

এটি শুরু করার জন্য এখানে একটি নিষ্পাপ উপায়। Y = 15 এবং x = 5 বলুন 5 টি ভেরিয়েবল বাছাই করার সমস্ত 3003 টি বিভিন্ন উপায়ে বাছুন এবং প্রত্যেকের জন্য সেই ভেরিয়েবলগুলির AND এবং অবশিষ্ট ভেরিয়েবলগুলির উপকারের সাথে একটি নতুন ধারা তৈরি করুন। 45054 এর মোট ব্যয়ের জন্য আপনি 153 দৈর্ঘ্যের প্রতিটি দৈর্ঘ্যের 3003 টি ধারা দিয়ে শেষ করেছেন।

আপনার উত্তরটি এই ধরণের একটি যৌক্তিক প্রকাশ হওয়া উচিত যা কেবলমাত্র অজগরকে আটকে দেওয়া যায়, বলুন, তাই আমি এটি পরীক্ষা করতে পারি। যদি দু'জন লোক একই আকারের অভিব্যক্তি পায় তবে দ্রুততম কোডটি চালিত কোডটি।

আপনার সমাধানে আপনাকে নতুন ভেরিয়েবল প্রবর্তন করার অনুমতি দেওয়া হয়। সুতরাং এই ক্ষেত্রে আপনার যৌক্তিক সূত্রে y বাইনারি ভেরিয়েবল, এক্স এবং কিছু নতুন ভেরিয়েবল রয়েছে of পুরো সূত্রটি সন্তুষ্টিজনক হবে যদি এবং শুধুমাত্র যদি y ভেরিয়েবলগুলির যোগফল x এর সমান হয়।

শুরু করার অনুশীলন হিসাবে কিছু লোক x = 2 যুক্ত করে y = 5 ভেরিয়েবল দিয়ে শুরু করতে চাইতে পারেন। নিষ্পাপ পদ্ধতিটি তখন 50 টির দাম দেয়।

কোডটিকে ইনপুট হিসাবে দুটি মান y এবং x নেওয়া উচিত এবং আউটপুট হিসাবে সূত্র এবং তার আকার আউটপুট করা উচিত। সমাধানের ব্যয় হ'ল এর আউটপুটে কেবল ভেরিয়েবলের কাঁচা গণনা। সুতরাং (a or b) and (!a or c) 4. হিসেবে গন্য করা কেবল অনুমোদিত অপারেটার হয় and, orএবং not

আপডেট এটি দেখা যাচ্ছে যে এই সমস্যাটি সমাধানের জন্য একটি চতুর পদ্ধতি রয়েছে যখন x = 1, কমপক্ষে তত্ত্বে।


1
এটি অফ-টপিক। যেমনটি আপনি বলেছেন: এই প্রশ্নটি একটি লজিক্যাল এক্সপ্রেশনকে অনুকূলকরণ করার। এটি কোনওভাবেই কোনও প্রোগ্রামিং চ্যালেঞ্জ / ধাঁধা নয়।
shiona

@ শিওনা চ্যালেঞ্জটি হ'ল এটি করার চতুর উপায় সম্পর্কে চিন্তা করা যে এটি দ্রুত চালিত হয়। এই পরিষ্কার করার জন্য আমার পুনর্বিবেচনা করা উচিত। আমি এটিকে সুপারপটিমাইজার লেখার চ্যালেঞ্জের মতো ভাবি।

1
দয়া করে "আকার" আরও সুনির্দিষ্টভাবে সংজ্ঞা দিন। আপনার বিবরণ বোঝা যায় না গণনা করা হয়। বা শুধু কাঁচা পরিবর্তনশীল অবহেলা গণনা করা হয় না? প্রতিটি বাইনারি এবং / অথবা এক হিসাবে গণনা করা হয়?
কীথ র্যান্ডাল

1
নতুন ভেরিয়েবল প্রবর্তন কিভাবে স্কোর সহ কাজ করবে? বলুন আমি বলতে চাই z[0] = y[0] and y[1], আপনি কীভাবে এটি নির্দেশিত চান?
কেয়া

1
@ লেবেমিক পিডিএফ লিঙ্কের জন্য ধন্যবাদ, আমি বিশ্বাস করি যে আমি এখন বুঝতে পেরেছি। যদি আমি ভেরিয়েবলটি z[0]উপস্থাপন y[0] or y[1]করতে চাই তবে আমার কাছে এমন একটি ধারাটি প্রবর্তন করা দরকার যা দেখতে (y[0] or y[1]) or not z[0](বা অনুমোদিত 3 অপারেটর ব্যবহার করে কোনও সমতুল্য বিবৃতি)।
কেয়া

উত্তর:


8

পাইথন, 644

একটি সাধারণ পুনরাবৃত্তি সমীকরণ জেনারেটর। Sএকটি সমীকরণ যে তালিকার iff সন্তুষ্ট হয় উত্পন্ন varsপর্যন্ত যোগ total

কিছু সুস্পষ্ট উন্নতি করতে হবে। উদাহরণস্বরূপ, 15/5 আউটপুটে প্রদর্শিত প্রচুর প্রচলিত সাফল্য রয়েছে।

def S(vars, total):
    # base case
    if total == 0:
        return "(" + " and ".join("not " + x for x in vars) + ")"
    if total == len(vars):
        return "(" + " and ".join(vars) + ")"

    # recursive case
    n = len(vars)/2
    clauses = []
    for s in xrange(total+1):
        if s > n or total-s > len(vars)-n: continue
        a = S(vars[:n], s)
        b = S(vars[n:], total-s)
        clauses += ["(" + a + " and " + b + ")"]
    return "(" + " or ".join(clauses) + ")"

def T(n, total):
    e = S(["x[%d]"%i for i in xrange(n)], total)
    print "equation", e
    print "score", e.count("[")

    # test it
    for i in xrange(2**n):
        x = [i/2**k%2 for k in xrange(n)]
        if eval(e) != (sum(x) == total):
            print "wrong", x

T(2, 1)
T(5, 2)
T(15, 5)

উত্পন্ন:

equation (((not x[0]) and (x[1])) or ((x[0]) and (not x[1])))
score 4
equation (((not x[0] and not x[1]) and (((not x[2]) and (x[3] and x[4])) or ((x[2]) and (((not x[3]) and (x[4])) or ((x[3]) and (not x[4])))))) or ((((not x[0]) and (x[1])) or ((x[0]) and (not x[1]))) and (((not x[2]) and (((not x[3]) and (x[4])) or ((x[3]) and (not x[4])))) or ((x[2]) and (not x[3] and not x[4])))) or ((x[0] and x[1]) and (not x[2] and not x[3] and not x[4])))
score 27
equation (((not x[0] and not x[1] and not x[2] and not x[3] and not x[4] and not x[5] and not x[6]) and (((((not x[7] and not x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (not x[9] and not x[10]))) and (x[11] and x[12] and x[13] and x[14])) or ((((not x[7] and not x[8]) and (x[9] and x[10])) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((x[7] and x[8]) and (not x[9] and not x[10]))) and (((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (x[13] and x[14])) or ((x[11] and x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))))) or ((((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (x[9] and x[10])) or ((x[7] and x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10]))))) and (((not x[11] and not x[12]) and (x[13] and x[14])) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((x[11] and x[12]) and (not x[13] and not x[14])))) or ((x[7] and x[8] and x[9] and x[10]) and (((not x[11] and not x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (not x[13] and not x[14])))))) or ((((not x[0] and not x[1] and not x[2]) and (((not x[3] and not x[4]) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (not x[5] and not x[6])))) or ((((not x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2])))) or ((x[0]) and (not x[1] and not x[2]))) and (not x[3] and not x[4] and not x[5] and not x[6]))) and (((not x[7] and not x[8] and not x[9] and not x[10]) and (x[11] and x[12] and x[13] and x[14])) or ((((not x[7] and not x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (not x[9] and not x[10]))) and (((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (x[13] and x[14])) or ((x[11] and x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))))) or ((((not x[7] and not x[8]) and (x[9] and x[10])) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((x[7] and x[8]) and (not x[9] and not x[10]))) and (((not x[11] and not x[12]) and (x[13] and x[14])) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((x[11] and x[12]) and (not x[13] and not x[14])))) or ((((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (x[9] and x[10])) or ((x[7] and x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10]))))) and (((not x[11] and not x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (not x[13] and not x[14])))) or ((x[7] and x[8] and x[9] and x[10]) and (not x[11] and not x[12] and not x[13] and not x[14])))) or ((((not x[0] and not x[1] and not x[2]) and (((not x[3] and not x[4]) and (x[5] and x[6])) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((x[3] and x[4]) and (not x[5] and not x[6])))) or ((((not x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2])))) or ((x[0]) and (not x[1] and not x[2]))) and (((not x[3] and not x[4]) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (not x[5] and not x[6])))) or ((((not x[0]) and (x[1] and x[2])) or ((x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2]))))) and (not x[3] and not x[4] and not x[5] and not x[6]))) and (((not x[7] and not x[8] and not x[9] and not x[10]) and (((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (x[13] and x[14])) or ((x[11] and x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))))) or ((((not x[7] and not x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (not x[9] and not x[10]))) and (((not x[11] and not x[12]) and (x[13] and x[14])) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((x[11] and x[12]) and (not x[13] and not x[14])))) or ((((not x[7] and not x[8]) and (x[9] and x[10])) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((x[7] and x[8]) and (not x[9] and not x[10]))) and (((not x[11] and not x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (not x[13] and not x[14])))) or ((((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (x[9] and x[10])) or ((x[7] and x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10]))))) and (not x[11] and not x[12] and not x[13] and not x[14])))) or ((((not x[0] and not x[1] and not x[2]) and (((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (x[5] and x[6])) or ((x[3] and x[4]) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))))) or ((((not x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2])))) or ((x[0]) and (not x[1] and not x[2]))) and (((not x[3] and not x[4]) and (x[5] and x[6])) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((x[3] and x[4]) and (not x[5] and not x[6])))) or ((((not x[0]) and (x[1] and x[2])) or ((x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2]))))) and (((not x[3] and not x[4]) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (not x[5] and not x[6])))) or ((x[0] and x[1] and x[2]) and (not x[3] and not x[4] and not x[5] and not x[6]))) and (((not x[7] and not x[8] and not x[9] and not x[10]) and (((not x[11] and not x[12]) and (x[13] and x[14])) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((x[11] and x[12]) and (not x[13] and not x[14])))) or ((((not x[7] and not x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (not x[9] and not x[10]))) and (((not x[11] and not x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (not x[13] and not x[14])))) or ((((not x[7] and not x[8]) and (x[9] and x[10])) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((x[7] and x[8]) and (not x[9] and not x[10]))) and (not x[11] and not x[12] and not x[13] and not x[14])))) or ((((not x[0] and not x[1] and not x[2]) and (x[3] and x[4] and x[5] and x[6])) or ((((not x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2])))) or ((x[0]) and (not x[1] and not x[2]))) and (((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (x[5] and x[6])) or ((x[3] and x[4]) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))))) or ((((not x[0]) and (x[1] and x[2])) or ((x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2]))))) and (((not x[3] and not x[4]) and (x[5] and x[6])) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((x[3] and x[4]) and (not x[5] and not x[6])))) or ((x[0] and x[1] and x[2]) and (((not x[3] and not x[4]) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (not x[5] and not x[6]))))) and (((not x[7] and not x[8] and not x[9] and not x[10]) and (((not x[11] and not x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (not x[13] and not x[14])))) or ((((not x[7] and not x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (not x[9] and not x[10]))) and (not x[11] and not x[12] and not x[13] and not x[14])))) or ((((((not x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2])))) or ((x[0]) and (not x[1] and not x[2]))) and (x[3] and x[4] and x[5] and x[6])) or ((((not x[0]) and (x[1] and x[2])) or ((x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2]))))) and (((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (x[5] and x[6])) or ((x[3] and x[4]) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))))) or ((x[0] and x[1] and x[2]) and (((not x[3] and not x[4]) and (x[5] and x[6])) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((x[3] and x[4]) and (not x[5] and not x[6]))))) and (not x[7] and not x[8] and not x[9] and not x[10] and not x[11] and not x[12] and not x[13] and not x[14])))
score 644

এই খুব সুন্দর. সমাধানগুলি কতটা ছোট হতে পারে বলে আপনি মনে করেন?

@ ল্যাম্বিক: সত্যিই এ নিয়ে ভাবেনি। সাধারণ স্যুপ এক্সপ্রেসনের জন্য আপনাকে নতুন ভেরিয়েবলগুলি সংজ্ঞায়িত করতে হবে। উদাহরণস্বরূপ, not x[0] and not x[1] and not x[2]15/5 এক্সপ্রেশন 5 বার প্রদর্শিত হবে।
কিথ র্যান্ডাল

2

আমি এটি একটি মন্তব্য করতে হবে, কিন্তু আমার সুনাম নেই। আমি মন্তব্য করতে চেয়েছিলাম যে K = 1 এর Kwon & Klieber ("কমান্ডার" এনকোডিং হিসাবে পরিচিত) এর ফলাফলগুলি K> = 2 এর জন্য ফ্রিশ্চ এট আল দ্বারা সাধারণীকরণ করা হয়েছে। "এট-মোস্ট-কে কনস্ট্রেন্টের স্যাট এনকোডিংস" " আপনি যেটি সম্পর্কে জিজ্ঞাসা করছেন তা হ'ল এএম-কে সীমাবদ্ধতার একটি বিশেষ ক্ষেত্রে, এট-লেস্ট-কে-এর গ্যারান্টিযুক্ত অতিরিক্ত ধারা, যা তুচ্ছ, কেবলমাত্র এএম-কে সীমাবদ্ধতার সাথে সমস্ত ভেরিয়েবলের বিভাজন। ফ্রিশ্চ সীমাবদ্ধতা মডেলিংয়ের শীর্ষস্থানীয় গবেষক, সুতরাং আমি এই পরামর্শ দিতে স্বাচ্ছন্দ্য বোধ করব [[2k + 2 C k + 1) + (2k + 2 C k-1)] * n / 2 হ'ল সংখ্যার উপর ভিত্তি করে সর্বাধিক সীমাবদ্ধ অনুচ্ছেদের প্রয়োজন, এবং নতুন ভেরিয়েবলের সংখ্যার জন্য k * n / 2 প্রয়োজন। এই এনকোডিংটি কীভাবে তৈরি করা হবে তার নির্দেশাবলীর সাথে বিশদগুলি উদ্ধৃত কাগজে রয়েছে। এটা ' এই সূত্রটি তৈরি করার জন্য একটি প্রোগ্রাম লিখতে মোটামুটি সহজ, এবং আমি মনে করি যে এই জাতীয় সমাধান সম্ভবত অন্য যে কোনও সমাধানের সাথে আপনি সম্ভবত খুঁজে পাবেন এর সাথে প্রতিযোগিতামূলক হবে। আছে HTH।


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