एक स्ट्रा पोल को अधिकतम विघटन


9

प्रसंग

स्ट्रॉ पोल एक वेबसाइट है जो सरल / अनौपचारिक चुनावों के निर्माण के लिए है। विकल्पों की एक सूची के साथ, उपयोगकर्ता अपनी पसंद का चयन कर सकता है, और वोट अधिक हो जाते हैं। एक स्ट्रॉ पोल की दो बहुत महत्वपूर्ण विशेषताएं हैं:

  • मतदान से पहले वर्तमान परिणामों को देखना संभव है
  • कई विकल्पों का चयन करना अक्सर संभव होता है, जिस तरह से व्यवहार किया जाता है जैसे कि आपने कई बार वोट किया, प्रत्येक विकल्प के लिए।

स्ट्रॉ पोल बनाने की तुलना में एक चीज जो अधिक मजेदार है वह परिणामों के साथ खिलवाड़ कर रही है। व्यवधान के दो मुख्य प्रकार हैं:

  • सरल व्यवधान, जिसमें आप सभी विकल्पों के लिए मतदान करते हैं
  • उन्नत व्यवधान, जिसमें आप रणनीतिक रूप से उठाते हैं कि प्रभाव को अधिकतम करने के लिए वोट करने के लिए कौन से विकल्प हैं।

इस चुनौती में, आप उन्नत व्यवधान के लिए एक कार्यक्रम लिखेंगे ।

गणित

गणितीय रूप से चीजों को कहने के लिए, हम कह सकते हैं कि वोटों की एन्ट्रापी जितनी अधिक होती है, एक मतदान उतना ही बाधित होता है। इसका मतलब यह है कि एक सर्वेक्षण जहां एक एकल विकल्प में सभी वोटों को बाधित नहीं किया जाता है, जबकि एक ऐसा सर्वेक्षण जिसमें हर विकल्प के बराबर वोट होते हैं, अधिकतम रूप से बाधित होता है (यह अंतिम लक्ष्य है)।

संख्याओं की सूची की एन्ट्रापी [x1, x2, ..., xn]विकिपीडिया से निम्नलिखित समीकरण द्वारा दी गई है। P(xi)की संभावना है xi, जो है xi / total_num_of_votes। यदि किसी विकल्प को अब तक शून्य वोट प्राप्त हुए हैं, तो यह केवल संक्षेप में शामिल नहीं है (बचने के लिए log(0))। हमारे उद्देश्यों के लिए, लघुगणक आपकी पसंद के किसी भी आधार में हो सकता है।

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

एक उदाहरण के रूप में , बेस का उपयोग करते हुए, एन्ट्रापी [3,2,1,1]लगभग है ।1.277

अगला चरण यह निर्धारित करना है कि वोटिंग पैटर्न एंट्रोपी में सबसे बड़ी वृद्धि की ओर जाता है। मैं विकल्पों के किसी भी सबसेट के लिए वोट कर सकता हूं, इसलिए उदाहरण के लिए मेरा वोट हो सकता है [1,0,1,0]। अगर ये मेरे वोट थे, तो फाइनल टैली है [4,2,2,1]। एन्ट्रापी को पुनर्गणना देता है 1.273, एन्ट्रापी में कमी देता है , जिसका अर्थ है कि यह व्यवधान का एक भयानक प्रयास है। यहाँ कुछ अन्य विकल्प दिए गए हैं:

don't vote
[3,2,1,1] -> 1.277

vote for everything
[4,3,2,2] -> 1.342

vote for the 1s
[3,2,2,2] -> 1.369

vote for the 2 and 1s
[3,3,2,2] -> 1.366

इससे, हम यह निष्कर्ष निकाल सकते हैं कि इष्टतम मतदान पैटर्न है [0,0,1,1]क्योंकि यह एंट्रोपी में सबसे बड़ी वृद्धि देता है।

इनपुट

इनपुट गैर-बढ़ती, गैर-नकारात्मक पूर्णांक की एक गैर-रिक्त सूची है। उदाहरणों में शामिल हैं [3,3,2,1,0,0], [123,23,1]या यहां तक ​​कि [4]। कोई भी उचित प्रारूप स्वीकार्य है।

उत्पादन

आउटपुट सत्य और असत्य मूल्यों की एक सूची (इनपुट के समान लंबाई) है, जहां सत्य उन विकल्पों का प्रतिनिधित्व करते हैं जिनके लिए मुझे वोट देना चाहिए अगर मैं अधिकतम विघटन का कारण बनना चाहता हूं। यदि एक से अधिक मतदान पैटर्न एक ही एन्ट्रापी देता है, तो कोई भी आउटपुट हो सकता है।

जीत का मानदंड

यह कोड-गोल्फ है, कम बाइट्स बेहतर हैं।

परीक्षण के मामलों

[3,2,1,1] -> [0,0,1,1]  (from 1.227 to 1.369)

