तो जाहिर है, पी = एनपी [बंद]


111

सैट यह निर्धारित करने की समस्या है कि क्या बूलियन अभिव्यक्ति को सच किया जा सकता है। उदाहरण के लिए, (A) को A = TRUE सेट करके सत्य बनाया जा सकता है, लेकिन (A &&! A) कभी भी सत्य नहीं हो सकता। यह समस्या एनपी-पूर्ण होने के लिए जानी जाती है। बूलियन संतुष्टि देखें ।

आपका कार्य SAT के लिए एक कार्यक्रम लिखना है जो बहुपद समय में निष्पादित होता है, लेकिन सभी मामलों को हल नहीं कर सकता है।

कुछ उदाहरणों के लिए, इसका कारण वास्तव में बहुपद नहीं है क्योंकि:

  1. एक किनारे का मामला है जो स्पष्ट नहीं है लेकिन खराब रनटाइम है
  2. एल्गोरिथ्म वास्तव में कुछ अप्रत्याशित मामले में समस्या को हल करने में विफल रहता है
  3. प्रोग्रामिंग लैंग्वेज की कुछ खासियत जो आप वास्तव में इस्तेमाल कर रहे हैं, उससे कहीं अधिक लंबे समय तक आपके पास रहने की अपेक्षा है
  4. आपका कोड वास्तव में कुछ अलग करता है जो ऐसा दिखता है जैसे वह कर रहा है

आप अपनी इच्छानुसार किसी भी प्रोग्रामिंग भाषा (या भाषाओं के संयोजन) का उपयोग कर सकते हैं। आपको अपने एल्गोरिथ्म की जटिलता का एक औपचारिक प्रमाण प्रदान करने की आवश्यकता नहीं है, लेकिन आपको कम से कम स्पष्टीकरण देना चाहिए।

जजिंग के लिए प्राथमिक मानदंड यह होना चाहिए कि कोड कितना पक्का है।

यह एक लोकप्रियता प्रतियोगिता है, इसलिए एक सप्ताह में सबसे अधिक मूल्यांकन किया गया उत्तर जीतता है।


11
यदि आप समस्या डोमेन को प्रतिबंधित करते हैं तो बेहतर होगा , अन्यथा आप "सुविख्यात" के चारों ओर अनिश्चितता के बादल का आह्वान करते हैं। एक भी एनपी-कठिन समस्या क्यों नहीं उठाते और उस पर ध्यान केंद्रित क्यों करते हैं? इस तरह की अन्य समस्याओं को एक ही पंक्ति के साथ भविष्य के प्रश्नों के लिए खुला छोड़ने का लाभ है। कई संकीर्ण प्रश्न साइट को एक व्यापक की तुलना में कहीं अधिक निरंतर आनंद और मनोरंजन प्रदान कर सकते हैं।
जोनाथन वान मैटर

9
@ gnasher729: मुझे SAT समस्या हल करने के लिए C # कंपाइलर मिला ; मैं समझता हूं कि यह एक काफी दिलचस्प उपलब्धि है।
एरिक लिपर्ट

9
यह मजेदार होगा अगर कोई गलती से यहां बहुपद समय में सैट को हल कर दे।
तूरियन

5
@ शोध के दशकों, पुरस्कार और पुरस्कारों में लाखों और सभी महिलाएं और प्रसिद्धि एक हो सकती है - लेकिन पी = एनपी को हल करने के लिए असली प्रेरणा इस पीसीजी चुनौती को समाप्त कर देगी।
NothingsImpossible

3
मैं इस प्रश्न को ऑफ-टॉपिक के रूप में बंद करने के लिए मतदान कर रहा हूं क्योंकि अंडरहैंड चुनौतियां अब इस साइट पर स्वागत नहीं करती हैं। meta.codegolf.stackexchange.com/a/8326/20469
बिल्ली

जवाबों:


236

सी#

आपका कार्य SAT के लिए एक कार्यक्रम लिखना है जो बहुपद समय में निष्पादित होता है।

"प्रकट होता है" अनावश्यक है। मैं एक प्रोग्राम लिख सकता हूं जो वास्तव में एसएटी समस्याओं को हल करने के लिए बहुपद समय में निष्पादित करता है। यह वास्तव में काफी सीधा है।

मेगा बोनस: यदि आप एक सैट-सॉल्वर लिखते हैं जो वास्तव में बहुपद समय में निष्पादित होता है, तो आपको एक मिलियन डॉलर मिलते हैं! लेकिन कृपया किसी स्पॉइलर टैग का उपयोग करें, ताकि अन्य लोग इसके बारे में आश्चर्यचकित कर सकें।

