Artificial Intelligence, pahlawan zaman kita. Etude

Hmm. Salah satu poin yang mengatur tindakan moderator di HabrΓ© dirumuskan sebagai berikut: Anda tidak boleh melewatkan artikel yang kurang terkait dengan topik terkait IT atau tidak sama sekali. Yang langsung membuat penulis berpikir apakah postingannya, yang menceritakan tentang beberapa tahapan pemrograman proyek hewan peliharaannya yang lucu dan mengasyikkan, AI sederhana, yang membangun jaringan saraf berdasarkan bungkus ruby ​​FANN untuk bermain persilangan, terkait langsung ke nol "topik IT"? Pertanyaannya tidak mengandung coquetry tersembunyi, karena deskripsi logika kode program dalam cerita saya jauh dari kepentingan terpenting. "Ya, ini ironi yang jahat!" - kamu bilang. - Saya tidak tahu.





BAIK. Perkembangan ini secara de facto merupakan ilustrasi dari sejumlah pengamatan aneh penulis, sejumlah kenalan bahkan teman-teman yang beberapa tahun belakangan ini ... membuatnya teringat kembali pelajaran sastra-nya dulu ketika ia masih sangat-sangat. sekolah menengah Soviet. Terlepas dari keyakinan permanennya bahwa selalu mungkin untuk "melewati" hanya oleh sesuatu, karakter tertentu dari klasik Rusia semakin sering diingat seiring berjalannya waktu. Atau mungkin harus begitu?





Jadi, langsung dari kelelawar ... setelah peluncuran pertama, program memulai proses belajar mandiri, bermain dengan dirinya sendiri beberapa puluh (satu menit - maksimum dua) dari ribuan game (jumlahnya, tentu saja, tersedia untuk diedit dalam konfigurasi; mengingat algoritme yang tidak biasa seperti yang dijelaskan di bawah, yang mendasari logika AI ini - eksperimen semacam ini juga dapat memberikan materi menarik untuk kesimpulan). Ini mensimulasikan proses pembelajaran yang melekat pada banyak Artificial Intelligence lainnya, dengan satu-satunya perbedaan bahwa kedua "pemain" sama-sama tidak tahu cara bermainnya, membuat gerakan yang benar-benar acak. Tetapi aturan permainan berlaku: jika gerakan acak tidak cocok, program harus dilanjutkan, dan karenanya, pihak yang menang akan pergi ke pihak yang menang. Semuanya adil: tidak ada penghapusan dan peretasan, tidak ada preferensi tersembunyi,tidak ada tes doping palsu untuk Anda, yang sering kali membalikkan hasil pertandingan olahraga di kehidupan nyata.





: csv- , AI, () , - , , .





, ? , : , . , , (, - "") : "" , ... , , .





- , ( ), - . - ... , - , , .





. : , . , , , , , , , : (/). -, Tic Tac Toe - , - ? - , . , , , , - , , ?... , "" ; , " " , - " ", , " !".





, Artificial Intelligence. , 3x3, -, ? , , , , , , , - , ? AI, " " ; - , .





, " ". () , , - . ? , :





        if row[6].to_i - row[3].to_i == 1
            x_data.push([row[0].to_i])
            y_data.push([1]) #   , ..   ,  .
        end
      
      



? - . , .. . ?





, Tic Tac Toe AI with Neural Network ( ). , – : , – – . , , , .





, , - , , . , , , ... ?





. β€œ"... , ? – , , : β€œ , , ”. , β€œ ” ; , β€œ ”. , , ; , . , , , , , , , , : , β€œ , ”.





. , , , . , , - , ... , - , , , .





- ( - life style). , :





  WINNING_TRIADS = [
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8],
    [0, 3, 6],
    [1, 4, 7],
    [2, 5, 8],
    [6, 4, 2],
    [0, 4, 8]
  ].freeze
      
      



, csv- , :





  def fork?
    WINNING_TRIADS.select do |x|
      @board[x[0]] == @board[x[1]] && @board[x[2]].class != @board[x[0]].class &&
        place_x?(x[0]) ||
        @board[x[1]] == @board[x[2]] && @board[x[0]].class != @board[x[2]].class &&
          place_x?(x[1]) ||
        @board[x[0]] == @board[x[2]] && @board[x[1]].class != @board[x[2]].class &&
          place_x?(x[0])
    end
  end
      
      