[3,3,2,1,0,0] -> [0,0,0,1,1,1] (from 1.311 to 1.705)

[123,23,1] -> [0,1,1] (from 0.473 to 0.510)

[4] -> [0] OR [1] (from 0 to 0)

[7,7,6,6,5] -> [0,0,1,1,1] (from 1.602 to 1.608)

[100,50,1,1] -> [0,1,1,1] (from 0.707 to 0.761)

मुझे आश्चर्य है कि अगर हम एन्ट्रापी कम करना चाहते हैं तो क्या होगा ।
कैलकुलेटर

1
परीक्षण के मामले हेयुरिस्टिक के साथ संगत लगते हैं "नीचे-औसत मान बढ़ाएं।" क्या आप कुछ पेचीदा परीक्षण मामलों को शामिल कर सकते हैं?
xnor

@xnor ने कहा कि एन्ट्रापी को एक समान वितरण के साथ अधिकतम किया जाता है, यह एक अच्छा अनुमान है! वास्तव में, यह हमेशा इष्टतम रणनीति भी हो सकती है .. शायद कोई एक अच्छे किनारे के मामले के बारे में सोच सकता है?
एक सीमन्स

जवाबों:


3

गणितज्ञ, १ ९ ४४ बाइट्स

... (जोर से शिकायत करते हुए)

(x=Median@#[[;;Mod[Length@#,2]-3]];#≤x&/@#)&

परीक्षा:

{Test, data, goes, here};
(x=Median@#[[;;Mod[Length@#,2]-3]];#≤x&/@#)&
%%+Boole/@%

यह {100,50,1,1}जहां वापस लौटता है {False, False, True, True}, उसके लिए विफल रहता है , जिसके परिणामस्वरूप एक एन्ट्रापी होता है 0.758{False, True, True, True}की एक एन्ट्रापी देता है 0.761
IPoiler

@ वॉयलर उस टेस्टकेस को खोजने के लिए धन्यवाद।
PhiNotPi

1
(रोता है और मर जाता है)
कैलकुलेटर

2
प्रति यहाँ यह हटा दिया जाना चाहिए।
R

1
..Fixed। (अधिक जोर से शिकायत)
कैलकुलेटर


1

MATL , 24 बाइट्स

FTinZ^tG+!ts/tYl*s4#X<Y)

यह भाषा / संकलक के संस्करण 13.0.0 के साथ काम करता है , जो चुनौती से पहले है।

इसे ऑनलाइन आज़माएं!

व्याख्या

FT        % array [0 1]
in        % take input and push its length
Z^        % Cartesian power. This gives all possible vote patterns, each on a row
t         % duplicate (will be indexed into at the end to produce the result)
G         % push input again
+         % element-wise addition with broadcast
!         % transpose
ts/       % duplicate. Divide each column by its sum
tYl       % duplicatte. Take natural logarithm
*         % element-wise multiplication
s         % sum of each column. Gives minus entropy produce by each vote pattern
4#X<      % arg max
Y)        % index into original array of voting patterns. Implicitly display

उदाहरण

यहाँ एक उदाहरण है कि यह कैसे काम करता है। इनपुट के लिए [3 2 2], संभावित मतदान पैटर्न की सरणी (द्वारा निर्मित Z^) है

[ 0 0 0
  0 0 1
  0 1 0
  0 1 1
  1 0 0
  1 0 1
  1 1 0
  1 1 1 ]

जहां प्रत्येक पंक्ति एक पैटर्न है। यह [3 2 0]प्रसारण के साथ मूल में जोड़ा जाता है ( G+)। इसका मतलब [3 2 0]है कि 8लंबवत बार दोहराया जाता है और फिर तत्व-वार को जोड़ा जाता है

[ 3 2 2
  3 2 3
  3 3 2
  3 3 3
  4 2 2
  4 2 3
  4 3 2
  4 3 3 ]

यह ट्रांसपोस किया गया है और प्रत्येक कॉलम को प्रत्येक योग ( !ts/) से विभाजित किया गया है :

[ 0.4286    0.3750    0.3750    0.3333    0.5000    0.4444    0.4444    0.4000
  0.2857    0.2500    0.3750    0.3333    0.2500    0.2222    0.3333    0.3000
  0.2857    0.3750    0.2500    0.3333    0.2500    0.3333    0.2222    0.3000 ]

इसके लघुगणक से गुणा करना और प्रत्येक कॉलम tYl*sको समेटना ( ) शून्य से एंट्रोपी देता है:

[ -1.0790   -1.0822   -1.0822   -1.0986   -1.0397   -1.0609   -1.0609   -1.0889 ]

न्यूनतम वोट पैटर्न 4#X<द्वारा माइनस एन्ट्रापी को कम से कम ( ) किया जाता है 4, जो अंतिम परिणामY) से मेल खाती है ( ) ।[0 1 1]

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