बहुत बढ़िया। कृपया मुझे लाख रुपये भेजें। गंभीरता से, मेरे पास यहीं एक कार्यक्रम है जो एसएटी को बहुपदीय रनटाइम के साथ हल करेगा।

मुझे बताएं कि मैं SAT समस्या पर एक बदलाव को हल करने जा रहा हूं। मैं किसी भी 3-SAT समस्या के अनूठे समाधान को प्रदर्शित करने वाले प्रोग्राम को लिखने का तरीका प्रदर्शित करने जा रहा हूं । प्रत्येक बूलियन चर का मूल्यांकन मेरे काम करने के लिए अद्वितीय होना चाहिए ।

हम कुछ सरल सहायक विधियों और प्रकारों की घोषणा करके शुरू करते हैं:

class MainClass
{
    class T { }
    class F { }
    delegate void DT(T t);
    delegate void DF(F f);
    static void M(string name, DT dt)
    {
        System.Console.WriteLine(name + ": true");
        dt(new T());
    }
    static void M(string name, DF df)
    {
        System.Console.WriteLine(name + ": false");
        df(new F());
    }
    static T Or(T a1, T a2, T a3) { return new T(); }
    static T Or(T a1, T a2, F a3) { return new T(); }
    static T Or(T a1, F a2, T a3) { return new T(); }
    static T Or(T a1, F a2, F a3) { return new T(); }
    static T Or(F a1, T a2, T a3) { return new T(); }
    static T Or(F a1, T a2, F a3) { return new T(); }
    static T Or(F a1, F a2, T a3) { return new T(); }
    static F Or(F a1, F a2, F a3) { return new F(); }
    static T And(T a1, T a2) { return new T(); }
    static F And(T a1, F a2) { return new F(); }
    static F And(F a1, T a2) { return new F(); }
    static F And(F a1, F a2) { return new F(); }
    static F Not(T a) { return new F(); }
    static T Not(F a) { return new T(); }
    static void MustBeT(T t) { }

अब चलो एक 3-SAT समस्या को हल करने के लिए चुनें। हम कहते हैं

(!x3) & 
(!x1) & 
(x1 | x2 | x1) & 
(x2 | x3 | x2)

आइए इसे थोड़ा और बढ़ाएं।

(!x3) & (
    (!x1) & (
        (x1 | x2 | x1) & 
        (x2 | x3 | x2)))

हम इस तरह से सांकेतिक शब्दों में बदलना:

static void Main()
{
    M("x1", x1 => M("x2", x2 => M("x3", x3 => MustBeT(
      And(
        Not(x3),
        And(
          Not(x1),
          And(
            Or(x1, x2, x1),
            Or(x2, x3, x2))))))));
}

और निश्चित रूप से पर्याप्त है जब हम कार्यक्रम चलाते हैं, हमें बहुपद समय में 3-SAT का समाधान मिलता है। वास्तव में रनटाइम समस्या के आकार में रैखिक है !

x1: false
x2: true
x3: false

आपने बहुपद रनटाइम कहा । आपने बहुपद संकलन समय के बारे में कुछ नहीं कहा । यह प्रोग्राम C # कंपाइलर को X1, x2 और x3 के लिए सभी संभावित प्रकार के संयोजनों का प्रयास करने के लिए मजबूर करता है, और उस अद्वितीय को चुनें जो किसी प्रकार की त्रुटियों को प्रदर्शित नहीं करता है। कंपाइलर सभी काम करता है, इसलिए रनटाइम नहीं करना पड़ता है। मैंने पहली बार 2007 में अपने ब्लॉग पर इस दिलचस्प टेकनीक को प्रदर्शित किया: http://blogs.msdn.com/b/ericlippert/archive/2007/03/28/lambda-expressions-vs-anonymous-methods-part-five.aspx नोट इस उदाहरण से पता चलता है कि C # में अधिभार संकल्प कम से कम NP-HARD है। चाहे वह एनपी-हार्ड हो या वास्तव में अनिर्दिष्ट कुछ सूक्ष्म विवरणों पर निर्भर करता है कि जेनेरिक कंट्रोवर्सी की उपस्थिति में किस प्रकार परिवर्तनीयता काम करती है, लेकिन यह एक और दिन के लिए एक विषय है।


95
आपको अपने मिलियन रुपये के लिए मिट्टी के गणित संस्थान से संपर्क करना होगा। लेकिन मुझे यकीन नहीं है कि वे संतुष्ट होंगे
जोनाथन पुलानो

15
बेशक किसी भी SAT समस्या को 3-SAT समस्या के बराबर में बदला जा सकता है, इसलिए यह प्रतिबंध केवल एक असुविधा है। मेरे "समाधान" के साथ अधिक अप्रिय मुद्दा यह है कि इसके लिए समस्या का एक अनूठा समाधान है। यदि कोई समाधान या एक से अधिक समाधान नहीं है, तो संकलक एक त्रुटि देता है।
एरिक लिपर्ट

11
@ EricLippert की विशिष्टता की आवश्यकता ठीक है। आप हमेशा एक यूनीक-सैट (सैट को कम कर सकते हैं लेकिन यह मानते हुए कि इनपुट्स में 0 या 1 असाइनमेंट हैं) बहुपद समय यादृच्छिक कमी का उपयोग करते हैं। कीवर्ड: अलगाव लेम्मा, वैलिएंट-वज़िरानी प्रमेय।
डिएगो डे एस्ट्राडा

44
"गंभीरता से, मेरे पास एक कार्यक्रम यहीं है जो एसटी को बहुपदीय रनटाइम के साथ हल करेगा।" - मुझे भी, लेकिन दुर्भाग्य से यह इस टिप्पणी बॉक्स में फिट नहीं है।
कॉम्पबुक

11
@ कोबी: हां, यह मजाक है।
एरिक लिपर्ट

166

बहु-भाषा (1 बाइट)

निम्न प्रोग्राम, कई भाषाओं में मान्य, ज्यादातर कार्यात्मक और गूढ़, बड़ी संख्या में SAT समस्याओं के लिए सही उत्तर देगा और इसमें निरंतर जटिलता (!!!) होगी:

0

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

1

6
ये अद्भुत है। मैंने अपने आप को एक अच्छी हंसी थी।
कार्ल दामगार्ड अस्मुसेन

2
बिल्कुल च ****** शानदार!
ब्लू डॉग

78
हम्म। अब आसान है। मुझे बस एक प्रोग्राम लिखने की ज़रूरत है, जो सही प्रोग्राम चुने!
क्रंचर

यकीनन ! :-)
मऊ

