수면의 파문을 셀 오토마톤으로 표현하면 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;
}
};
};
이것은 정확하게는 셀 오토마톤이 아니다(?)・・・
본래라면 수면을 그릴 때는 옆의 수면의 상태를 파악해 영향을 받는다는 것이 깨끗한 셀 오토마톤이라고 생각합니다만, 이번은 셀의 색은 스텝에 따라 처음부터 정해져 있으므로 셀 오토마톤 그렇지 않다고 말할 수 있습니다. 그래서 "바람"이라고 붙이고 있습니다.
사실은 인접한 수면 셀에 벡터를 붙여 수시로 체크하는 & 감쇠하도록 하면 깨끗한 셀 오토마톤의 수면이 생깁니다.
셀 오토마톤은 설계가 열쇠
이번과 같이, 첫 단계에서 이웃끼리의 셀이 영향을 주지 않도록 만들고 있으면 인구지능 같은 것을 만들 수 없게 되어 버립니다.
셀끼리 영향을 주어 움직이도록 설계한다. 이것이 철칙입니다. .
반대로 말하면 「(프로그래밍적으로) 인공 지능이란 무엇인가?」라고 하는 선발이 여기에서 엄연히 있는 것처럼 느꼈습니다. 이것이 있는지 여부의 차이가 크다.
Reference
이 문제에 관하여(수면의 파문을 셀 오토마톤으로 표현하면 AI가 되지 않았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hp0me/items/e36f9a856e6c3b39b957텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)