সীমিত তথ্য সহ দাবা বিশ্লেষণ


19

এই চ্যালেঞ্জে, আপনাকে দাবা খেলার একটি নির্দিষ্ট গেম সম্পর্কে সীমিত পরিমাণে তথ্য দেওয়া হয়, এবং আপনার খেলাটি কে জিতেছে তা অনুমান করতে হবে

আপনাকে ডেটা দুটি সেট দেওয়া হয়:

  1. পিস গণনা (টুকরো টুকরো এখনও জীবিত)
  2. বোর্ডের রং (বোর্ডে টুকরোগুলির রঙ)

আরো উল্লেখযোগ্য, আপনি না জানেন কোথায় টুকরা অবস্থিত হয় । আপনারা কে জিতবেন বলে নির্ধারণ করতে হবে।

২০১০ থেকে এখন পর্যন্ত পিজিএনমেন্টরে তালিকাভুক্ত সমস্ত ইভেন্ট থেকে গেমস নির্বাচন করা হয়েছে । আমি প্রতিটি গেম থেকে বোর্ড পজিশনের সমস্ত 10% বাছাই করেছি যা একটি জয় বা হারের সাথে শেষ হয়। বোর্ডের অবস্থানগুলি সর্বদা গেমটিতে কমপক্ষে 30 পদক্ষেপে থাকবে। পরীক্ষার কেসগুলি এখানে পাওয়া যাবে । (সাদা জয়গুলি প্রথমে তালিকাভুক্ত, পরে কালো জয়গুলি)

ইনপুট

: টুকরা গণনা প্রতিটি টুকরা জন্য একটি অক্ষর সম্বলিত একটি স্ট্রিং হতে হবে king, queen, rওক্, K night, bishop, অথবা pশস্যশূক। ছোট হাতের অর্থ কালো, বড় হাতের সাদা। বোর্ডটি 64 টি অক্ষরের স্ট্রিং হবে (8 টি কলাম দ্বারা 8 সারি)। Bএকটি কালো টুকরা Wউপস্থাপন করে, একটি সাদা টুকরা .উপস্থাপন করে এবং একটি ফাঁকা জায়গা উপস্থাপন করে। নমুনা:

W..WB......W.BB....W..B..W.WWBBB..W...B....W..BBWWW...BB.W....B.,BBKPPPPPPPQRRbbkpppppppqrr

নিম্নলিখিত বোর্ড প্রতিনিধিত্ব করবে

...B.BB.
.BBBBBBB
.B.B....
B..W....
WWWW.W..
....W.W.
...W..WW
W.....W.

এবং যেখানে উভয় রঙের 2 টি বিশপ, 1 জন রাজা, 7 পাভেন, 1 রানী, 2 টি রুক রয়েছে

আউটপুট

সাদা জয়ের সম্ভাবনা কতটা সম্ভবত তা নির্ধারণ করতে আপনাকে 0 এবং 1 (সমেত) এর মধ্যে একটি ভাসমান-পয়েন্ট নম্বর ফিরিয়ে দিতে হবে। নমুনা:

0.3     (30% chance that white wins)

আরো বিস্তারিত:

  • প্রতিটি পরীক্ষার ক্ষেত্রে 1 পয়েন্টের মূল্য হয়। আপনার স্কোর 1 - (1-Output)^2সাদা জিতলে বা 1 - (Output)^2কালো জিতলে হবে।
  • আপনার চূড়ান্ত স্কোর সমস্ত পরীক্ষার ক্ষেত্রে জুড়ে যোগফল হবে।
  • যদি আমি অনুভব করি যে জমাগুলি ইনপুটটিকে হার্ডকোড করছে, আমি পরীক্ষার কেসগুলি পরিবর্তনের অধিকার সংরক্ষণ করি। (আমি যদি এগুলি পরিবর্তন করি তবে তাদের কাছে SHA-256 হ্যাশ থাকবে 893be4425529f40bb9a0a7632f7a268a087ea00b0eb68293d6c599c6c671cdee)
  • আপনার প্রোগ্রামে অবশ্যই স্বতন্ত্রভাবে পরীক্ষার কেসগুলি চালানো উচিত। একটি পরীক্ষার মামলা থেকে পরেরটিতে কোনও তথ্য সংরক্ষণ করার দরকার নেই।
  • আপনি যদি মেশিন লার্নিং ব্যবহার করে থাকেন তবে আমি প্রথম 80% ডেটা সম্পর্কে প্রশিক্ষণ এবং বাকী 20% ব্যবহার করে পরীক্ষা করার পরামর্শ দিচ্ছি । (বা আপনি যত শতাংশ শতাংশ ব্যবহার করেন)। আমি গেমগুলিতে ডেটাতে একাধিকবার ব্যবহার করি তবে একই গেমগুলিকে আমি ধারাবাহিকভাবে রেখেছি।
  • আপডেট: আমি পরীক্ষার এবং শেখার উদ্দেশ্যে এক মিলিয়নেরও বেশি পরীক্ষার কেস যুক্ত করেছি । গিথুব রেপো আকারের সীমাবদ্ধতার কারণে এগুলি কালো এবং সাদা অংশে বিভক্ত।

গুড লাক এবং মজা আছে!


এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ডেনিস

নতুন পরীক্ষার কেসগুলিতে কি পুরানো রয়েছে, বা দুটি সেট বিচ্ছিন্ন?
29:38