6
की याद ताजा करती xkcd.com/221
msh210

34

जावास्क्रिप्ट

पुनरावृत्त गैर-नियतात्मकता का उपयोग करके, एसटी को बहुपद समय में हल किया जा सकता है!

function isSatisfiable(bools, expr) {
    function verify() {
        var values = {};
        for(var i = 0; i < bools.length; i++) {
            values[bools[i]] = nonDeterministicValue();
        }
        with(values) {
            return eval(expr);
        }
    }
    function nonDeterministicValue() {
        return Math.random() < 0.5 ? !0 : !1;
    }

    for(var i = 0; i < 1000; i++) {
        if(verify(bools, expr)) return true;
    }
    return false;
}

उदाहरण का उपयोग:

isSatisfiable(["a", "b"], "a && !a || b && !b") //returns 'false'

यह एल्गोरिदम बस बूलियन फॉर्मूला को एक हजार बार रैंडम इनपुट के साथ चेक करता है। लगभग हमेशा छोटे इनपुट के लिए काम करता है, लेकिन अधिक चर पेश किए जाने पर कम विश्वसनीय होता है।

वैसे, मुझे गर्व है कि मुझे जावास्क्रिप्ट के सबसे अधिक उपयोग की जाने वाली सुविधाओं में से दो को एक-दूसरे के ठीक बगल में उपयोग करने का अवसर मिला: evalऔर with


4
यह वास्तव में एक अच्छी तरह से स्थापित परीक्षण विधि है। हास्केल की क्विकचेक लाइब्रेरी ने सभी मजेदार शुरू किए, मुझे विश्वास है। इसके बाद से इसे कई भाषाओं में दोहराया गया है।
जॉन टायरी

4
मुझे लगता है कि यह ध्यान दिया जाना चाहिए कि, इस कार्यक्रम में सही उत्तर की वापसी की संभावना कम है, जो कि अधिक बड़ा है। इन 1000लूप के लिए किसी तरह इनपुट आकार (कुछ बहुपद गैर-ओ (1) स्केलिंग) के साथ पैमाने पर होना चाहिए।
क्रंचर