, ...





  if @game.fork?.size > 1
      
      



... .





, . : , , , . , .





:





  DANGEROUS_SITUATIONS_1 = [
    [6, 4, 2],
    [0, 4, 8]
  ].freeze

  DANGEROUS_SITUATIONS_2 = [
    [0, 4, 7],
    [0, 4, 5],
    [2, 4, 3],
    [2, 4, 7],
    [3, 4, 8],
    [1, 4, 8],
    [1, 4, 6],
    [5, 4, 6]
  ].freeze
      
      



  def fork_danger_1?
    DANGEROUS_SITUATIONS_1.detect do |x|
      @board[x[0]] == @board[x[2]] &&
        @board[x[0]] != @board[x[1]]
    end
  end
  
  def fork_danger_2?
    DANGEROUS_SITUATIONS_2.detect do |x|
      @board[x[0]] == @board[x[2]] &&
        @board[x[0]] != @board[x[1]]
    end
  end

  def fork_danger_3?
    DANGEROUS_SITUATIONS_1.detect do |x|
      @board[x[0]] != @board[x[2]] &&
        @board[x[1]] == @board[x[2]]
    end
  end
      
      



, , , , , AI : 1. , 2. 3. (.. , , , ). , , . , Neural Network.





  array_of_games.each do |row|
      row.each do |e|
        next unless e == current_position

        if row[6].to_i - row[3].to_i == 2 && row[4] == 'O' && row[2].to_f != 0.2
          unacceptable_moves_array << row[0]
        # Find moves that inevitably lead to a fork:
        elsif fork_danger_1 && row[3].to_i == 3 && row[0].to_i.odd?
          unacceptable_moves_array << row[0]
        elsif (fork_danger_2 || fork_danger_3) && row[3].to_i == 3 && row[0].to_i.even?
          unacceptable_moves_array << row[0]
        end
        next if row[5].nil?

        # Find moves that may lead to a fork:
        array_of_moves_to_fork << row[0] if row[3].to_i == row[5].to_i
        # Find attacking moves:
        attack_moves_array << row[0] if row[3].to_i == row[5].to_i && row[6].to_i < 7
      end
    end
      
      



, , , AI , . ... , , , , ... , "" . , , - , , ... ? - ", , ", .





 array_of_games.each do |row|
      row.each do |e|
        next unless e == current_position

        next if arrays[0].include?(row[0])

        unless arrays[1].include?(row[0]) && !arrays[2].include?(row[0])
          if row[6].to_i - row[3].to_i == 1
            x_data.push([row[0].to_i])
            y_data.push([1])
          elsif row[6].to_i - row[3].to_i == 3
            if arrays[2].include?(row[0])
              x_data.push([row[0].to_i])
              y_data.push([0.9])
            elsif arrays[1].include?(row[0])
              x_data.push([row[0].to_i])
              y_data.push([0.3])
            end
          else
            x_data.push([row[0].to_i])
            y_data.push([row[2].to_f])
          end
        end
      end
      
      



:





    data = nn_data(board, fork_danger_1, fork_danger_2, fork_danger_3, array_of_games)
    fann_results_array = []
      train = RubyFann::TrainData.new(inputs: data[0], desired_outputs: data[1])
      model = RubyFann::Standard.new(
        num_inputs: 1,
        hidden_neurons: [4],
        num_outputs: 1
      )
      model.train_on_data(train, 5000, 500, 0.01)
      data[0].flatten.each do |i|
        fann_results_array << model.run([i])
      end
    result = data[0][fann_results_array.index(fann_results_array.max)]
      
      



: ( csv-) Neural Network .





- , - , . csv- ( , ), . , - - , , .





PS Kode yang dijelaskan selalu tersedia secara penuh (dan tidak terpecah-pecah, seperti yang ditentukan oleh format artikel) di github saya , tentu saja, siapa pun dapat membuat klon git dan bereksperimen dengan kode, atau hanya bermain. Saya bukan pendukung menjalankan aplikasi ruby ​​di bawah Windows, ini bukan ide yang sangat bagus, tetapi dalam hal ini akan berhasil, saya mencobanya. Mungkin itu akan menjadi sedikit kurang mengesankan daripada di konsol Linux, tetapi logikanya akan berfungsi.








All Articles