আমার কোন ধারণা নাই. আমি এগুলি বিভিন্ন সাইট থেকে পেয়েছি, সুতরাং এটি উভয়ই একই সেট গেমস অন্তর্ভুক্ত করা সম্ভব।
নাথান মেরিল

উত্তর:


8

জাভা 8 + ওয়েকা, 6413 পয়েন্ট, 94.5%

এই উত্তরটি একটি মেশিন লার্নিং পদ্ধতির ব্যবহার করে। আপনাকে ওয়েকা গ্রন্থাগারটি পুনরুদ্ধার করতে হবে , উল্লেখযোগ্যভাবে weka.jarএবং PackageManager.jar

এখানে, আমি শ্রেণিবদ্ধ হিসাবে মাল্টিলেয়ার পার্সেপট্রন ব্যবহার করি; ফলাফলের তুলনা করতে আপনি ওয়েকার যে mlpকোনও Classifierশ্রেণির সাথে প্রতিস্থাপন করতে পারেন ।

আমি এমএলপির প্যারামিটারগুলির সাথে খুব বেশি টিনক করি নাই, এবং কেবল সেগুলি আইব্ল্যালেড করেছি (50 টি নিউরনগুলির একটি লুকানো স্তর, 100 যুগ, 0.2 শিক্ষার হার, 0.1 গতিবেগ)।

আমি এমএলপি এর আউটপুট মান প্রান্তিক করে, তাই চ্যালেঞ্জ হিসাবে সংজ্ঞায়িত হিসাবে আউটপুট সত্যিই হয় 1 বা 0 হয়। ওয়েকা দ্বারা মুদ্রিত হিসাবে সঠিকভাবে শ্রেণিবদ্ধ উদাহরণগুলির সংখ্যাটি সরাসরি আমাদের স্কোর।

বৈশিষ্ট্য ভেক্টর নির্মাণ

আমি প্রতিটি উদাহরণ একটি স্ট্রিং থেকে elements 76 টি উপাদানের ভেক্টরে পরিণত করি, যেখানে:

  • প্রথম elements৪ টি উপাদান বোর্ডের কোষগুলিকে প্রতিনিধিত্ব করে, স্ট্রিংয়ের মতো একই ক্রমে, যেখানে 1একটি সাদা টুকরা -1হয় একটি কালো টুকরা এবং 0খালি ঘর।
  • সর্বশেষ 12 টি উপাদান প্রতিটি ধরণের টুকরা উপস্থাপন করে (প্রতি খেলোয়াড়ের জন্য 6); এই উপাদানগুলির মান হ'ল বোর্ডে সেই ধরণের টুকরো সংখ্যা ( 0"এই ধরণের কোনও টুকরো নয়")। এই মানগুলি -1 এবং 1 এর মধ্যে প্রতিস্থাপনের জন্য কেউ সাধারণীকরণ প্রয়োগ করতে পারে তবে এটি সম্ভবত এখানে খুব বেশি সহায়ক নয় helpful

প্রশিক্ষণের উদাহরণ সংখ্যা

আমি যদি আমার শ্রেণিবদ্ধ প্রশিক্ষণ দেওয়ার জন্য দেওয়া সমস্ত পরীক্ষার কেসগুলি ব্যবহার করি তবে আমি 6694 (অর্থাত্ 98.6588%) সঠিকভাবে শ্রেণিবদ্ধ উদাহরণ পেতে সক্ষম হয়েছি । এটি স্পষ্টতই অবাক হওয়ার মতো নয় কারণ আপনি যে প্রশিক্ষণের জন্য এটি ব্যবহার করেছিলেন একই ডেটাতে একটি মডেল পরীক্ষা করা খুব সহজ (কারণ সেক্ষেত্রে এটি মডেলটির চেয়ে বেশি পরিমাণে কার্যকর) actually

