जावा, $ 806,899
यह 2501 राउंड के ट्रायल से है। मैं अभी भी इसे अनुकूलित करने पर काम कर रहा हूं। मैंने दो कक्षाएं, एक आवरण और एक खिलाड़ी लिखा। रैपर खिलाड़ी को लिफाफे की संख्या (वास्तविक चीज़ के लिए हमेशा 10000) के takeQ
साथ इंस्टेंट करता है, और फिर शीर्ष लिफाफे के मूल्य के साथ विधि को कॉल करता है । खिलाड़ी तब वापस लौटता है true
जब वे इसे लेते हैं, false
अगर वे इसे पास करते हैं।
खिलाड़ी
import java.lang.Math;
public class Player {
public int[] V;
public Player(int s) {
V = new int[s];
for (int i = 0; i < V.length; i++) {
V[i] = i + 1;
}
// System.out.println();
}
public boolean takeQ(int x) {
// System.out.println("look " + x);
// http://www.programmingsimplified.com/java/source-code/java-program-for-binary-search
int first = 0;
int last = V.length - 1;
int middle = (first + last) / 2;
int search = x;
while (first <= last) {
if (V[middle] < search)
first = middle + 1;
else if (V[middle] == search)
break;
else
last = middle - 1;
middle = (first + last) / 2;
}
int i = middle;
if (first > last) {
// System.out.println(" PASS");
return false; // value not found, so the envelope must not be in the list
// of acceptable ones
}
int[] newVp = new int[V.length - 1];
for (int j = 0; j < i; j++) {
newVp[j] = V[j];
}
for (int j = i + 1; j < V.length; j++) {
newVp[j - 1] = V[j];
}
double pass = calcVal(newVp);
int[] newVt = new int[V.length - i - 1];
for (int j = i + 1; j < V.length; j++) {
newVt[j - i - 1] = V[j];
}
double take = V[i] + calcVal(newVt);
// System.out.println(" take " + take);
// System.out.println(" pass " + pass);
if (take > pass) {
V = newVt;
// System.out.println(" TAKE");
return true;
} else {
V = newVp;
// System.out.println(" PASS");
return false;
}
}
public double calcVal(int[] list) {
double total = 0;
for (int i : list) {
total += i;
}
double ent = 0;
for (int i : list) {
if (i > 0) {
ent -= i / total * Math.log(i / total);
}
}
// System.out.println(" total " + total);
// System.out.println(" entro " + Math.exp(ent));
// System.out.println(" count " + list.length);
return total * (Math.pow(Math.exp(ent), -0.5) * 4.0 / 3);
}
}
आवरण
import java.lang.Math;
import java.util.Random;
import java.util.ArrayList;
import java.util.Collections;
public class Controller {
public static void main(String[] args) {
int size = 10000;
int rounds = 2501;
ArrayList<Integer> results = new ArrayList<Integer>();
int[] envelopes = new int[size];
for (int i = 0; i < envelopes.length; i++) {
envelopes[i] = i + 1;
}
for (int round = 0; round < rounds; round++) {
shuffleArray(envelopes);
Player p = new Player(size);
int cutoff = 0;
int winnings = 0;
for (int i = 0; i < envelopes.length; i++) {
boolean take = p.takeQ(envelopes[i]);
if (take && envelopes[i] >= cutoff) {
winnings += envelopes[i];
cutoff = envelopes[i];
}
}
results.add(winnings);
}
Collections.sort(results);
System.out.println(
rounds + " rounds, median is " + results.get(results.size() / 2));
}
// stol... I mean borrowed from
// http://stackoverflow.com/questions/1519736/random-shuffling-of-an-array
static Random rnd = new Random();
static void shuffleArray(int[] ar) {
for (int i = ar.length - 1; i > 0; i--) {
int index = rnd.nextInt(i + 1);
// Simple swap
int a = ar[index];
ar[index] = ar[i];
ar[i] = a;
}
}
}
मैं अनुकूलन खत्म करने के बाद एक और विस्तृत विवरण जल्द ही आ रहा हूं।
मुख्य विचार लिफाफे के एक सेट से खेल खेलने से इनाम का अनुमान लगाने में सक्षम होना है। यदि लिफाफे का वर्तमान सेट {2,4,5,7,8,9} है, और शीर्ष लिफाफा 5 है, तो दो विकल्प हैं:
- 5 लें और {7,8,9} वाला गेम खेलें
- 5 पास करें और {2,4,7,8,9} का गेम खेलें
यदि हम {7,8,9} के अपेक्षित इनाम की गणना करते हैं और इसे {2,4,7,8,9} के अपेक्षित इनाम से तुलना करते हैं, तो हम बता पाएंगे कि क्या 5 लेने के लायक है।
अब प्रश्न यह है कि {2,4,7,8,9} जैसे लिफाफे का एक सेट दिया गया है, अपेक्षित मूल्य क्या है? मैंने पाया कि अपेक्षित मूल्य सेट में कुल राशि के आनुपातिक लगता है, लेकिन लिफाफे की संख्या के वर्गमूल के आनुपातिक रूप से आनुपातिक है कि धन को विभाजित किया गया है। यह "पूरी तरह से" कई छोटे गेम खेलने से आया था जिसमें सभी लिफाफे लगभग समान मूल्य के होते हैं।
अगली समस्या यह है कि " लिफाफे की प्रभावी संख्या " कैसे निर्धारित की जाए । सभी मामलों में, लिफाफे की संख्या को ठीक से जाना जाता है, जो आपने देखा और किया है। {234,235,236} की तरह कुछ निश्चित रूप से तीन लिफाफे हैं, {231,232,233,234,235} निश्चित रूप से 5 है, लेकिन {1,2,234,235,236} को वास्तव में 3 के रूप में गिनना चाहिए और 5 नहीं, क्योंकि 1 और 2 लगभग बेकार हैं, और आप 234 पर कभी भी पास नहीं होंगे। आप बाद में 1 या 2 चुन सकते हैं। मुझे लिफाफे की प्रभावी संख्या निर्धारित करने के लिए शैनन एन्ट्रापी का उपयोग करने का विचार था।
मैंने अपनी गणना को उन स्थितियों पर लक्षित किया जहां लिफाफे के मूल्यों को कुछ अंतराल पर समान रूप से वितरित किया जाता है, जो कि खेल के दौरान होता है। अगर मैं {2,4,7,8,9} लेता हूं और इसे संभाव्यता वितरण के रूप में मानता हूं, तो इसकी एंट्री 1.50242 है। फिर मैं exp()
4.49254 प्रभावी लिफाफे के रूप में प्राप्त करने के लिए करता हूं।
{2,4,7,8,9} से अनुमानित इनाम है 30 * 4.4925^-0.5 * 4/3 = 18.87
सटीक संख्या है 18.1167
।
यह एक सटीक अनुमान नहीं है, लेकिन मैं वास्तव में गर्व महसूस कर रहा हूं कि जब लिफाफे समान रूप से एक अंतराल पर वितरित किए जाते हैं तो यह डेटा को कितनी अच्छी तरह फिट करता है। मुझे सही गुणक का यकीन नहीं है (मैं अभी के लिए 4/3 का उपयोग कर रहा हूं) लेकिन यहां गुणक को छोड़कर एक डेटा तालिका है।
Set of Envelopes Total * (e^entropy)^-0.5 Actual Score
{1,2,3,4,5,6,7,8,9,10} 18.759 25.473
{2,3,4,5,6,7,8,9,10,11} 21.657 29.279
{3,4,5,6,7,8,9,10,11,12} 24.648 33.125
{4,5,6,7,8,9,10,11,12,13} 27.687 37.002
{5,6,7,8,9,10,11,12,13,14} 30.757 40.945
{6,7,8,9,10,11,12,13,14,15} 33.846 44.900
{7,8,9,10,11,12,13,14,15,16} 36.949 48.871
{8,9,10,11,12,13,14,15,16,17} 40.062 52.857
{9,10,11,12,13,14,15,16,17,18} 43.183 56.848
{10,11,12,13,14,15,16,17,18,19} 46.311 60.857
अपेक्षित और वास्तविक के बीच रैखिक प्रतिगमन 0.999994 के आर ^ 2 मूल्य देता है ।
इस उत्तर को सुधारने के लिए मेरा अगला कदम अनुमान में सुधार करना है जब लिफाफे की संख्या छोटी होने लगती है, जो तब होता है जब लिफाफे लगभग समान रूप से वितरित नहीं होते हैं और जब समस्या दानेदार होने लगती है।
संपादित करें: यदि इसे बिटकॉइन के योग्य समझा जाता है, तो मुझे सिर्फ एक पता मिला है 1PZ65cXxUEEcGwd7E8i7g6qmvLDGqZ5JWg
। धन्यवाद! (यह यहाँ से था जब चुनौती लेखक पुरस्कार सौंप रहा था।)