একটি নির্বোধ গো এআই তৈরি করুন


11

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

আপনার কাজটি এমন একটি প্রোগ্রাম তৈরি করা যা কোনও গো বোর্ডের বর্তমান অবস্থা গ্রহণ করে এবং কোনটি কী পদক্ষেপ বা পাস করতে হবে তা নির্ধারণ করে।

আপনার প্রোগ্রামটি নিম্নলিখিতগুলি ইনপুট হিসাবে গ্রহণ করবে:

  • 19 টি লাইন, প্রতিটি 19 অক্ষর সমেত বর্তমানে গো বোর্ডে টুকরোগুলি উপস্থাপন করে। একটি চরিত্র 0খালি বর্গক্ষেত্রকে উপস্থাপন করে, 1কালো এবং 2সাদা।

  • প্রতিটি খেলোয়াড়ের কয়েদী টুকরা সংখ্যার প্রতিনিধিত্ব করে এমন দুটি সংখ্যা (কালো, পরে সাদা)।

  • যার পালা তার পালা (কালো বা সাদা) প্রতিনিধিত্বকারী একটি নম্বর। উপরে হিসাবে, 1কালো, এবং 2সাদা।

এবং নিম্নলিখিতগুলির মধ্যে একটি আউটপুট:

  • স্থানাঙ্কগুলির একটি জুড়ি যা স্থানাঙ্কগুলিকে a bপ্রতিনিধিত্ব করে move 1 1শীর্ষ-বাম বর্গক্ষেত্র, এবং প্রথম এবং দ্বিতীয় সংখ্যাগুলি যথাক্রমে নীচে এবং ডানদিকে সরানো উপস্থাপন করে।

  • স্ট্রিং pass, যা উত্তরণের পদক্ষেপের প্রতিনিধিত্ব করে।

উদাহরণস্বরূপ, প্রোগ্রামটি নিম্নলিখিত ইনপুট গ্রহণ করতে পারে:

0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000000000000000000
0001210000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
0 0 1

এটি এমন একটি গেম উপস্থাপন করে যেখানে কেবল কয়েকটি চাল চালানো হয়েছে।

তারপরে প্রোগ্রামটি আউটপুট দেয় 6 5, যার অর্থ "উপরে থেকে 6th ষ্ঠ বিন্দুতে একটি কালো পাথর এবং বাম থেকে 5 ম"। এটি সাদা পাথর ক্যাপচার হবে 7 5। বোর্ডের অবস্থা তখন পরিবর্তিত হবে:

0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000100000000000000
0001010000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
1 0 2

(মনে রাখবেন যে একটি সাদা পাথর ধরা পড়লেও এটি কালো রঙের বন্দী হিসাবে গণ্য হয়েছে))