প্রশিক্ষণের ডেটা হিসাবে .০% দৃষ্টান্তের এলোমেলো উপসেট ব্যবহার করে আমরা we৪১13 (অর্থাত্ 94৯.৫১7373%) সঠিকভাবে শ্রেণিবদ্ধ উদাহরণগুলি শিরোনামে রিপোর্ট করেছি (অবশ্যই যেহেতু সাবসেটটি এলোমেলোভাবে আপনি কিছুটা আলাদা ফলাফল পেতে পারেন)। আমি আত্মবিশ্বাসী যে মডেলটি নতুন ডেটাতে খুব ভালভাবে কাজ করবে, কারণ বাকি 20% উদাহরণের পরীক্ষা করা (যা প্রশিক্ষণের জন্য ব্যবহৃত হয়নি) .0 77.০৮১%% সঠিক শ্রেণিবিন্যাস দেয় , যা দেখায় যে মডেলগুলি শালীনভাবে সাধারণীকরণ করেছে (ধরে নেওয়া আমাদের এখানে যে উদাহরণ দেওয়া হয়েছে তা হ'ল আমাদের দেওয়া নতুন পরীক্ষার কেসগুলির প্রতিনিধি।

প্রশিক্ষণের জন্য অর্ধেক দৃষ্টান্ত, এবং পরীক্ষার জন্য বাকী অর্ধেক ব্যবহার করে, আমরা পেতে 86,7502% উভয় প্রশিক্ষণ ও পরীক্ষার ডেটা, এবং উপর 74,4988% শুধুমাত্র টেস্ট ডেটার উপর।

বাস্তবায়ন

আমি যেমন বলেছি থাকেন, এই কোড প্রয়োজন weka.jarএবং PackageManager.jarওয়েকা থেকে।

প্রশিক্ষণে ব্যবহৃত ডেটার শতকরা একটিকে নিয়ন্ত্রণ করতে পারে TRAIN_PERCENTAGE

এমএলপির প্যারামিটারগুলি ঠিক নীচে পরিবর্তন করা যেতে পারে TRAIN_PERCENTAGE। একজন অন্য শ্রেণিবদ্ধের সাথে SMOকেবল প্রতিস্থাপন করে ওয়েকার অন্যান্য শ্রেণিবদ্ধকারী (যেমন এসভিএমগুলির জন্য) চেষ্টা করতে পারেন mlp

এই প্রোগ্রামটি ফলাফলের সেটগুলিতে মুদ্রণ করে, প্রথমটি পুরো সেটে থাকে (প্রশিক্ষণের জন্য ব্যবহৃত ডেটা সহ) যা এই চ্যালেঞ্জটিতে সংজ্ঞায়িত স্কোর এবং দ্বিতীয়টি কেবলমাত্র সেই ডেটাতে থাকে যা প্রশিক্ষণের জন্য ব্যবহৃত হয়নি।

প্রোগ্রামের আর্গুমেন্ট হিসাবে থাকা ফাইলটির পাথ পাস করে কেউ ডেটা প্রবেশ করে।

import weka.classifiers.Classifier;
import weka.classifiers.Evaluation;
import weka.classifiers.functions.MultilayerPerceptron;
import weka.core.Attribute;
import weka.core.DenseInstance;
import weka.core.Instance;
import weka.core.Instances;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;

public class Test {

    public static void main(String[] arg) {

        final double TRAIN_PERCENTAGE = 0.5;

        final String HIDDEN_LAYERS = "50";
        final int NB_EPOCHS = 100;
        final double LEARNING_RATE = 0.2;
        final double MOMENTUM = 0.1;

        Instances instances = parseInstances(arg[0]);
        instances.randomize(new java.util.Random(0));
        Instances trainingSet = new Instances(instances, 0, (int) Math.floor(instances.size() * TRAIN_PERCENTAGE));
        Instances testingSet = new Instances(instances, (int) Math.ceil(instances.size() * TRAIN_PERCENTAGE), (instances.size() - (int) Math.ceil(instances.size() * TRAIN_PERCENTAGE)));

        Classifier mlp = new MultilayerPerceptron();
        ((MultilayerPerceptron) mlp).setHiddenLayers(HIDDEN_LAYERS);
        ((MultilayerPerceptron) mlp).setTrainingTime(NB_EPOCHS);
        ((MultilayerPerceptron) mlp).setLearningRate(LEARNING_RATE);
        ((MultilayerPerceptron) mlp).setMomentum(MOMENTUM);


        try {
            // Training phase
            mlp.buildClassifier(trainingSet);
            // Test phase
            System.out.println("### CHALLENGE SCORE ###");
            Evaluation test = new Evaluation(trainingSet);
            test.evaluateModel(mlp, instances);
            System.out.println(test.toSummaryString());
            System.out.println();
            System.out.println("### TEST SET SCORE ###");
            Evaluation test2 = new Evaluation(trainingSet);
            test2.evaluateModel(mlp, testingSet);
            System.out.println(test2.toSummaryString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Instances parseInstances(String filePath) {
        ArrayList<Attribute> attrs = new ArrayList<>(); // Instances constructor only accepts ArrayList
        for(int i = 0 ; i < 76 ; i++) {
            attrs.add(new Attribute("a" + String.valueOf(i)));
        }
        attrs.add(new Attribute("winner", new ArrayList<String>(){{this.add("white");this.add("black");}}));
        Instances instances = new Instances("Rel", attrs, 10);
        instances.setClassIndex(76);

        try {
            BufferedReader r = new BufferedReader(new FileReader(filePath));
            String line;
            String winner = "white";
            while((line = r.readLine()) != null) {
                if(line.equals("White:")) {
                    winner = "white";
                } else if(line.equals("Black:")) {
                    winner = "black";
                } else {
                    Instance instance = new DenseInstance(77);
                    instance.setValue(attrs.get(76), winner);
                    String[] values = line.split(",");
                    for(int i = 0 ; i < values[0].length() ; i++) {
                        if(values[0].charAt(i) == 'B') {
                            instance.setValue(attrs.get(i), -1);
                        } else if(values[0].charAt(i) == 'W') {
                            instance.setValue(attrs.get(i), 1);
                        } else {
                            instance.setValue(attrs.get(i), 0);
                        }
                    }
                    // Ugly as hell
                    instance.setValue(attrs.get(64), values[1].length() - values[1].replace("k", "").length());
                    instance.setValue(attrs.get(65), values[1].length() - values[1].replace("q", "").length());
                    instance.setValue(attrs.get(66), values[1].length() - values[1].replace("r", "").length());
                    instance.setValue(attrs.get(67), values[1].length() - values[1].replace("n", "").length());
                    instance.setValue(attrs.get(68), values[1].length() - values[1].replace("b", "").length());
                    instance.setValue(attrs.get(69), values[1].length() - values[1].replace("p", "").length());
                    instance.setValue(attrs.get(70), values[1].length() - values[1].replace("K", "").length());
                    instance.setValue(attrs.get(71), values[1].length() - values[1].replace("Q", "").length());
                    instance.setValue(attrs.get(72), values[1].length() - values[1].replace("R", "").length());
                    instance.setValue(attrs.get(73), values[1].length() - values[1].replace("N", "").length());
                    instance.setValue(attrs.get(74), values[1].length() - values[1].replace("B", "").length());
                    instance.setValue(attrs.get(75), values[1].length() - values[1].replace("P", "").length());

                    instances.add(instance);
                }
            }
        } catch (Exception e) { // who cares
            e.printStackTrace();
        }
        return instances;
    }
}

আপনি কীভাবে ইনপুটটি এনকোড করবেন?
নাথান মেরিল

@ নাথানমারিল আমি নিশ্চিত না যে আমি আপনার প্রশ্নটি বুঝতে পেরেছি
ফ্যাটালাইজ

নিউরাল নেটওয়ার্কে ইনপুট হিসাবে আপনি কীভাবে পরীক্ষার কেসটি পাস করছেন? আপনি কি শুধু কাঁচা স্ট্রিং মধ্যে পাস?
নাথান মেরিল

@ নাথানমারিল বৈশিষ্ট্য ভেক্টর নির্মাণের একটি অনুচ্ছেদে সম্পাদনা করেছেন।
মার্চকে মারাত্মক রূপ দিন

উইকা কীভাবে জানতে পারে যে আপনি বিজয়ীর পূর্বাভাস দেওয়ার চেষ্টা করছেন?
ব্যবহারকারী1502040

8

গনুহ sed + + BC, 4336 5074.5 পয়েন্ট, 64 75%

আপডেট: ওপি পৃথক পরীক্ষার ক্ষেত্রে পূর্বাভাসের স্কোর গণনা করার জন্য একটি নতুন উপায় দিয়েছে। ওল্ফ্রাম আলফা ব্যবহার করে , আমি পার্থক্যগুলি দেখতে উভয় সূত্রের প্লট করেছি।

বর্তমান উপায়টি আসল সম্ভাব্যতাগুলি আউটপুট করার জন্য একটি শক্তিশালী উত্সাহ এনেছে, এবং কেবল মাত্রাতিরিক্ত, 0 এবং 1 নয়, যার জন্য নতুন সূত্রগুলি আগের মতো একই সর্বোচ্চ স্কোর দেয়। এই কারণেই নীচের অপরিবর্তিত অ্যালগরিদমটির এখন আরও ভাল পূর্বাভাসের হার রয়েছে, প্রকৃতপক্ষে তার সরলতার কারণে একটি দুর্দান্ত হার।

যাইহোক, নতুন সূত্রগুলির সাথে যুক্ত একটি অপূর্ণতাও রয়েছে, যেমনটি 'সম্পাদনা 1' তে ব্যাখ্যা করা হয়েছে।


এটি কেবলমাত্র উপাদানগুলির সুবিধা / অসুবিধার ভিত্তিতে একটি সাধারণ অনুমান যা টুকরোগুলির প্রকৃত স্থাপনাকে উপেক্ষা করে। আমি কৌতূহল ছিলাম কীভাবে এটি সম্পাদন করবে। আমি সেড ব্যবহার করার কারণ, এবং এমন কোনও ভাষা নয় যা এক লাইনে এটি করতে পারে, কারণ এটি আমার প্রিয় রহস্যময় ভাষা।

/:/d                                             # delete the two headers
s:.*,::                                          # delete board positions
s:$:;Q9,R5,B3,N3,P1,K0,q-9,r-5,b-3,n-3,p-1,k-0:  # add relative piece value table
:r                                               # begin replacement loop
s:([a-Z])((.*)\1([^,]+)):\4+\2:                  # table lookup: letter-value repl.
tr                                               # repeat till last piece
s:;.*::                                          # delete value table
s:.*:echo '&0'|bc:e                              # get material difference: bc call
/^0$/c0.5                                        # print potential draw score
/-/c0                                            # print potential black win score
c1                                               # print potential white win score

স্ট্যান্ডার্ড টুকরা মান ব্যবহৃত:

  • 9 - রানী
  • 5 - রুক
  • 3 - নাইট
  • 3 - বিশপ
  • 1 - বন্ধকী
  • 0 - রাজা

আমি উভয় পক্ষের জন্য উপাদান গণনা এবং সাদা থেকে কালো এর উপাদান বিয়োগ। প্রতিটি পরীক্ষার ক্ষেত্রে আউটপুট সেই পার্থক্যের উপর ভিত্তি করে নিম্নরূপ:

  • যদি পার্থক্য> 0 হয়, তবে আউটপুট = 1 (সম্ভাব্য সাদা জয়)
  • যদি পার্থক্য = 0 হয়, তবে আউটপুট = 0.5 (সম্ভাব্য অঙ্কন)।

এটি আমার একমাত্র ভগ্নাংশের আউটপুট, সুতরাং উপরে বর্ণিত উন্নতির কারণ।

  • যদি পার্থক্য <0, তবে আউটপুট = 0 (সম্ভাব্য কালো জয়)

এই পদ্ধতির পূর্বাভাসের হার ছিল 64%। এখন এটি নতুন সূত্র সহ 75%।

আমি প্রাথমিকভাবে এটি উচ্চতর হওয়ার আশা করেছিলাম, 70% বলি, তবে দাবা খেলোয়াড় হিসাবে নিজেই আমি ফলাফলটি বুঝতে পারি, যেহেতু আমি যখন +1 / +2 থাকি তখন অনেকগুলি খেলাগুলি হেরেছি এবং আমি যখন নামতাম তখন অনেকগুলি জিতেছিলাম উপাদান. এটি সবই আসল অবস্থান সম্পর্কে। (ভাল, এখন আমি আমার ইচ্ছা পেয়েছি!)

সম্পাদনা 1: অপূর্ণতা

তুচ্ছ সমাধানটি প্রতিটি পরীক্ষার ক্ষেত্রে 0.5 আউটপুট আউট করা হয়, কারণ এইভাবে আপনি জয়ী হয়ে নির্বিশেষে আপনি অর্ধেক পয়েন্ট অর্জন করেছিলেন। আমাদের পরীক্ষার ক্ষেত্রে, এর অর্থ মোট 3392.5 পয়েন্ট (50%) এর স্কোর।

তবে নতুন সূত্রগুলির সাথে 0.5 (যেটি আপনি জিতেন সে বিষয়ে সিদ্ধান্ত না নিয়ে যদি আপনি একটি আউটপুট দেন) 0.75 পয়েন্টে রূপান্তরিত হয়। মনে রাখবেন যে পরীক্ষার ক্ষেত্রে আপনি যে সর্বোচ্চ স্কোর পেতে পারেন তা বিজয়ীর প্রতি 100% আত্মবিশ্বাসের জন্য 1। যেমন, একটি ধ্রুবক 0.5 আউটপুট জন্য নতুন মোট স্কোর 5088.75 পয়েন্ট বা 75%! আমার মতে, প্রণোদনা এই ক্ষেত্রে খুব শক্তিশালী।

এই স্কোরটি আমার উপাদানের সুবিধা ভিত্তিক অ্যালগরিদমের চেয়ে প্রান্তিক হলেও ভাল। এর কারণ হ'ল কারণ অ্যালগরিদম 1 বা 0 (কোনও প্ররোচক নয়), ধরে নেওয়া জয় বা ক্ষতির সম্ভাবনা দেয়, এটি 0.5 (ইনসেন্টিভ) দেয় তার চেয়ে বেশি বার (3831), ধরে নেওয়া অঙ্কন (2954)। পদ্ধতিটি শেষ পর্যন্ত সহজ, এবং এর মতো সঠিক উত্তরগুলির উচ্চ শতাংশ নেই। নতুন সূত্র থেকে ধ্রুবক 0.5 তে উন্নীত করা কৃত্রিমভাবে সেই শতাংশে পৌঁছায়।

সম্পাদনা 2:

দাবা বইয়ে উল্লিখিত এটি একটি পরিচিত ঘটনা, এটি নাইটের জুটির চেয়ে বিশপ জুড়ি রাখাই ভাল। এটি খেলার মধ্যবর্তী থেকে শেষ পর্যায়ে বিশেষত সত্য, যেখানে পরীক্ষার কেসগুলি রয়েছে, যেহেতু বিশপের পরিসর বাড়ানো হয় সেখানে খোলা অবস্থানের সম্ভাবনা বেশি।

অতএব আমি একটি দ্বিতীয় পরীক্ষা করেছি, তবে এবার আমি বিশপের মান 3 থেকে 3.5 তে প্রতিস্থাপন করেছি। নাইটের মান 3 রইল This এটি ব্যক্তিগত পছন্দ so এই ক্ষেত্রে মোট স্কোর ছিল 4411 পয়েন্ট (65%)। মাত্র 1 শতাংশ পয়েন্ট বৃদ্ধি লক্ষ্য করা গেছে।

নতুন সূত্রগুলির সাথে, মোট স্কোর 4835 পয়েন্ট (71%)। এখন ভারী বিশপ আন্ডারফর্ম করে। তবে, প্রভাবটি ব্যাখ্যা করা হয়েছে কারণ ওজনিত পদ্ধতিটি অনুমানিত ড্র (1696) এর চেয়ে বেশি সময় ধরে ধরে নেওয়া জয় বা ক্ষতি (5089) দেয়।


1
যুক্তিসঙ্গত বেসলাইন সমাধান সরবরাহ করার জন্য +1। আমি আরও ভাবছিলাম যে এটি কতটা ভাল পারফর্ম করবে।
মার্টিন ইন্ডার

@ মার্টিনইেন্ডার আপনাকে ধন্যবাদ বিশপের মান বাড়ানোর বিষয়ে আমার ধারণা, গতবার উল্লেখ করা হয়েছে, কেবলমাত্র 1% সাফল্যের হার বৃদ্ধি করেছে (আপডেট 2 দেখুন)। আমি মনে করি মানক মানগুলিতে সর্বোপরি সেই প্রভাবটি অন্তর্ভুক্ত ছিল।
সিশোমারা

আরে, এক্সনোরের মতামত অনুসারে, আমি যদি স্কোরিংটিকে স্কোয়ারের পরম পার্থক্য হিসাবে পরিবর্তন করি তবে আপনি কি আপত্তি করবেন?
নাথান মেরিল

1
অসাধারণ. উত্তর দেওয়ার জন্য ধন্যবাদ! আমি সর্বদা উদ্বিগ্ন যে আমার কঠিন প্রশ্নের উত্তর কখনই পাওয়া যাবে না।
নাথান মেরিল

@ নাথানমিরিল জিজ্ঞাসা করা নতুন স্কোরিংটি ব্যবহার করতে আমি আমার উত্তর আপডেট করেছি। দীর্ঘ বিশ্লেষণের জন্য দুঃখিত, তবে আমি সত্যিই আগ্রহী ছিলাম।
শৈশুমারা

4

পাইথন 3 - 84.6%, একটি বৈধতা সেটে 5275 পয়েন্ট

আমরা যদি সমস্ত ডেটা প্রতারণা করে এবং ব্যবহার করি তবে আমরা 99.3% এর সঠিকতা এবং 6408 এর স্কোর অর্জন করতে পারি

কেরাস ব্যবহার করে ড্রপআউট সহ কেবল একটি সাধারণ বৃহত এমএলপি

import collections
import numpy as np
import random

import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers.noise import GaussianDropout
from keras.optimizers import Adam

np.random.seed(0)
random.seed(0)

def load_data():
    with open('test_cases.txt', 'r') as f:
        for line in f:
            yield line.split(',')

def parse_data(rows):
    black_pieces = "kpbkrq"
    white_pieces = black_pieces.upper()
    for i, row in enumerate(rows):
        if len(row) >= 2:
            board = row[0]
            board = np.array([1 if c == 'W' else -1 if c == 'B' else 0 for c in board], dtype=np.float32)
            pieces = row[1]
            counts = collections.Counter(pieces)
            white_counts = np.array([counts[c] for c in white_pieces], dtype=np.float32)
            black_counts = np.array([counts[c] for c in black_pieces], dtype=np.float32)
            yield (outcome, white_counts, black_counts, board)
        else:
            if 'White' in row[0]:
                outcome = 1
            else:
                outcome = 0

data = list(parse_data(load_data()))
random.shuffle(data)
data = list(zip(*data))
y = np.array(data[0])
x = list(zip(*data[1:]))
x = np.array([np.concatenate(xi) for xi in x])

i = len(y) // 10

x_test, x_train = x[:i], x[i:]
y_test, y_train = y[:i], y[i:]

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(76,)))
model.add(GaussianDropout(0.5))
model.add(Dense(512, activation='relu'))
model.add(GaussianDropout(0.5))
model.add(Dense(512, activation='relu'))
model.add(GaussianDropout(0.5))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='mean_squared_error', optimizer=Adam())

use_all_data = False

x_valid, y_valid = x_test, y_test

if use_all_data:
    x_train, y_train = x_test, y_test = x, y
    validation_data=None
else:
    validation_data=(x_test, y_test)

batch_size = 128

history = model.fit(x_train, y_train, batch_size=batch_size, epochs=50, verbose=1, validation_data=validation_data)

y_pred = model.predict_on_batch(x_test).flatten()
y_class = np.round(y_pred)
print("accuracy: ", np.sum(y_class == y_test) / len(y_test))

score = np.sum((y_pred - (1 - y_test)) ** 2) * (len(y) / len(y_test))
print("score: ", score)

৮৪..6% চিত্রটি পেতে প্রশিক্ষণের জন্য আপনি কতটা ডেটা ব্যবহার করেন?
ফ্যাটালাইজ করুন


আরে, আপনি যদি আগ্রহী হন তবে আমি আরও একটি টন পরীক্ষার মামলা যুক্ত করেছি ।
নাথান মেরিল

2

পাইথন 3 - 94.3% যথার্থতা, ডেটা 20% এর একটি বৈধতা সেট 6464 পয়েন্ট

3 টি নিউরাল নেটওয়ার্ক, নিকটতম প্রতিবেশী রিগ্রেসার, একটি এলোমেলো বন এবং গ্রেডিয়েন্ট বুস্টিং ব্যবহার করে। এই পূর্বাভাসগুলি একটি এলোমেলো বনের সাথে মিলিত হয় যা ডেটাতে অ্যাক্সেসও করে।

import collections
import numpy as np
import numpy.ma as ma
import random

import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, BatchNormalization, Activation, Conv2D, Flatten
from keras.layers.noise import GaussianDropout
from keras.callbacks import EarlyStopping
from keras.optimizers import Adam
from sklearn.neighbors import KNeighborsRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
import tensorflow

tensorflow.set_random_seed(1)
np.random.seed(1)
random.seed(1)

def load_data():
    with open('test_cases.txt', 'r') as f:
        for line in f:
            yield line.split(',')

def parse_data(rows):
    black_pieces = "kqrnbp"
    white_pieces = black_pieces.upper()
    for i, row in enumerate(rows):
        if len(row) >= 2:
            board = row[0]
            board = np.array([1 if c == 'W' else -1 if c == 'B' else 0 for c in board], dtype=np.float32)
            pieces = row[1]
            counts = collections.Counter(pieces)
            white_counts = np.array([counts[c] for c in white_pieces], dtype=np.float32)
            black_counts = np.array([counts[c] for c in black_pieces], dtype=np.float32)
            yield (outcome, white_counts, black_counts, board)
        else:
            if 'White' in row[0]:
                outcome = 1
            else:
                outcome = 0

data = list(parse_data(load_data()))
random.shuffle(data)
data = list(zip(*data))
y = np.array(data[0])
x = list(zip(*data[1:]))
conv_x = []
for white_counts, black_counts, board in x:
    board = board.reshape((1, 8, 8))
    white_board = board > 0
    black_board = board < 0
    counts = [white_counts, black_counts]
    for i, c in enumerate(counts):
        n = c.shape[0]
        counts[i] = np.tile(c, 64).reshape(n, 8, 8)
    features = np.concatenate([white_board, black_board] + counts, axis=0)
    conv_x.append(features)
conv_x = np.array(conv_x)
x = np.array([np.concatenate(xi) for xi in x])
s = x.std(axis=0)
u = x.mean(axis=0)
nz = s != 0
x = x[:,nz]
u = u[nz]
s = s[nz]
x = (x - u) / s

i = 2 * len(y) // 10

x_test, x_train = x[:i], x[i:]
conv_x_test, conv_x_train = conv_x[:i], conv_x[i:]
y_test, y_train = y[:i], y[i:]

model = Sequential()

def conv(n, w=3, shape=None):
    if shape is None:
        model.add(Conv2D(n, w, padding="same"))
    else:
        model.add(Conv2D(n, w, padding="same", input_shape=shape))
    model.add(BatchNormalization())
    model.add(Activation('relu'))

conv(128, shape=conv_x[0].shape) 
conv(128)
conv(128)
conv(128)
conv(128)
conv(128)
conv(128)
conv(128)
conv(128)
conv(128)
conv(2, w=1)
model.add(Flatten())
model.add(GaussianDropout(0.5))
model.add(Dense(256))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(GaussianDropout(0.5))
model.add(Dense(1))
model.add(BatchNormalization())
model.add(Activation('sigmoid'))

model.compile(loss='mse', optimizer=Adam())

model5 = model

model = Sequential()
model.add(Dense(50, input_shape=(x.shape[1],)))
model.add(Activation('sigmoid'))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='mse', optimizer=Adam())

