整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          本科作業到Nature子刊:大二學生突破量子計算近20年的糾錯碼難題

          器之心報道

          作者:張倩、維度

          別人家孩子的本科生涯:悉尼大學的一位本科生在大二寫物理作業時「一不小心」解決了一個量子計算難題,相關論文剛剛登上了《自然 - 通訊》雜志。

          一作、悉尼大學本科生 Pablo Bonilla Ataides(左);通訊作者、悉尼大學博士生 Benjamin J. Brown(右)

          在量子計算領域,利用量子計算機執行大規模計算可能需要基于量子糾錯碼的容錯架構,其中面臨的挑戰在于設計一種使用適度資源即可有效對抗實際噪聲的實用量子糾錯碼。

          兩年前,在一次物理作業中,悉尼大學的一名大二本科生 Pablo Bonilla「一不小心」取得了該領域的重要突破。他所在的研究團隊對一些常用的量子糾錯碼進行了簡單但優雅的更改,將它們的糾錯能力提升了一倍,從而縮短了實現可擴展量子計算的進程。在此之前,這種常用的糾錯碼已經被研究了近 20 年。

          隨后,他們在 arXiv 上公布了一篇名為《The XZZX surface code》的論文,詳細介紹了所提出的「XZZX」計算碼。

          近日,這項研究又登上了《自然 - 通訊》雜志,更引起了 AWS 帕薩迪納量子計算中心以及耶魯大學和杜克大學量子研究項目組的注意。這些機構還打算使用他的計算碼。

          AWS 高級量子研究科學家 Earl Campbell 表示,「在量子計算領域取得任何真正、實際的效益之前,我們有大量的工作要做。但是,Bonilla 等人的這項研究令我驚訝,我沒想到量子糾錯碼的微小變化會對預測性能產生這么大的影響。」AWS 量子計算中心團隊還期待與 Bonilla 等人進一步合作,探索其他有前景的替代方案,進而使得新的、更強大的計算技術更加接近現實。

          此外,悉尼大學理論物理學教授 Stephen Bartlett 進一步追問了該研究,「這些就是量子計算機容錯的最高閾值嗎?是否仍然有超越哈希的空間呢?」

          量子糾錯

          經典計算機利用晶體管(可以理解為「開關」)運行我們的手機、筆記本等各種設備,出錯的概率非常小。但是,量子計算機中的「開關」(即量子比特)對外部環境的干擾(噪聲)卻非常敏感。

          為了讓量子計算機平穩運行,研究者需要制造出大量高質量的量子比特。具體實現方法包括:改進機器,減少噪聲,或利用機器的某種能力將量子比特錯誤抑制在某一閾值以下。

          這就是量子糾錯(quantum error correction)的作用所在。

          量子錯誤的發生分為幾種情況:其中一種叫做 X-error,發生在量子比特圍繞自己的軸翻轉的時候;還有一種叫做 Z-error,屬于相位翻轉錯誤;二者結合便產生了 Y-error。

          杜克大學量子糾錯專家 Kenneth Brown 介紹說,「在量子糾錯中,我們通常假設 X-、Y-、Z-error 是等可能的。然而,真實的實驗結果卻并非如此。」

          Bonilla 所做的工作就是在每一秒都重新調整糾錯碼的一部分。這種碼被稱為 surface code,可以在已經連通的量子比特的二維網絡中工作。

          量子棋盤

          為了便于理解,我們可以把 surface code 想象成一個 國際象棋棋盤。在其最初的設計中,黑色方塊用于檢測 Z-error,白色方塊用于檢測 X-error。但是,相比之下,Z-error 要更加普遍。因此,用那么多的方塊去檢測不那么常見的 X-error 顯得非常浪費。

          Bonilla 設計的計算碼打破了這種設計,將一半的量子開關進行了翻轉,使每一個方塊都能用于檢測兩種錯誤。這種計算碼被稱為「XZZX」碼,顯示了對 surface code 的重新設計。

          XZZX surface code 示意圖。

          「XZZX」計算碼的容錯閾值。

          Brown 教授表示,「XZZX 碼非常了不起,因為它通過簡單的局部變換就能為所有 X、Z 錯誤不均的情況提供最佳解決方案。」

          耶魯大學量子研究項目助理教授 Shruti Puri 表示,她的團隊對在工作中使用新計算碼很感興趣。

          「這種計算碼的優雅讓人眼前一亮。它的卓越糾錯特性來自于對原碼的簡單修改,而后者我們已經研究了近 20 年。」Puri 說道,「這與耶魯和其他機構正在開發的新一代量子技術極為相關。我相信,有了這套計算碼,我們可以大大縮短實現可擴展量子計算的時間線。」

          該研究的合著者、物理學院的 David Tuckett 博士表示,「這有點像和量子對手玩海戰棋。從理論上來說,他們可以把船放在棋盤的任何地方。但在玩了數百萬場后,我們已經掌握了他們的一些布局規律。」「從實驗中我們知道,Z-error 要比 X-error 常見得多。根據這一特性,Pablo 重新設計了 surface code,大大提高了其抑制錯誤的能力。」

          實用價值

          該研究的合著者、悉尼大學理學院研究副院長 Stephen Bartlett 表示,「這一設計的偉大之處在于,我們可以有效地對其進行改進,以適應整個行業正在開發的 surface code」。

          「對于一個長期從事 2D 芯片設計的行業來說,讓新計算碼在一個二維表面上工作有著非常理想的應用價值。」

          文章的另一位合著者、悉尼大學納米研究所和物理學院博士 Ben Brown 表示,「建造一臺實用的量子計算機有點像萊特兄弟要造飛機,我們現在甚至還沒離開過地面。」

          「實驗人員正在生產用來造飛機的堅固、輕便材料,而我們剛剛為機翼貢獻了一個更符合空氣動力學的設計,它有更大的升力。我們的設計可能會幫助大規模量子計算起飛。」

          參考鏈接:

          https://www.eurekalert.org/pub_releases/2021-04/uos-ssh041221.php

          https://phys.org/news/2021-04-student-physics-homework-amazon-quantum.html

          段時間發的飛機大戰的游戲很多小伙伴都私聊讓再做個游戲,今天小猿圈web前端講師為大家分享的是JS五子棋的游戲,想玩的小伙伴記得自己運行一下呦。

          JS五子棋游戲代碼:

          <!DOCTYPE html>

          <html>

          <head>

          <meta charset="UTF-8">

          <title>五子棋</title>

          <style type="text/css">

          canvas {

          display: block;

          margin: 50px auto;

          box-shadow: -2px -2px 2px #EFEFEF, 5px 5px 5px #B9B9B9;

          cursor: pointer;

          }

          #btn-wrap {

          display: flex;

          flex-direction: row;

          justify-content: center;

          }

          #btn-wrap div {

          margin: 0 10px;

          }

          div>span {

          display: inline-block;

          padding: 10px 20px;

          color: #FFFFFF;

          background-color: #EE82EE;

          border-radius: 5px;

          cursor: pointer;

          }

          div.unable span {

          background: #D6D6D4;

          color: #ADACAA;

          }

          #result-wrap {

          text-align: center;

          }

          </style>

          </head>

          <body>

          <h3 id="result-wrap">三人行慕課(www.3mooc.com)——五子棋</h3>

          <canvas id="chess" width="450px" height="450px"></canvas>

          <div id="btn-wrap">

          <div id="restart" class="restart">

          <span>重新開始</span>

          </div>

          <div id="goback" class="goback unable">

          <span>悔棋</span>

          </div>

          <div id="return" class="return unable">

          <span>撤銷悔棋</span>

          </div>

          </div>

          <script type="text/javascript">

          var over = false;

          var me = true; //我

          var _nowi = 0, _nowj = 0; //記錄自己下棋的坐標

          var _compi = 0, _compj = 0; //記錄計算機當前下棋的坐標

          var _myWin = [], _compWin = []; //記錄我,計算機贏的情況

          var backAble = false, returnAble = false;

          var resultTxt = document.getElementById("result-wrap");

          var chressBord = []; //棋盤

          for (var i = 0; i < 15; i++) {

          chressBord[i] = [];

          for (var j = 0; j < 15; j++) {

          chressBord[i][j] = 0;

          }

          }

          //贏法的統計數組

          var myWin = [];

          var computerWin = [];

          //贏法數組

          var wins = [];

          for (var i = 0; i < 15; i++) {

          wins[i] = [];

          for (var j = 0; j < 15; j++) {

          wins[i][j] = [];

          }

          }

          var count = 0; //贏法總數

          //橫線贏法

          for (var i = 0; i < 15; i++) {

          for (var j = 0; j <11; j++) {

          for (var k = 0; k < 5; k++) {

          wins[i][j+k][count] = true;

          }

          count++;

          }

          }

          //豎線贏法

          for (var i = 0; i < 15; i++) {

          for (var j = 0; j <11; j++) {

          for (var k = 0; k < 5; k++) {

          wins[j+k][i][count] = true;

          }

          count++;

          }

          }

          //正斜線贏法

          for (var i = 0; i < 11; i++) {

          for (var j = 0; j <11; j++) {

          for (var k = 0; k < 5; k++) {

          wins[i+k][j+k][count] = true;

          }

          count++;

          }

          }

          //反斜線贏法

          for (var i = 0; i < 11; i++) {

          for (var j = 14; j > 3; j--) {

          for (var k = 0; k < 5; k++) {

          wins[i+k][j-k][count] = true;

          }

          count++;

          }

          }

          // debugger;

          for (var i = 0; i < count; i++) {

          myWin[i] = 0;

          _myWin[i] = 0;

          computerWin[i] = 0;

          _compWin[i] = 0;

          }

          var chess = document.getElementById("chess");

          var context = chess.getContext('2d');

          context.strokeStyle = '#bfbfbf'; //邊框顏色

          var backbtn = document.getElementById("goback");

          var returnbtn = document.getElementById("return");

          window.onload = function() {

          drawChessBoard(); // 畫棋盤

          }

          document.getElementById("restart").onclick = function(){

          window.location.reload();

          }

          // 我,下棋

          chess.onclick = function(e){

          if(over){

          return;

          }

          if(!me){

          return;

          }

          // 悔棋功能可用

          backbtn.className = backbtn.className.replace(new

          RegExp("(\s|^)unable(\s|$)")," ");

          var x = e.offsetX;

          var y = e.offsetY;

          var i = Math.floor(x / 30);

          var j = Math.floor(y / 30);

          _nowi = i;

          _nowj = j;

          if(chressBord[i][j] == 0){

          oneStep(i,j,me);

          chressBord[i][j] = 1; //我,已占位置

          for (var k = 0; k < count; k++) { // 將可能贏的情況都加1

          if(wins[i][j][k]){

          // debugger;

          myWin[k]++;

          _compWin[k] = computerWin[k];

          computerWin[k] = 6; //這個位置對方不可能贏了

          if(myWin[k] == 5){

          // window.alert('你贏了');

          resultTxt.innerHTML = '恭喜,你贏了!';

          over = true;

          }

          }

          }

          if(!over){

          me = !me;

          computerAI();

          }

          }

          }

          // 悔棋

          backbtn.onclick = function(e){

          if(!backAble) { return;}

          over = false;

          me = true;

          // resultTxt.innerHTML = 'o(╯□╰)o,悔棋中';

          // 撤銷悔棋功能可用

          returnbtn.className = returnbtn.className.replace( new

          RegExp("(\s|^)unable(\s|$)")," ");

          // 我,悔

          chressBord[_nowi][_nowj] = 0; //我,已占位置 還原

          minusStep(_nowi, _nowj); //銷毀棋子

          for (var k = 0; k < count; k++) { // 將可能贏的情況都減1

          if(wins[_nowi][_nowj][k]){

          myWin[k]--;

          computerWin[k] = _compWin[k]; //這個位置對方可能贏

          }

          }

          // 計算機相應的悔棋

          chressBord[_compi][_compj] = 0; //計算機,已占位置 還原

          minusStep(_compi, _compj);//銷毀棋子

          for (var k = 0; k < count; k++) {// 將可能贏的情況都減1

          if(wins[_compi][_compj][k]){

          computerWin[k]--;

          myWin[k] = _myWin[i];//這個位置對方可能贏

          }

          }

          resultTxt.innerHTML = '--益智五子棋--';

          returnAble = true;

          backAble = false;

          }

          // 撤銷悔棋

          returnbtn.onclick = function(e){

          if(!returnAble){ return;}

          // 我,撤銷悔棋

          chressBord[_nowi][_nowj] = 1;//我,已占位置

          oneStep(_nowi,_nowj,me);

          for (var k = 0; k < count; k++) {

          if(wins[_nowi][_nowj][k]){

          myWin[k]++;

          _compWin[k] = computerWin[k];

          computerWin[k] = 6;//這個位置對方不可能贏

          }

          if(myWin[k] == 5){

          resultTxt.innerHTML = '恭喜,你贏了!';

          over = true;

          }

          }

          // 計算機撤銷相應的悔棋

          chressBord[_compi][_compj] = 2;//計算機,已占位置

          oneStep(_compi,_compj,false);

          for (var k = 0; k < count; k++) {// 將可能贏的情況都減1

          if(wins[_compi][_compj][k]){

          computerWin[k]++;

          _myWin[k] = myWin[k];

          myWin[k] = 6;//這個位置對方不可能贏

          }

          if(computerWin[k] == 5){

          resultTxt.innerHTML = 'o(╯□╰)o,計算機贏了,繼續加油哦!';

          over = true;

          }

          }

          returnbtn.className += '' + 'unable';

          returnAble = false;

          backAble = true;

          }

          // 計算機下棋

          var computerAI = function(){

          var myScore = [];

          var computerScore = [];

          var max = 0;

          var u =0, v = 0;

          for (var i = 0; i < 15; i++) {

          myScore[i] = [];

          computerScore[i] = [];

          for (var j = 0; j < 15; j++) {

          myScore[i][j] = 0;

          computerScore[i][j] = 0;

          }

          }

          for (var i = 0; i < 15; i++) {

          for (var j = 0; j < 15; j++) {

          if(chressBord[i][j] == 0){

          for (var k = 0; k < count; k++) {

          if(wins[i][j][k]){

          if(myWin[k] == 1){

          myScore[i][j] += 200;

          }else if(myWin[k] == 2){

          myScore[i][j] += 400;

          }

          else if(myWin[k] == 3){

          myScore[i][j] += 2000;

          }

          else if(myWin[k] == 4){

          myScore[i][j] += 10000;

          }

          if(computerWin[k] == 1){

          computerScore[i][j] += 220;

          }else if(computerWin[k] == 2){

          computerScore[i][j] += 420;

          }

          else if(computerWin[k] == 3){

          computerScore[i][j] += 2100;

          }

          else if(computerWin[k] == 4){

          computerScore[i][j] += 20000;

          }

          }

          }

          if(myScore[i][j] > max){

          max = myScore[i][j];

          u = i;

          v = j;

          }else if(myScore[i][j] == max){

          if(computerScore[i][j]>computerScore[u][v]){

          u = i;

          v = j;

          }

          }

          if(computerScore[i][j] > max){

          max = computerScore[i][j];

          u = i;

          v = j;

          }else if(computerScore[i][j] == max){

          if(myScore[i][j]>myScore[u][v]){

          u = i;

          v = j;

          }

          }

          }

          }

          }

          _compi = u;

          _compj = v;

          oneStep(u,v,false);chressBord[u][v] = 2; //計算機占據位置

          for (var k = 0; k < count; k++) {

          if(wins[u][v][k]){

          computerWin[k]++;

          _myWin[k] = myWin[k];

          myWin[k] = 6; //這個位置對方不可能贏了

          if(computerWin[k] == 5){

          resultTxt.innerHTML = 'o(╯□╰)o,計算機贏了,繼續加油哦!';

          over = true;

          }

          }

          }

          if(!over){

          me = !me;

          }

          backAble = true;

          returnAble = false;

          var hasClass = new RegExp('unable').test('' +

          returnbtn.className + '');

          if(hasClass) {

          returnbtn.className += '' + 'unable';

          }

          }

          //繪畫棋盤

          var drawChessBoard = function(){

          for (var i = 0; i < 15; i++) {

          context.moveTo(15 + i * 30 , 15);

          context.lineTo(15 + i * 30 , 435);

          context.stroke();

          context.moveTo(15 , 15 + i * 30);

          context.lineTo(435 , 15 + i * 30);

          context.stroke();

          }

          }

          //畫棋子

          var oneStep = function(i,j,me) {

          context.beginPath();

          context.arc(15 +i * 30, 15 + j * 30, 13, 0, 2 * Math.PI);// 畫圓

          context.closePath();

          //漸變

          var gradient = context.createRadialGradient(15 + i * 30

          + 2, 15 + j * 30 - 2, 13, 15 + i * 30 + 2, 15 + j * 30 -

          2, 0);

          if(me){

          gradient.addColorStop(0,'#0a0a0a');

          gradient.addColorStop(1,'#636766');

          }else{

          gradient.addColorStop(0,'#d1d1d1');

          gradient.addColorStop(1,'#f9f9f9')

          }

          context.fillStyle = gradient;

          context.fill();

          }

          //銷毀棋子

          var minusStep = function(i,j){

          //擦除該圓

          context.clearRect((i) * 30, (j) * 30, 30, 30);

          // 重畫該圓周圍的格子

          context.beginPath();

          context.moveTo(15+i*30, j*30);

          context.lineTo(15+i*30, j*30 + 30);

          context.moveTo(i*30, j*30+15);

          context.lineTo((i+1)*30, j*30+15);

          context.stroke();

          }

          </script>

          </body>

          </html>

          以上就是JS五子棋游戲的代碼,如果有什么問題可以留言給小猿圈web前端講師,遇到的問題可以直接私聊或者提問,看到會盡快幫大家解決的。

          要: 相信很多朋友都會玩國際象棋,那么有嘗試過構建一個國際象棋引擎嗎,一起來玩玩看吧!


          來源:Pexels


          我不擅長國際象棋。

          我父親在我年幼的時候教過我,但我猜他是那些一直讓他們的孩子獲勝的爸爸之一。為了彌補世界上最受歡迎的游戲之一的技能的缺乏,我做了任何數據科學愛好者會做的事情:建立一個人工智能來擊敗我無法擊敗的人。遺憾的是,它不如AlphaZero(甚至普通玩家)好。但我想看看國際象棋引擎在沒有強化學習的情況下如何做,以及學習如何將深度學習模型部署到網絡上。

          比賽在這里!

          獲取數據

          FICS擁有一個包含3億場比賽,個人走法,結果以及所涉玩家評級的數據庫。我下載了所有在2012年的比賽,其中至少有一名玩家超過2000 ELO。這總計約97000場比賽,有730萬個走子。勝利分配是:43000次白方勝利,40000次黑方勝利和14000次平局。

          極小極大算法

          了解如何做一個深度學習象棋AI,我必須首先了解傳統象棋AI程序。來自于極小極大算法。Minimax是“最小化最大損失”的縮寫,是博弈論中決定零和博弈應如何進行的概念。

          Minimax通常用于兩個玩家,其中一個玩家是最大化者,另一個玩家是最小化者。機器人或使用此算法獲勝的人假設他們是最大化者,而對手是最小化者。該算法還要求有一個棋盤評估函數,來衡量誰贏誰輸。該數字介于-∞和∞之間。最大化者希望最大化此值,而最小化者希望最小化此值。這意味著當你,最大化者,有兩個走法可以選擇的時候,你將選擇一個給你更高評估的那個,而最小化者將做相反的選擇。這個游戲假設兩個玩家都發揮最佳狀態并且沒有人犯任何錯誤。


          來源:GlobalSoftwareSupport


          以上面的GIF為例。你,最大化者(圓圈)有三個你可以選擇的走法(從頂部開始)。你直接選擇的走法取決于你的對手(方塊)在走子后將選擇的走法。但是你的對手直接選擇的走法取決于你走子后選擇的走法,依此類推,直到游戲結束。玩到游戲結束會占用大量的計算資源和時間,所以在上面的例子中,選擇一個深度,2。如果最小化者(最左邊的方塊)選擇左移,你有1和-1可供選擇。你選擇1,因為它會給你最高分。如果最小化者選擇正確的走法,則選擇0,因為它更高。現在是最小化者的回合,他們選擇0因為這更低。這個游戲繼續進行,一直進行到所有的走子都完成或你的思維時間耗盡。對于我的國際象棋引擎來說,假設白方是最大化者,而黑方是最小化者。如果引擎是白方,則算法決定哪個分支將給出最高的最低分數,假設人們在每次走子時選擇最低分數,反之亦然。為了獲得更好的性能,該算法還可以與另一種算法結合使用:alpha-beta剪枝。 Alpha-beta剪枝截止系統適用于決定是否應該搜索下一個分支。

          深度學習架構

          我的研究始于Erik Bernhardsson關于國際象棋深度學習的優秀文章。他講述了他如何采用傳統方法制作AI下棋并將其轉換為使用神經網絡作為引擎。

          第一步是將棋盤轉換為輸入層的數字形式。我借用了Erik Bernhardsson的編碼策略,其中棋盤是一個熱編碼,每一個方塊中都有一個棋子。這總計為768個元素數組(8 x 8 x 12,因為有12種棋子)。



          Bernhardsson選擇將輸出圖層設為1表示白方勝利,-1表示黑方勝利,0表示平局。他認為游戲中的每個板位置都與結果有關。如果黑方贏了,每個棋的位置都被訓練成“支持黑方”,如果白方贏了,則“支持白方棋”。這允許網絡返回介于-1和1之間的值,這將告訴你該位置是否更有可能導致白贏或黑贏。

          我想用稍微不同的評估函數來解決這個問題。網絡是否能夠看到不是白方還是黑方獲勝,而是能夠看到哪個走子將導致勝利?首先,我嘗試將768元素的棋盤表示放入輸出,其中一個位置是輸入,下一個位置是輸出。當然,這沒有用,因為這把它變成了一個多分類問題。這導致引擎適當地選擇合法走子時出現太多的錯誤,因為輸出層中的所有768個元素可以是1或0。因此,我查閱了Barak Oshri和Nishith Khandwala的斯坦福大學論文《利用卷積神經網絡預測國際象棋中的運動》,了解他們如何解決這個問題。他們訓練了7個神經網絡,其中1個網絡是棋子選擇器網絡。這個網絡決定哪一個方格最有可能被移動。其他六個網絡專門針對每一個棋子類型,并決定將一個特定的棋子移動到哪里。如果棋子選擇器選擇了一個帶有兵的方格,那么只有棋子神經網絡會響應最有可能移動到的方格。

          我從他們的想法中借鑒了兩個卷積神經網絡。第一個,從網絡移動,將被訓練成采用768元素數組表示并輸出專業棋手移動的方格(在方塊0和方塊63之間)。 第二個網絡:移動到網絡,將做同樣的事情,除了輸出層將是專業棋手移動到的地方。我沒有考慮誰贏了,因為我認為訓練數據中的所有移動都是相對最優的,無論最終結果如何。

          我選擇的架構是兩個128卷積層,帶有2x2濾波器,后面是兩個1024神經元完全連接層。我沒有應用任何池,因為池提供位置不變性。圖片左上角的貓就像圖片右下角的貓一樣。然而,對于國際象棋,,棋子國王的值是完全不同于車兵。隱藏圖層的激活功能是RELU,而我將softmax應用到最后一層,因此我基本上得到一個概率分布,其中所有方格的概率總和加起來達到100%。



          我的訓練數據是訓練集的600萬個位置,其余130萬個位置用于驗證集。在訓練結束時,我從網絡上獲得了34.8%的驗證準確率,并且在轉移到網絡時獲得了27.7%的驗證準確率。這并不意味著70%的時間它沒有學習合法的走子,這只意味著AI沒有像驗證數據中的專業玩家那樣做出相同的舉動。相比之下,Oshri和Khandwala的網絡平均驗證準確率為37%。

          將深度學習與Minimax結合起來

          因為現在這是一個分類問題,其中輸出可以是64個類之一,這就留下了很大的錯誤空間。關于訓練數據(來自高級別玩家的比賽)的一個警告是,優秀的棋手很少會玩到“將軍”。他們知道什么時候輸了,通常沒有必要跟進整場比賽。這種缺乏平衡的數據使得網絡在最終游戲結束時非常混亂。它會選擇車來移動,并試圖沿對角線移動。如果失敗,網絡甚至會試圖指揮對手的棋子(厚顏無恥!)。

          為了解決這個問題,我命令輸出的概率。然后,我使用python-chess庫獲取給定位置的所有合法走子的列表,并選擇具有最高結果概率的合法走子。最后,我應用了一個帶有懲罰的預測分數方程式,用于選擇較不可能的走子:400(選擇的走子指數之和)。名單上的合法走子越遠,其預測得分就越低。例如,如果從網絡移動的第一個索引(索引0)與移動到網絡的第一個索引相結合是合法的,那么預測分數是400(0 + 0),這是最高可能分數:400。



          在與材料分數結合使用數字后,我選擇了400作為最大預測分數。材料分數是一個數字,可以判斷所做的走子是否會捕獲一個棋子。根據捕獲的棋子,走子的整體得分將得到提升。我選擇的材料價值如下:

          兵:10,馬:500,象:500,車:900,后:5000,王:50000。

          這特別有助于殘局。在將殺走子將是第二個最可能的合法行動且預測得分較低的情況下,國王的物質價值將超過它。兵的分數如此之低,因為網絡在早期比賽中考慮得足夠充分,所以如果它是戰略舉措,它將會采用兵。

          然后我將這些分數結合起來,以返回給定任何潛在走子的棋盤的評估。我通過深度為3的minimax算法(使用alpha-beta修剪)提供了這個,并得到了一個可以將殺的可運行國際象棋引擎!

          使用Flask和Heroku進行部署

          我在Youtube上使用了Bluefever Software的指南,展示了如何通過向flask服務器發出AJAX請求來制作javascript國際象棋UI并通過它來路由我的引擎。 我使用Heroku將python腳本部署到Web并將其連接到我的自定義域:Sayonb.com。

          結論

          雖然引擎的性能沒有我希望的那么好,但是我學到了很多關于AI的基礎知識,將機器學習模型部署到web上,以及為什么AlphaZero不使用卷積神經網絡來玩游戲!

          可以通過以下方式進行改進:

          1.通過使用bigram模型LSTM將從網絡移動和移動到網絡中的時間序列組合在一起。 這可能有助于將移出和移動到決策中,因為每個目前都是獨立接近的。

          2.通過添加奪取的棋子的位置來改進棋子的賦值(奪取棋盤中心的兵比它在邊緣時奪取更有利)。

          3.在使用神經網絡預測分數和子力分值之間切換,而不是在每個節點使用兩者。這可以允許更高的極小極大算法搜索深度。

          4.考慮邊緣情況,例如:減少孤立自己的兵的可能性,增加馬靠近棋盤中心的可能性。

          查看代碼,或者在GitHub repo用自己的訓練數據自己訓練一個新網絡!

          阿里云云棲社區組織翻譯。

          文章原標題《Predicting Professional Players’ Chess Moves with Deep Learning》

          作者:Sayon Bhattacharjee

          譯者:Viola,審校:。


          主站蜘蛛池模板: 日韩精品一区二区三区在线观看l| 日韩AV无码一区二区三区不卡| 一区二区三区无码高清| 国产精品高清一区二区三区| 久久亚洲中文字幕精品一区| 无码国产亚洲日韩国精品视频一区二区三区| 久久久国产精品亚洲一区 | 无码人妻精品一区二区三区蜜桃 | 一区二区三区免费在线观看| 一区在线观看视频| 日本内射精品一区二区视频| 日韩内射美女人妻一区二区三区| 日韩精品无码一区二区视频| 蜜臀AV一区二区| 国产日产久久高清欧美一区| 一区二区三区在线观看| 精品少妇一区二区三区视频| 久久久综合亚洲色一区二区三区 | 日韩人妻精品一区二区三区视频| 精品欧洲av无码一区二区三区| 日本一区二区在线| 福利片福利一区二区三区| 亚洲日韩精品无码一区二区三区| 久久一区二区明星换脸| 久久精品国产一区二区三区| 在线观看中文字幕一区| 亚洲国产AV无码一区二区三区| 国产精品高清一区二区三区| av无码一区二区三区| 香蕉一区二区三区观| 久久影院亚洲一区| 免费视频精品一区二区三区| 亚洲AV美女一区二区三区| 免费看无码自慰一区二区 | 亚洲欧美日韩一区二区三区| 精品人妻一区二区三区毛片 | 亚洲av无码一区二区三区天堂古代| 国产精品亚洲一区二区三区在线观看 | 一区二区视频在线免费观看| 国产精品美女一区二区视频| 亚洲一区精品视频在线|