আপনার কোড অবশ্যই নিম্নলিখিত বৈশিষ্ট্যগুলি সন্তুষ্ট করতে হবে:

  • যদি আপনার প্রোগ্রামটিকে একই ইনপুট স্থিতি দেওয়া হয় তবে তা অবশ্যই সর্বদা একই আউটপুট উত্পাদন করে। এটি গো এআই এর নির্ধারণবাদ। এটিতে অবশ্যই কোনও এলোমেলো উপাদান থাকা উচিত নয়।

  • আপনার প্রোগ্রামটি কী পদক্ষেপ নেবে তা নির্ধারণ করতে অবশ্যই প্রায় 60 সেকেন্ডের বেশি সময় নেওয়া উচিত নয়। কম্পিউটিং পাওয়ারে ভিন্নতার কারণে এই নিয়মটি কঠোরভাবে প্রয়োগ করা হবে না তবে এটি অবশ্যই একটি যুক্তিসঙ্গত সময়ে একটি পদক্ষেপ নিতে হবে।

  • আপনার প্রোগ্রামের উত্স কোডটি মোট 1 মেগাবাইট (1,048,576 বাইট) অতিক্রম করতে হবে না।

  • আপনার প্রোগ্রামটি সর্বদা আইনী পদক্ষেপ নিতে হবে। আপনার প্রোগ্রামটি এমন কোনও পদক্ষেপ নিতে পারে না যেখানে একটি পাথর ইতিমধ্যে উপস্থিত রয়েছে, এবং এমন কোনও টুকরো স্থাপন করতে পারে না যার ফলস্বরূপ তার নিজস্ব পাথরগুলির একটি গোষ্ঠী ধরা পড়বে। (এই চ্যালেঞ্জের উদ্দেশ্যে নিয়মের একটি ব্যতিক্রম হ'ল একটি প্রোগ্রামকে এমন একটি অবস্থান তৈরি করার অনুমতি দেওয়া হয়েছিল যা মূলত সেখানে ছিল - কারণ এটি কেবলমাত্র একটি বোর্ডের বর্তমান অবস্থান হিসাবে দেওয়া হয়, এটি কোন ধরণের পদক্ষেপ গ্রহণ করেছিল তা সংরক্ষণ করার আশা করা যায় না আগে.)

আপনার জমা দেওয়ার পরে গো-এর একটি গেম যেখানে বোর্ডের রাজ্যটি খালি শুরু হয় এবং গোটা গেমের বোর্ডের পজিশনের ব্যবস্থা করা হয় এবং একটি পদক্ষেপ গ্রহণ করে তা অন্য সমস্ত সাবমিশনের বিপক্ষে অল-প্লে-সমস্ত টুর্নামেন্টে খেলবে each ।

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

জয়ের শর্তগুলি হ'ল:

  • যদি আপনার প্রোগ্রামটি খেলাটির শেষ পর্যন্ত খেলতে থাকে তবে বিজয়ী নির্ধারণ করতে গো এর চীনা স্কোরিং বিধি ব্যবহার করা হবে। কোনও কোমি প্রয়োগ করা হবে না।

  • যদি আপনার প্রোগ্রামটি এমন এক পর্যায়ে চলে যায় যে কোনও পূর্ববর্তী অবস্থানে পৌঁছেছে, সুতরাং এটি অসীম লুপের কারণ হয়ে থাকে, তবে দুটি প্রোগ্রাম বেঁধে দেওয়া হবে বলে ঘোষণা করা হবে।

অন্যান্য জমা দেওয়ার তুলনায় আপনার জমাটি কত পয়েন্ট স্কোর করবে। একটি জয় মূল্য 1 পয়েন্ট, এবং একটি টাই অর্ধেক পয়েন্ট মূল্য সর্বাধিক পয়েন্ট সহ জমাটি সার্বিক বিজয়ী।


এটি একটি কিং-অফ-পার্বত্য চ্যালেঞ্জ, যাতে যে কোনও সময়ে যে কোনও নতুন এন্ট্রি পোস্ট করতে পারে এবং যখন এটি ঘটে তখন পর্যায়ক্রমিকভাবে পর্যালোচনা করা হবে।


7
ঠিক আছে, অন্য সমস্ত জমা দেওয়ার অপেক্ষায় এবং তারপরে আমার নিজের লেখার জন্য তাদের পরাজিত করার জন্য - সমাধানগুলি নির্বিচারবাদী হওয়ার কারণে এটি সম্ভব হওয়া উচিত।
হাওয়ার্ড

1
এটি কো-তে খেলে মনে হচ্ছে যে পূর্ববর্তী অবস্থানটি পুনরাবৃত্তি করার অনুমতি দেওয়া হয়েছে তবে তা অবিলম্বে ড্র করার দিকে পরিচালিত করে (যেহেতু এটি লুপের কারণ হয়ে দাঁড়ায়)। আকর্ষণীয় ...
ফায়ারফ্লাই

2
দেখে মনে হচ্ছে আপনার সমস্যাটি খুব স্বতন্ত্র এবং কেউ উপযুক্ত উত্তর দেওয়ার জন্য যথেষ্ট পরিশ্রম করবেন না (এটি আসলেই অনেক কাজ। এটি একটি দুর্দান্ত সমস্যা, তবে কাজটি কাজ করা খুব কঠিন।
ভিক্টর স্টাফুসা

1
কেন একটি ছোট বোর্ড ব্যবহার করবেন না? 9x9 প্রাথমিক খেলোয়াড়দের জন্য যথেষ্ট সাধারণ। এটি অনুসন্ধানের জায়গাকে নাটকীয়ভাবে হ্রাস করে, তবে এটি এত ছোট নয় যে এটি বিশ্লেষণ করে এখনও "পিটানো" হয়েছে (আমার মনে হয় যে সবচেয়ে বড় যেটি পুরোপুরি সমাধান করা হয়েছে তা 5x6)।
জিওবিটস

1
ইনপুট কীভাবে কাজ করে? স্টিডিন না কমান্ড লাইনের যুক্তি?
Ypnypn

উত্তর:


7

এই চ্যালেঞ্জটি স্থল থেকে সরাতে এখানে আমার প্রবেশ। পাইথন কোড:

print "pass"

আপনার নিয়ম অনুসারে সর্বদা "পাস" বাজানো একটি বৈধ (খারাপ হলেও) কৌশল।


আপনার কোড সর্বদা যে কারও বিরুদ্ধে এটি খেলতে পারে তার বিরুদ্ধে হারাবে। তবুও, ভাল বেস-কেস উত্তর।
জো জেড।

1
@JoeZ। এবং এর চেহারা থেকে তিনি এটি দিয়ে জিতেছিলেন: পি
ডেভিড মুলদার

4

জাভা: একটি স্পট, যে কোনও জায়গা বেছে নিন

বৈধতার জন্য পরীক্ষা করার জন্য কেবল বোর্ডে দাগ বেছে নেয়। এটি পিআরএনজি ব্যবহার করে তবে একটি সেট বীজের সাথে তাই এটি নির্বিচারক। এটি কতগুলি বাঁক কেটে গেছে তার উপর নির্ভর করে PRNG চক্রের বিভিন্ন অংশ ব্যবহার করে।

প্রতিটি পরীক্ষার্থীর পদের জন্য এটি পরীক্ষা করে এটি পরীক্ষা করে যে এটি একটি বৈধ পদক্ষেপ (তবে এটি কোনও স্মার্ট পদক্ষেপ নয়)। যদি তা না হয় তবে এটি পরবর্তী প্রার্থীর দিকে এগিয়ে যায়। এটি 1000 টি চেষ্টা করার পরে যদি কোনও বৈধ পদক্ষেপ না খুঁজে পায়, তবে এটি পাস হয়ে যায়।

import java.util.Random;
import java.util.Scanner;

public class GoNaive {

    int[][] board;
    boolean[] checked;
    int me;

    public static void main(String[] args) {
        new GoNaive().run();
    }

    void run(){
        int turns = init();
        Random rand = new Random(seed);

        for(int i=0;i<turns*tries;i++)
            rand.nextInt(size*size);

        for(int i=0;i<tries;i++){
            int pos = rand.nextInt(size*size);
            for(int c=0;c<size*size;c++)
                checked[c]=false;
            if(board[pos%size][pos/size] == 0)
                if(hasLiberties(pos, me)){
                    System.out.print((pos%size+1) + " " + (pos/size+1));
                    System.exit(0);
                }
        }
        System.out.print("pass");
    }

    boolean hasLiberties(int pos, int color){
        if(checked[pos])
            return false;
        checked[pos] = true;

        int x = pos%size, y=pos/size, n;

        if(x>0){
            n = board[x-1][y];
            if(n==0 || (n==me && hasLiberties(y*size+x-1, color)))
                return true;
        }
        if(size-x>1){
            n = board[x+1][y];
            if(n==0 || (n==me && hasLiberties(y*size+x+1, color)))
                return true;
        }
        if(y>0){
            n = board[x][y-1];
            if(n==0 || (n==me && hasLiberties((y-1)*size+x, color)))
                return true;
        }
        if(size-y>1){
            n = board[x][y+1];
            if(n==0 || (n==me && hasLiberties((y+1)*size+x, color)))
                return true;
        }
        return false;
    }

    int init(){
        int turns = 0;
        board = new int[size][size];
        checked = new boolean[size*size];
        turns = 0;
        Scanner s = new Scanner(System.in);
        String line;
        for(int i=0;i<size;i++){
            line = s.nextLine();
            for(int j=0;j<size;j++){
                board[j][i] = line.charAt(j)-48;
                if(board[j][i] > 0)
                    turns++;
            }
        }
        String[] tokens = s.nextLine().split(" ");
        turns += Integer.valueOf(tokens[0]);
        turns += Integer.valueOf(tokens[1]);
        me = Integer.valueOf(tokens[2]);
        s.close();
        return turns;
    }

    final static int size = 19;
    final static int seed = 0xdeadface;
    final static int tries = 1000;
}

2

কিছু স্কেলা:

package go;

class Go {
  def main(args : Array[String]) {
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    System.out.printLn("1 1")
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    readLine()
    System.out.printLn("pass")
  }
}

উইকিপিডিয়া পড়া থেকে, আমি মনে করি এটি বর্তমান সমাধানকে পরাজিত করবে।


আসলে, এটি উভয় ক্ষেত্রেই 361 পয়েন্টে জিতবে।
জো জে।

আসলে, আমি ফিরে নিতে হবে, এটি অনুমান অনুসরণ করে না। এআই রাষ্ট্রহীন হওয়ার কথা। বোর্ডের অবস্থা বিবেচনা করে এটি কেবল একটি জিনিস মুদ্রণ করার কথা , এবং আপনি এটি দুটি ( 1 1এবং pass) মুদ্রণ করেছেন ।
জো জেড।

@JoeZ। ঠিক কর. যাইহোক সংকলন করতে হবে না।
ইয়েস্টেচলব

এটি সর্বদা প্রিন্ট হবে 1 1, যেহেতু বোর্ডটি প্রতিবার পরিবর্তন হওয়ার সাথে সাথে প্রোগ্রামটি সর্বদা নতুনভাবে চালিত হয়।
জো জেড।

1

জাভা

public class Go {
  public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    for (int i = 0; i < 361;) {
      char c = s.nextChar();
      if (c != '\n') {
        if (c == '0') {
          System.out.println((i % 19 + 1) + " " + (i / 19 + 1));
          System.exit(0);
        }
        i++;
      }
    }
  }
}

প্রথম খালি জায়গা চয়ন করে। পোস্টের সময় হিসাবে কোনও এআই এর বিপক্ষে জয়ী হয়।


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