জাভা, 6 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 is হয় এবং শীর্ষ খামটি 5 হয় তবে দুটি সম্ভাবনা রয়েছে:
- 5 নিন এবং একটি গেম খেলুন {7,8,9}
- 5 পাস করুন এবং {2,4,7,8,9} একটি খেলা খেলুন
আমরা যদি {7,8,9 of এর প্রত্যাশিত পুরষ্কার গণনা করি এবং এটি 2,4,7,8,9 of এর প্রত্যাশিত পুরষ্কারের সাথে তুলনা করি, তবে 5 টি গ্রহণযোগ্য কিনা তা আমরা জানাতে সক্ষম হব।
এখন প্রশ্ন হল, en 2,4,7,8,9 এর মতো খামের সেট দেওয়া the প্রত্যাশিত মানটি কী? আমি খুঁজে পেয়েছিলাম প্রত্যাশিত মানটি সেটের মোট অর্থের সমানুপাতিক বলে মনে হচ্ছে, তবে যে পরিমাণ খামে টাকা বিভক্ত হয়েছে তার বিপরীতে আনুপাতিক সমানুপাতিক। এটি বেশ কয়েকটি ছোট গেম খেলে "নিখুঁতভাবে" এসেছে যার মধ্যে সমস্ত খামের প্রায় অভিন্ন মূল্য রয়েছে।
পরবর্তী সমস্যাটি কীভাবে " খামের কার্যকর সংখ্যা " নির্ধারণ করবেন । সব ক্ষেত্রেই, আপনি কী দেখেছেন এবং কী করেছেন সে সম্পর্কে নজর রেখে খামের সংখ্যাটি ঠিক জানা যায়। 4 234,235,236 Some এর মতো কিছু অবশ্যই তিনটি খাম, {231,232,233,234,235 definitely অবশ্যই 5, তবে 2 1,2,234,235,236 really অবশ্যই 3 হিসাবে গণনা করা উচিত এবং 5 টি খাম নয় কারণ 1 এবং 2 প্রায় মূল্যহীন, এবং আপনি কখনও 234 এ পাস করবেন না আপনি পরে 1 বা 2 বাছাই করতে পারেন আমার খামের কার্যকর সংখ্যা নির্ধারণের জন্য শ্যানন এনট্রপি ব্যবহার করার ধারণা ছিল।
আমি আমার গণনাগুলিকে এমন পরিস্থিতিতে লক্ষ্য করেছি যেখানে খামের মানগুলি কিছুটা বিরতিতে সমানভাবে বিতরণ করা হয়, যা খেলার সময় ঘটে। যদি আমি {2,4,7,8,9 take গ্রহণ করি এবং এটির সম্ভাবনা বন্টন হিসাবে বিবেচনা করি তবে এর এনট্রপিটি 1.50242। তারপরে আমি exp()
খামের কার্যকর সংখ্যা হিসাবে 4.49254 পেতে পারি ।
{2,4,7,8,9} থেকে আনুমানিক পুরষ্কার 30 * 4.4925^-0.5 * 4/3 = 18.87
সঠিক সংখ্যাটি হ'ল 18.1167
।
এটি কোনও সঠিক অনুমান নয়, তবে খামগুলি যখন অন্তরালে সমানভাবে বিতরণ করা হয় তখন ডেটাটি ঠিক কতটা ফিট করে তা নিয়ে আমি আসলেই গর্বিত। আমি সঠিক গুণকটির বিষয়ে নিশ্চিত নই (আমি আপাতত 4/3 ব্যবহার করছি) তবে এখানে গুণকটি বাদ দিয়ে একটি ডাটা টেবিল দেওয়া হয়েছে is
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
লিনিয়ার রিগ্রেশন প্রত্যাশিত এবং প্রকৃত মধ্যে একটি দেয় আর ^ 2 0.999994 মান ।
এই উত্তরটির উন্নতি করার জন্য আমার পরবর্তী পদক্ষেপটি যখন এনভেলাপগুলির সংখ্যা কম পরিমাণে কমতে শুরু করে তখন অনুমানের উন্নতি করা হয়, যা হয় যখন খামগুলি প্রায় অভিন্নভাবে বিতরণ করা হয় না এবং যখন সমস্যাটি দানাদার হতে শুরু করে।
সম্পাদনা করুন: যদি এটি বিটকয়েনের যোগ্য হিসাবে বিবেচিত হয় তবে আমি ঠিক এখানে একটি ঠিকানা পেয়েছি 1PZ65cXxUEEcGwd7E8i7g6qmvLDGqZ5JWg
। ধন্যবাদ! (চ্যালেঞ্জ লেখক যখন পুরষ্কার দিচ্ছিলেন তখন থেকেই এটি এখানে ছিল))