model0 = model

model = Sequential()
model.add(Dense(1024, input_shape=(x.shape[1],)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(GaussianDropout(0.5))
model.add(Dense(1024))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(GaussianDropout(0.5))
model.add(Dense(1024))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(GaussianDropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='mse', optimizer=Adam())

model4 = model

use_all_data = False

x_valid, y_valid = x_test, y_test

if use_all_data:
    x_train, y_train = x_test, y_test = x, y
    validation_data=None
else:
    validation_data=(x_test, y_test)

def subsample(x, y, p=0.9, keep_rest=False):
    m = np.random.binomial(1, p, size=len(y)).astype(np.bool)
    r = (x[m,:], y[m])
    if not keep_rest:
        return r
    m = ~m
    return r + (x[m,:], y[m])

epochs=100

x0, y0, x_valid, y_valid = subsample(conv_x_train, y_train, keep_rest=True)
model5.fit(x0, y0, epochs=epochs, verbose=1, validation_data=(x_valid, y_valid), callbacks=[EarlyStopping(patience=1)])

x0, y0, x_valid, y_valid = subsample(x_train, y_train, keep_rest=True)
model0.fit(x0, y0, epochs=epochs, verbose=1, validation_data=(x_valid, y_valid), callbacks=[EarlyStopping(patience=1)])

x0, y0, x_valid, y_valid = subsample(x_train, y_train, keep_rest=True)
model4.fit(x0, y0, epochs=epochs, verbose=1, validation_data=(x_valid, y_valid), callbacks=[EarlyStopping(patience=1)])

model1 = RandomForestRegressor(n_estimators=400, n_jobs=-1, verbose=1)
model1.fit(*subsample(x_train, y_train))

model2 = GradientBoostingRegressor(learning_rate=0.2, n_estimators=5000, verbose=1)
model2.fit(*subsample(x_train, y_train))

model3 = KNeighborsRegressor(n_neighbors=2, weights='distance', p=1)
model3.fit(*subsample(x_train, y_train))

models = (model0, model1, model2, model3, model4, model5)

model_names = [
    "shallow neural net",
    "random forest",
    "gradient boosting",
    "k-nearest neighbors",
    "deep neural net",
    "conv-net",
    "ensemble"
]

def combine(predictions):
    clip = lambda x: np.clip(x, 0, 1)
    return clip(np.array([y.flatten() for y in predictions]).T)

def augment(x, conv_x):
    p = combine([m.predict(x) for m in models[:-1]] + [models[-1].predict(conv_x)])
    return np.concatenate((x, p), axis=1)

model = RandomForestRegressor(n_estimators=200, n_jobs=-1, verbose=1)
model.fit(augment(x_train, conv_x_train), y_train)

def accuracy(prediction):
    class_prediction = np.where(prediction > 0.5, 1, 0)
    return np.sum(class_prediction == y_test) / len(y_test)

predictions = [m.predict(x_test).flatten() for m in models[:-1]] + [models[-1].predict(conv_x_test).flatten()]+ [model.predict(augment(x_test, conv_x_test))]

for s, p in zip(model_names, predictions):
    print(s + " accuracy: ", accuracy(p))

def evaluate(prediction):
    return np.sum(1 - (prediction - y_test) ** 2) * (len(y) / len(y_test))

for s, p in zip(model_names, predictions):
    print(s + " score: ", evaluate(p))

আরে, আপনি যদি আগ্রহী হন তবে আমি আরও একটি টন পরীক্ষার মামলা যুক্ত করেছি ।
নাথান মেরিল

ওহ, আপনি এই নিয়ে বাইরে গেছেন।
রবার্ট ফ্রেজার

জাভা উত্তরটি এখানে নোট করুন যে আপনার "বীট" পুরো ডেটা সেটটিতে% বলে প্রতিবেদন করেছে এবং এটি যে প্রশিক্ষণ দেয়নি সেটিতে কেবল 77% হয়ে যায়।
রবার্ট ফ্রেজার

0

পাইথন 3 - 4353.25 / 6785 পয়েন্ট - 64%

তাই আমি বেশিরভাগই গতকাল এ নিয়ে কাজ করেছি। আমার প্রথম পোস্ট গল্ফিং, এবং আমি কেবলমাত্র এক সপ্তাহ বা তারপরে অজগরটি ব্যবহার করছি, তাই যদি সবকিছুই অনুকূলিত না হয় তবে আমাকে ক্ষমা করুন।

def GetWhiteWinPercent(a):
finalWhiteWinPercent=0
i=a.index(',')

#position
board=a[:i]
blackBoardScore=0
whiteBoardScore=0
for r in range(i):
    if board[r] == 'B': blackBoardScore += abs(7 - (r % 8))
    if board[r] == 'W': whiteBoardScore += r % 8
if   whiteBoardScore > blackBoardScore: finalWhiteWinPercent += .5
elif whiteBoardScore < blackBoardScore: finalWhiteWinPercent += .0
else: finalWhiteWinPercent+=.25

#pieces
pieces=a[i:]
s = {'q':-9,'r':-5,'n':-3,'b':-3,'p':-1,'Q':9,'R':5,'N':3,'B':3,'P':1}
pieceScore = sum([s.get(z) for z in pieces if s.get(z) != None])
if   pieceScore < 0: finalWhiteWinPercent += 0
elif pieceScore > 0: finalWhiteWinPercent += .5
else: finalWhiteWinPercent += .25

return finalWhiteWinPercent

আমি সেশোমারের উত্তরটি শুরু করার সাথে সাথে একই পথটি শেষ করেছি। তবে বিপুল সংখ্যক পরীক্ষার কেস এমনকি টুকরো টুকরো টুকরো টুকরো ছিল আমাকে অসন্তুষ্ট করেছিল।

সুতরাং আমি এমন বৈশিষ্ট্যগুলি গুগল করেছিলাম যে দাবাতে কে জিতছে (যে আমি নিজে গেমটি খেলি না) এবং বোর্ড বোর্ডের অবস্থান, বিশেষত কেন্দ্র নিয়ন্ত্রণ, লক্ষ্য করা যায় তা বড়। এই বিট আসে যেখানে।

for r in range(i):
    if board[r] == 'B': blackBoardScore += abs(7 - (r % 8))
    if board[r] == 'W': whiteBoardScore += r % 8
if   whiteBoardScore > blackBoardScore: finalWhiteWinPercent += .5
elif whiteBoardScore < blackBoardScore: finalWhiteWinPercent += .0
else: finalWhiteWinPercent+=.25

মিলিত এই দুটি অংশই স্কোরটি খুঁজে পেতে ব্যবহৃত হয় (0.0, 0.25, 0.50, 0.75, 1.0)

খুব আকর্ষণীয় যে এই বোর্ড পজিশনের অতিরিক্ত বিজয়ীর অনুমান করার সুযোগটি মোটেই বাড়বে বলে মনে হচ্ছে না।

যদি আপনি পরীক্ষার কেসগুলিকে কিছু ফাইলে ফেলে দেন তবে এখানে পরীক্ষা করা হচ্ছে।

whiteWins=0
blackWins=0
totalWins=0
for line in open('testcases2.txt','r'):
    totalWins += 1
    blackWins += 1 - GetWhiteWinPercent(line)
for line in open('testcases.txt','r'):
    totalWins += 1
    whiteWins += GetWhiteWinPercent(line)

print(str(whiteWins+blackWins) +'/'+str(totalWins))

আমি জানি এটি কোনও গল্ফ চ্যালেঞ্জ নয়, তবে এই বিষয়ে কোনও পরামর্শ বা পরামর্শ প্রশংসাযোগ্য!


আমার উত্তর? তুমি কি বোঝাতে চাচ্ছামো উত্তর? এছাড়াও, আপনার এটি গল্ফ করার দরকার নেই (আপনি না চাইলে)। এটি কোনও কোড-গল্ফ চ্যালেঞ্জ নয়।
নাথান মেরিল

আপনি কেবলমাত্র একটি অক্ষরের পরিবর্তনশীল নাম ব্যবহার করে অনেকগুলি বাইট সংরক্ষণ করতে পারেন। (যদিও এটি কোনও গুরুত্বপূর্ণ নয় কারণ এটি কোড-গল্ফ নয়)
হাইপারনিউটারিনো 22:48

Woops! এখনই সম্পাদনা করছি। কর্মক্ষেত্রে, আমি স্কিমিংয়ের জন্য এটিই পাই!
ডেটাস্ট্রিম

2
দয়া করে এটি গল্ফ করবেন না। কোড-গল্ফ না থাকলে কোডটি পঠনযোগ্য রাখা ভাল।
mbomb007

বোর্ডের মাঝামাঝি নিয়ন্ত্রণ মানে বোর্ডের মাঝামাঝি দখল করা নয়, তবে বোর্ডের মাঝখানে আক্রমণ করা। যদি আপনি এর চারপাশে কিছু জটিলতা যুক্ত করতে চান তবে এটি আপনার স্কোরকে উন্নত করতে পারে।
চার্লস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.