इसके अलावा सुपरपोटिमाइज़र को लागू करें


11

कार्य कोड लिखना है जो बिट्स के लिए छोटे तार्किक सूत्र पा सकते हैं।

यदि आपके पास बाइनरी 0/1 चर का योग कुछ मान x के बराबर है, यह जांचने के लिए आपके कोड को सबसे छोटा संभव प्रस्ताव तार्किक सूत्र खोजने के लिए समग्र चुनौती है। हमें चर एक्स 1, एक्स 2, एक्स 3, एक्स 4 आदि कहते हैं। आपकी अभिव्यक्ति राशि के बराबर होनी चाहिए। यही है, तार्किक सूत्र सच होना चाहिए अगर और केवल अगर राशि बराबर x।

इसे शुरू करने के लिए एक भोली तरीका है। Y = 15 और x = 5 कहें। 5 चर चुनने के लिए सभी 3003 अलग-अलग तरीके चुनें और प्रत्येक के लिए उन चर के AND के साथ एक नया खंड बनाएं और शेष चर का निषेध। आप 4503 की कुल लागत के लिए 3003 खंडों में से प्रत्येक की लंबाई 15 के साथ समाप्त करते हैं।

आपका उत्तर उस प्रकार की एक तार्किक अभिव्यक्ति होनी चाहिए, जिसे सिर्फ अजगर में चिपकाया जा सकता है, कहते हैं, इसलिए मैं इसका परीक्षण कर सकता हूं। यदि दो लोगों को समान आकार की अभिव्यक्ति मिलती है, तो कोड जो सबसे तेज़ जीतता है।

आपको अपने समाधान में नए चर पेश करने की अनुमति है। तो इस मामले में आपके तार्किक सूत्र में y बाइनरी चर, x और कुछ नए चर शामिल हैं। संपूर्ण सूत्र संतोषजनक होगा यदि और केवल तभी यदि y चर का योग x के बराबर है।

एक प्रारंभिक अभ्यास के रूप में कुछ लोग x = 2 में y = 5 चर जोड़कर शुरू करना चाहते हैं। भोली विधि तब 50 की लागत देगी।

कोड को दो मान y और x को इनपुट के रूप में लेना चाहिए और आउटपुट के रूप में सूत्र और उसके आकार को आउटपुट करना चाहिए। एक समाधान की लागत इसके उत्पादन में चर की कच्ची गिनती है। तो (a or b) and (!a or c) 4 के रूप में मायने रखता है। केवल अनुमति ऑपरेटरों रहे हैं and, orऔर not

अद्यतन यह पता चला है कि इस समस्या को हल करने के लिए एक चतुर विधि है जब x = 1, कम से कम सिद्धांत में।


1
यह ऑफ टॉपिक है। जैसा कि आपने कहा: यह प्रश्न एक तार्किक अभिव्यक्ति को अनुकूलित करने के बारे में है। यह किसी भी तरह से एक प्रोग्रामिंग चुनौती / पहेली नहीं है।
शियोना

@ सियोना चुनौती यह करने के लिए एक चतुर तरीका सोचने की है जो जल्दी से पर्याप्त रूप से चलती है। शायद मुझे यह स्पष्ट करने के लिए rephrase करना चाहिए। मुझे लगता है कि यह एक सुपरप्टिमाइज़र लिखने की चुनौती की तरह है।

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एक समीकरण उत्पन्न करता है जो कि अगर 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 ("कमांडर" एन्कोडिंग के रूप में जाना जाता है) के परिणामों को Frisch et al द्वारा k> = 2 के लिए सामान्यीकृत किया गया है। "एट-मोस्ट-के-कॉन्स्टेंट की एनकोडिंग।" आप जिस बारे में पूछ रहे हैं, वह एएम-के बाधा का एक विशेष मामला है, एट-लेस्ट-के की गारंटी के लिए एक अतिरिक्त क्लॉज के साथ, जो तुच्छ है, एएम-के बाधा के लिए सभी चर का एक विघटन है। फ्रिस्क बाधा मॉडलिंग में एक अग्रणी शोधकर्ता है, इसलिए मुझे यह सुझाव देते हुए सहज महसूस होगा कि [(2k + 2 C k + 1) + (2k + 2 C k-1)] * n / 2 सबसे अच्छी बाध्यता है जिसे संख्या पर जाना जाता है नए वैरिएबल की संख्या के लिए क्लॉज़ आवश्यक है, और k * n / 2 यह कैसे बनाया गया एन्कोडिंग के निर्देशों के साथ, उद्धृत पेपर में विवरण हैं। यह इस सूत्र को उत्पन्न करने के लिए एक प्रोग्राम लिखने के लिए काफी सरल है, और मुझे लगता है कि ऐसा समाधान किसी भी अन्य समाधान के साथ प्रतिस्पर्धात्मक होगा जो आपको संभवतः अभी तक मिल जाएगा। HTH।


धन्यवाद। यह देखना दिलचस्प होगा कि क्या यह अभी भी छोटे समस्या आकारों के लिए मेरी लागत माप के लिए सबसे अच्छा है जहां कुछ संपूर्ण सुपर अनुकूलन संभव हो सकता है। उम्मीद है कि यहाँ कोई इसे आज़माएगा।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.