2
@ क्रंचर अधिक सटीक होने के लिए, चर की संख्या जितनी बड़ी होगी, सही उत्तर वापस करने की संभावना उतनी ही कम होगी। (उदाहरण के लिए एक एकल चर के साथ एक बहुत लंबी अभिव्यक्ति लगभग हमेशा सही उत्तर
लौटाएगी

2
@TimSeguine मैं स्वीकार करता हूं कि इस संदर्भ में "नॉन्डेटेर्मिनिस्टिक" शब्द का मेरा उपयोग सबसे अच्छा है, ठीक उसी तरह जैसे कि दावा किया जाता है कि SAT को बहुपद समय में हल किया जा सकता है। मुझे पता है कि यह सही नहीं है, यह धोखे के खेल का हिस्सा है।
पीटर ओल्सन

4
@PaulDraper और फिर उन्हें अंडरस्टैंड कहा गया! मैं एक अच्छी हंसी थी!
रोब

32

गणितज्ञ + क्वांटम कम्प्यूटिंग

आप नहीं जानते होंगे कि गणितज्ञ क्वांटम कंप्यूटर पर सवार है

Needs["Quantum`Computing`"];

क्वांटम एडियाबेटिक कम्यूटिंग एक समस्या को हैमिल्टनियन (ऊर्जा ऑपरेटर) में इस तरह से हल किया जाता है कि उसकी न्यूनतम ऊर्जा की स्थिति ("ग्राउंड स्टेट") समाधान का प्रतिनिधित्व करती है। इसलिए हैमिल्टन की जमीनी स्थिति के लिए एक क्वांटम प्रणाली का एडियाबेटिक विकास और बाद में माप समस्या का समाधान देता है।

हम एक सबमिलटोनियन को परिभाषित करते ||हैं जो अभिव्यक्ति के कुछ हिस्सों से मेल खाता है , चर और इसकी नकारात्मकता के लिए पाउली ऑपरेटरों के उचित संयोजन के साथ

यहाँ छवि विवरण दर्ज करें

जहां इस तरह की अभिव्यक्ति के लिए

expr = (! x3) && (! x1) && (x1 || x2 || x1) && (x2 || x3 || x2);

तर्क जैसा दिखना चाहिए

{{{1, x3}}, {{1, x1}}, {{0, x1}, {0, x2}, {0, x1}}, {{0, x2}, {0, x3}, {0, x2}}}

यहाँ बूल अभिव्यक्ति से इस तरह के तर्क का निर्माण करने के लिए कोड है:

arg = expr /. {And -> List, Or -> List, x_Symbol :> {0, x}, 
    Not[x_Symbol] :> {1, x}};
If[Depth[arg] == 3, arg = {arg}];
arg = If[Depth[#] == 2, {#}, #] & /@ arg

अब हम एक पूर्ण हैमिल्टन का निर्माण करते हैं, सबहिलटोनियंस को जोड़ते हैं ( &&यह अभिव्यक्ति अभिव्यक्ति के कुछ हिस्सों से मेल खाती है )

H = h /@ arg /. List -> Plus;

और सबसे कम ऊर्जा अवस्था की तलाश करें

QuantumEigensystemForm[H, -1]

यहाँ छवि विवरण दर्ज करें

यदि हमें शून्य का एक स्वदेशी मिला है, तो आइजनवेक्टर समाधान है

expr /. {x1 -> False, x2 -> True, x3 -> False}
> True

दुर्भाग्य से "क्वांटम कम्प्यूटिंग" ऐड-ऑन के लिए आधिकारिक साइट सक्रिय नहीं है और मुझे इसे डाउनलोड करने के लिए जगह नहीं मिल रही है, मैंने अभी भी इसे अपने कंप्यूटर पर स्थापित किया था। ऐड-ऑन में एसएटी समस्या का एक प्रलेखित समाधान भी है, जिस पर मैंने अपना कोड आधारित किया है।


19
मुझे नहीं पता कि यह जवाब कैसे काम करता है। +1
जोनाथन पुलानो

5
@XiaogeSu "स्वाभाविक रूप से"।
बेंत की मार

3
@XiaogeSu इवोल्यूशन हैमिल्टन द्वारा निर्धारित किया गया है, और स्वाभाविक रूप से यह सबसे कम ऊर्जा के लिए विकसित होता है। इसलिए स्पेक्ट्रम को जानते हुए, हम यह मान सकते हैं कि सिस्टम जमीनी स्थिति में समाप्त हो जाएगा।
बेंत की मार

3
@XiaogeSu जमीनी स्थिति में जाने के लिए, किसी को पर्यावरण के साथ बातचीत करने की भी आवश्यकता होती है जो उच्च राज्यों को समाप्त करता है, आप सही हैं। यहाँ विचार यह है कि यह बातचीत बहुत छोटी है, "एडियाबेटिक"।
टरियन

3
फी एडियैबेटिक क्यूएम कंप्यूटिंग में क्लासिकल सिम्युलेटेड एनेलिंग की काफी समानताएं हैं । अब द्वैत द्वारा लागू किया गया । यह एक "शीतलन" तापमान / ऊर्जा प्रणाली के समान है जो स्थानीय मिनीमा में "पाता / बसता है" ।
vzn

27

यहां तीन दृष्टिकोण, सभी में 2 डी ज्यामितीय लिंगुआ फ्रैंक में सैट की कमी को शामिल किया गया है: नॉनोग्राम लॉजिक पज़ल्स। तर्क पहेली की कोशिकाएँ सैट चर, खण्डों के लिए विवश हैं।

पूर्ण विवरण के लिए (और बग्स के लिए मेरे कोड की समीक्षा करने के लिए कृपया!) मैं पहले ही नॉनोग्राम समाधान स्थान के पैटर्न में कुछ अंतर्दृष्टि पोस्ट कर चुका हूं। Https://codereview.stackexchange.com/questions/43770/nonogram-puzzle-solution-space देखें। Enumerating> 4 बिलियन पहेली समाधान और उन्हें एक सत्य तालिका में फिट करने के लिए एन्कोडिंग फ्रैक्टल पैटर्न दिखाता है - आत्म-समानता और विशेष रूप से आत्म-आत्मीयता। यह चक्कर-अतिरेक समस्या के भीतर संरचना को प्रदर्शित करता है, समाधान उत्पन्न करने के लिए आवश्यक कम्प्यूटेशनल संसाधनों को कम करने के लिए शोषक। यह किसी भी सफल एल्गोरिथ्म के भीतर अराजक प्रतिक्रिया की आवश्यकता को दर्शाता है। चरण संक्रमण व्यवहार में व्याख्यात्मक शक्ति होती है जहां "आसान" उदाहरण वे होते हैं जो मोटे संरचना के साथ होते हैं, जबकि "कठिन" उदाहरणों को ठीक विस्तार में और अधिक पुनरावृत्ति की आवश्यकता होती है, जो सामान्य आंकड़ों से काफी छिपी होती है। यदि आप इस अनंत छवि के कोने में ज़ूम करना चाहते हैं (सभी <= 4x4 पहेली उदाहरण एन्कोडेड) तो http://re-curse.github.io/visualizing-intractability/nonograms_zoom/nonogog.html देखें

विधि 1. अराजक नक्शे और मशीन लर्निंग का उपयोग करके नॉनोग्राम समाधान अंतरिक्ष छाया को बाहर निकालें (जो कि मेन्डेलब्रोट सेट उत्पन्न करने के समान फिटिंग कार्य करता है)।

http://i.stack.imgur.com/X7SbP.png

यहाँ प्रेरण का एक दृश्य प्रमाण है। यदि आप इन चार छवियों को दाएं से बाएं स्कैन कर सकते हैं और सोच सकते हैं कि आपके पास लापता 5 वीं ... 6 वीं ... आदि छवियां उत्पन्न करने के लिए एक अच्छा विचार है, तो मैंने आपको नॉन सॉल्यूशन की निर्णय समस्या के लिए मेरे एनपी ओरेकल के रूप में क्रमादेशित किया है अस्तित्व। कृपया दुनिया के सबसे शक्तिशाली सुपर कंप्यूटर के रूप में अपने पुरस्कार का दावा करने के लिए आगे बढ़ें। मैं आपको हर बार बिजली का झटका खिलाता हूँ, जबकि दुनिया आपके कम्प्यूटेशनल योगदान के लिए धन्यवाद देती है।

विधि 2. इनपुट के बूलियन छवि संस्करण पर फूरियर ट्रांसफॉर्म का उपयोग करें। FFT एक आवृत्ति के भीतर आवृत्ति और स्थिति के बारे में वैश्विक जानकारी प्रदान करते हैं। जबकि परिमाण भाग इनपुट जोड़ी के बीच समान होना चाहिए, उनकी चरण जानकारी पूरी तरह से अलग है - एक विशिष्ट अक्ष के साथ एक समाधान प्रक्षेपण के बारे में दिशात्मक जानकारी युक्त। यदि आप पर्याप्त चतुर हैं तो आप इनपुट चरण छवियों के कुछ विशेष सुपरपोजिशन के माध्यम से समाधान की चरण छवि को फिर से बना सकते हैं। फिर उलटा चरण और आम परिमाण को समाधान के समय डोमेन में बदल दें।

यह तरीका क्या समझा सकता है? सन्निहित रन के बीच लचीली गद्दी के साथ बूलियन छवियों के कई क्रमांकन हैं। यह इनपुट के बीच मैपिंग की अनुमति देता है -> समय डोमेन <-> (आवृत्ति, चरण) के बीच द्विदिश, अद्वितीय मैपिंग की एफएफटी की संपत्ति को बनाए रखते हुए बहुलता का ख्याल रखते हुए समाधान। इसका मतलब यह भी है कि "कोई समाधान नहीं" जैसी कोई चीज नहीं है। यह क्या कहेगा कि एक निरंतर मामले में, वहाँ greyscale समाधान हैं जो आप पर विचार नहीं कर रहे हैं जब पारंपरिक nonogram पहेली को हल करने की पित्त छवि को देखते हैं।

आप ऐसा क्यों नहीं करेंगे? यह वास्तव में गणना करने का एक भयानक तरीका है, क्योंकि आज की फ्लोटिंग-पॉइंट दुनिया में FFTs बड़े उदाहरणों के साथ अत्यधिक गलत होंगे। परिशुद्धता एक बहुत बड़ी समस्या है, और मात्रात्मक परिमाण और चरण छवियों से छवियों का पुनर्निर्माण आमतौर पर बहुत अनुमानित समाधान बनाता है, हालांकि शायद मानव नेत्र थ्रेसहोल्ड के लिए नेत्रहीन नहीं है। इस सुपरपोज़िंग व्यवसाय के साथ आना भी बहुत कठिन है, क्योंकि जिस प्रकार का कार्य वास्तव में कर रहा है वह वर्तमान में अज्ञात है। क्या यह एक साधारण औसत योजना होगी? शायद नहीं, और अंतर्ज्ञान को छोड़कर इसे खोजने के लिए कोई विशिष्ट खोज विधि नहीं है।

विधि 3. एक सेलुलर ऑटोमेटा नियम (वॉन न्यूमैन 2-राज्य नियमों के लिए संभावित ~ 4 बिलियन नियम तालिकाओं में से) का पता लगाएं जो नॉनोग्राम पहेली के एक सममित संस्करण को हल करता है। आप यहां दिखाए गए सेल में समस्या के प्रत्यक्ष एम्बेडिंग का उपयोग करते हैं। कंजर्वेटिव, सिमिट्रिक नॉनोग्राम्स

कंप्यूटिंग के भविष्य के लिए सादगी और अच्छे प्रभावों के संदर्भ में यह संभवतः सबसे सुंदर तरीका है। इस नियम का अस्तित्व साबित नहीं हुआ है, लेकिन मेरे पास एक कूबड़ मौजूद है। यहाँ पर क्यों:

एल्गोरिथ्म में नॉनोग्राम को बहुत अधिक अराजक प्रतिक्रिया की आवश्यकता होती है जिसे वास्तव में हल किया जाना है। यह ब्रूट फोर्स कोड द्वारा कोड रिव्यू से जुड़ा हुआ है। सीए अराजक प्रतिक्रिया कार्यक्रम करने के लिए सबसे सक्षम भाषा के बारे में है।

यह दृष्टिगत रूप से सही लगता है । नियम एक एम्बेडिंग के माध्यम से विकसित होगा, क्षैतिज और लंबवत रूप से जानकारी का प्रचार करेगा, हस्तक्षेप करेगा, फिर एक समाधान को स्थिर करेगा जो सेट कोशिकाओं की संख्या को संरक्षित करता है। यह प्रचार मार्ग उस पथ (पीछे की ओर) का अनुसरण करता है जिसे आप सामान्य रूप से किसी भौतिक वस्तु की छाया को मूल विन्यास में प्रोजेक्ट करते समय सोचते हैं। नॉनोग्राम्स असतत टोमोग्राफी के एक विशेष मामले से निकलता है, इसलिए दो किटी-कॉर्नर वाले सीटी स्कैनर में समवर्ती रूप से बैठने की कल्पना करें .. यह इस प्रकार है कि एक्स-रे चिकित्सा छवियों को उत्पन्न करने के लिए प्रचार करेंगे। बेशक, सीमा मुद्दे हैं - सीए ब्रह्मांड के किनारों को सीमा से परे जानकारी का प्रचार नहीं कर सकते हैं, जब तक कि आप एक टॉरॉइड ब्रह्मांड की अनुमति नहीं देते हैं। यह पहेली को एक आवधिक सीमा मूल्य समस्या के रूप में भी चित्रित करता है।

यह इनपुट के रूप में स्वैपिंग आउटपुट और विज़ वर्सा के बीच एक निरंतर दोलन प्रभाव में क्षणिक स्थिति के रूप में कई समाधान बताता है। यह ऐसे उदाहरणों की व्याख्या करता है जिनका मूल विन्यास के रूप में कोई समाधान नहीं है जो सेट कोशिकाओं की संख्या का संरक्षण नहीं करते हैं। इस तरह के नियम को खोजने के वास्तविक परिणाम के आधार पर, यह एक करीबी समाधान के साथ अनुमानित अस्थिर उदाहरण भी हो सकता है जहां सेल राज्यों का संरक्षण किया जाता है।


2
+1 ने मुझे छोड़ने के लिए कहा " मैंने ऐसा क्यों नहीं सोचा?" : पी
नवीन

आप स्टीफन वोल्फ्राम हैं और मैं अपने पांच पाउंड का दावा करता हूं!
Quuxplusone

4
यह उत्तर वास्तव में अधिक श्रेय का हकदार है, क्योंकि यह एक ठोस कार्यक्रम बनाने का सबसे अच्छा प्रयास है । अच्छा प्रदर्शन।
जोनाथन पुलानो

10

सी ++

यहाँ एक समाधान बहुपद समय में चलाने के लिए गारंटी है कि है: यह में चलाता है O(n^k)जहां nबूलियन्स की संख्या है और kअपनी पसंद का एक निरंतर है।

यह heuristically सही है, जो मुझे लगता है कि के लिए "यह भाग्य का एक सा के साथ, सही जवाब समय के सबसे अधिक देता है" सीएस बात है (और, इस मामले में, का एक उचित रूप से बड़े मान k- संपादित यह वास्तव में मेरे लिए हुआ है कि किसी निश्चित के लिए nआप सेट कर सकते हैं kजैसे कि n^k > 2^n- कि धोखाधड़ी है)।

#include <iostream>  
#include <cstdlib>   
#include <time.h>    
#include <cmath>     
#include <vector>    

using std::cout;     
using std::endl;     
typedef std::vector<bool> zork;

// INPUT HERE:

const int n = 3; // Number of bits
const int k = 4; // Runtime order O(n^k)

bool input_expression(const zork& x)
{
  return 
  (!x[2]) && (
    (!x[0]) && (
      (x[0] || x[1] || x[0]) &&
      (x[1] || x[2] || x[1])));
}

// MAGIC HAPPENS BELOW:    

 void whatever_you_do(const zork& minefield)
;void always_bring_a_towel(int value, zork* minefield);

int main()
{
  const int forty_two = (int)pow(2, n) + 1;
  int edition = (int)pow(n, k);
  srand(time(6["times7"]));

  zork dont_panic(n);
  while(--edition)
  {
    int sperm_whale = rand() % forty_two;
    always_bring_a_towel(sperm_whale, &dont_panic);

    if(input_expression(dont_panic))
    {
      cout << "Satisfiable: " << endl;
      whatever_you_do(dont_panic);
      return 0;
    }
  }

  cout << "Not satisfiable?" << endl;
  return 0;
}
void always_bring_a_towel(int value, zork* minefield)
{
  for(int j = 0; j < n; ++j, value >>= 1)
  {
    (*minefield)[j] = (value & 1);
  }
}

void whatever_you_do(const zork& minefield)
{
  for(int j = 0; j < n; ++j) 
  {
    cout << (char)('A' + j) << " = " << minefield[j] << endl;
  }
}

अच्छा उत्तर। मैं एक बिगाड़ने वाले टैग में स्पष्टीकरण डालूंगा ताकि लोग इसे घूर सकें और अपने सिर को थोड़ा खरोंच कर सकें।
जोनाथन पुलानो

सुझाव @JonathanPullano के लिए धन्यवाद, मैंने एक स्पॉइलर टैग जोड़ा है और कोड को थोड़ा सा बाधित किया है।
कंपूचिप

वैसे, मुझे केवल इसके बारे में पता चला bitfield, शायद मैं उस ओवर को प्राथमिकता देता std::vector
कंपूचिप

3
+1 रचनात्मक अवरोधन और सहयात्री के संदर्भ के लिए
ब्लेक मिलर

2
हाँ, जो धोखा दे रहा है, अगर k n पर निर्भर करता है, तो यह लगातार नहीं है :-)
RemcoGerlich

3

रूबी / gnuplot 3 डी सतह

(ओह कड़ी प्रतिस्पर्धा!) ... वैसे भी ... एक हजार शब्दों के लायक तस्वीर है? ये SAT संक्रमण बिंदु के gnuplot में बने 3 अलग सतह भूखंड हैं। , (x, y) कुल्हाड़ियाँ खंड और परिवर्तनशील संख्या हैं और z ऊँचाई solver में पुनरावर्ती कॉल की कुल # है। माणिक में लिखा कोड। यह 100 नमूनों में से प्रत्येक में 10x10 अंक का नमूना लेता है। यह आंकड़ों के बुनियादी सिद्धांतों का प्रदर्शन / उपयोग करता है और एक मोंटे कार्लो सिमुलेशन है

इसके मूल रूप से एक davis putnam एल्गोरिथ्म DIMACS प्रारूप में उत्पन्न यादृच्छिक उदाहरणों पर चल रहा है। यह व्यायाम का प्रकार है जो आदर्श रूप से दुनिया भर के सीएस कक्षाओं में किया जाएगा ताकि छात्र मूल बातें सीख सकें लेकिन लगभग सभी को विशेष रूप से सिखाया नहीं जाता है ... शायद कुछ कारण इतने फर्जी पी? = एनपी प्रमाण हैं ? संक्रमण बिंदु घटना (कोई लेने वाला?) का वर्णन करने वाला एक अच्छा विकिपीडिया लेख भी नहीं है जो सांख्यिकीय भौतिकी में एक बहुत ही प्रमुख विषय है और सीएस में भी महत्वपूर्ण है। [a] [ख] संक्रमण बिंदु पर सीएस में कई कागजात हैं। हालाँकि बहुत कम ही सतह के प्लॉट दिखाते हैं! (आमतौर पर 2d स्लाइस दिखाने के बजाय।)

रनटाइम में घातीय वृद्धि 1 सेंट प्लॉट में स्पष्ट रूप से स्पष्ट है । 1 सेंट प्लॉट के बीच में चलने वाली काठी संक्रमण बिंदु है। 2 एनडी और 3 आरडी प्लॉट% संतोषजनक संक्रमण दिखाते हैं।

[एक] सीएस पीपीटी टोबी वाल्श में चरण संक्रमण व्यवहार
[ख] के -सैट संतोषजनकता tcs.se की अनुभवजन्य संभावना
[ग] अनुभवजन्य / प्रयोगात्मक गणित / (टी) सीएस / सैट , TMachine ब्लॉग में महान क्षण

यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें

P =? NP QED!

#!/usr/bin/ruby1.8

def makeformula(clauses)
    (1..clauses).map \
    {
            vars2 = $vars.dup
            (1..3).map { vars2.delete_at(rand(vars2.size)) * [-1, 1][rand(2)] }.sort_by { |x| x.abs }
    }

end

def solve(vars, formula, assign)

    $counter += 1
    vars2 = []
    formula.each { |x| vars2 |= x.map { |y| y.abs } }
    vars &= vars2

    return [false] if (vars.empty?)
    v = vars.shift
    [v, -v].each \
    {
            |v2|
            f2 = formula.map { |x| x.dup }
            f2.delete_if \
            {
                    |x|
                    x.delete(-v2)
                    return [false] if (x.empty?)
                    x.member?(v2)
            }
            return [true, assign + [v2]] if (f2.empty?)
            soln = solve(vars.dup, f2, assign + [v2])
            return soln if (soln[0])
    }
    return [false]
end

def solve2(formula)
    $counter = 0
    soln = solve($vars.dup, formula, [])
    return [$counter, {false => 0, true => 1}[soln[0]]]
end


c1 = 10
c2 = 100
nlo, nhi = [3, 10]
mlo, mhi = [1, 50]
c1.times \
{
    |n|
    c1.times \
    {
            |m|
            p1 = nlo + n.to_f / c1 * (nhi - nlo)
            p2 = mlo + m.to_f / c1 * (mhi - mlo)
            $vars = (1..p1.to_i).to_a
            z1 = 0
            z2 = 0
            c2.times \
            {
                    f = makeformula(p2.to_i)
                    x = solve2(f.dup)
                    z1 += x[0]
                    z2 += x[1]
            }
#           p([p1, p2, z1.to_f / c2, z2.to_f / c2]) # raw
#           p(z1.to_f / c2)                         # fig1
#           p(0.5 - (z2.to_f / c2 - 0.5).abs)       # fig2
            p(z2.to_f / c2)                         # fig3
    }
    puts
}

2
मुझे खुशी है कि आपने इस उत्तर में योगदान दिया। पी बनाम एनपी (किसी भी तरह) के किसी भी सफल प्रमाण में यह भविष्य कहनेवाला शक्ति के लिए कई आवश्यकताओं में से एक है। इसके महत्व को इंगित करने के लिए धन्यवाद। :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.