수면의 파문을 셀 오토마톤으로 표현하면 AI가 되지 않았다

이번에는 (유감스럽게도) 나쁜 실천적인 이야기입니다.
셀 오토마톤으로 수면을 표현해 보자! 라고 생각했지만, 도중에 여러가지 잃고 있었습니다. w

셀 오토마톤이란?



좌표를 블록(셀)으로 단락지어 블록의 상태를 파악하면서 움직여 가는 것입니다.
또 후반에 자세히 썼습니다만 이것은 셀끼리가 영향을 주고 있지 않다고 하는 의미로 셀 오토마톤이 아니기 때문에, 「바람」이라고 했습니다.

수면의 파문을 셀 오토마톤풍으로 표현하면...



이번에 만든 것
jsdoit : h tp : // js. t/hp0째_/b1Wl



이미지



각 셀(블록)은 하나씩 인스턴스입니다.
셀에는 상태가 있으며 "발화 상태 = state"와 "현재 단계 = step"이 있습니다. 모든 단계가 끝나면 발화 상태가 재설정됩니다. 그리고는 여기에서 수시로 발화시켜 갑니다.
사실은, 발화하면 옆의 셀을 발화시키도록(듯이) 쓰면 좋았다···반성. .

코드



구현의 상세는 코멘트에

sketch.js
//セルのオブジェクト
var cellObj;

//セルを格納する配列(2次元)
var cells = new Array();

//セルの大きさ
var cellSize = 10;

//一行のセルの数
var cellLineNum = 40;
var band;

var canvasSize = cellSize * cellLineNum + 1;
var hamonStep = 1;
var hamonStepMax = Math.floor(cellLineNum/2);
var fixedUpdateFlg = 0;

function setup() {
  createCanvas(canvasSize,canvasSize);
  smooth();

  //2次元配列でセルを格納する
  for(var x = 0; x < cellLineNum; x++){
    cells[x] = new Array();
    for(var y = 0; y < cellLineNum; y++){
      cellObj = new CellClass(cellSize * x,cellSize * y);
      cells[x].push(cellObj);
    }
  }
}

function draw() {
//アップデートを3フレに一回に絞る
if(fixedUpdateFlg == 3){

  background(255);

  //波紋のステップ
  band = hamonStep * 2 - 1;
  for(var x = 0; x<band;x++){
    for(var y = 0; y<band;y++){
      if(x == (band-1) || y == (band-1)){
        cells[x][y].state = 1;
        cells[x+1][y+1].state = 1;
        cells[x][y+1].state = 1;
        cells[x+1][y].state = 1;
      }
    }
  }

  //波紋ステップが最後までいったらやり直す
  if(hamonStep == hamonStepMax)hamonStep = 0;
  hamonStep++;


  //描画
  for(var x = 0; x<cells.length;x++){
    for(var y = 0; y<cells.length;y++){
      cells[x][y].draw();
    }
  }

  fixedUpdateFlg = 0;
}
fixedUpdateFlg ++;
}

function mousePressed() {

}


//セルのクラス
var CellClass = function(x,y){

  this.pos = createVector(x,y);
  this.step = 0;
  //this.colors = [0,50,100,255,100,50,0];
  //this.colors = [255,200,150,100,50,0,50,100,150,100,50,100,150,200,255];

  //波紋の色調整
  this.colors = [255,225,200,175,150,125,100,75,50,25,0,25,50,75,100,125,150,125,100,25,50,75,100,125,150,175,200,225,255];

  //ステート駆動
  this.state = 0; //1で動く


  //ステップが終了したらステートをゼロに戻す
  this.draw = function(){
    if(this.state == 0)return;

    this.step++;
    fill(this.colors[this.step]);
    stroke(1);
    rect(this.pos.x,this.pos.y,cellSize,cellSize);

    if(this.step == (this.colors.length-1)){
      this.step = 0;
      this.state = 0;
    }
  };
};


이것은 정확하게는 셀 오토마톤이 아니다(?)・・・



본래라면 수면을 그릴 때는 옆의 수면의 상태를 파악해 영향을 받는다는 것이 깨끗한 셀 오토마톤이라고 생각합니다만, 이번은 셀의 색은 스텝에 따라 처음부터 정해져 있으므로 셀 오토마톤 그렇지 않다고 말할 수 있습니다. 그래서 "바람"이라고 붙이고 있습니다.

사실은 인접한 수면 셀에 벡터를 붙여 수시로 체크하는 & 감쇠하도록 하면 깨끗한 셀 오토마톤의 수면이 생깁니다.

셀 오토마톤은 설계가 열쇠



이번과 같이, 첫 단계에서 이웃끼리의 셀이 영향을 주지 않도록 만들고 있으면 인구지능 같은 것을 만들 수 없게 되어 버립니다.
셀끼리 영향을 주어 움직이도록 설계한다. 이것이 철칙입니다. .

반대로 말하면 「(프로그래밍적으로) 인공 지능이란 무엇인가?」라고 하는 선발이 여기에서 엄연히 있는 것처럼 느꼈습니다. 이것이 있는지 여부의 차이가 크다.

좋은 웹페이지 즐겨찾기