기본 JavaScript AI 알고리즘
내가 인코딩을 시작했을 때, 인공지능과 기계 학습은 나의 명세서상의 첫 번째였다.지금 내가 직면한 문제는 이 주제를 깊이 연구할 수 있는 자원이 이렇게 많다는 것이다.나의 목표는 매우 명확하다. 나는 자바스크립트로 기계 학습의 기초 지식을 실현하고 싶다. 나는 해냈다.
“Human beings, viewed as behaving systems, are quite simple. The apparent complexity of our behavior over time is largely a reflection of the complexity of the environment in which we find ourselves.”
- 허버트 A 시몬, 《인공과학》
리소스
본고에서 나는 Burak Kanber's article "Machine Learning: Introduction to Genetic Algorithms"와 유사한 것을 간단하게 구축할 것이다
그의 글에서 그는 기본 원리를 잘 설명할 뿐만 아니라 자신의 지식을 자바스크립트 예시에 운용했다.
나는 깨우침을 받았고 놀랐다.
자세한 내용은 방문his homepage
뭐 공부 해요?
우리는 Javascript로 알고리즘을 작성하고 있습니다. 이 알고리즘은 Javascript라는 단어를 복사합니다.
이것은 기본 개념을 이해하는 예이다.알고리즘 자체에 필요한 결과 (입력한 단어) 를 포함하기 때문에 그것은 매우 기본적이고 심지어 인위적이다.
가능한 결과 감소
구축에 필요한 문자열은 많은 가능한 결과가 있습니다.만약 해결 방안이 10자 길이와 같은 일정한 길이가 있다고 가정하면 후보 수를 줄일 것이다.
예:
- JavsScrip!
- Javahztrew
- WerdScript
- JavaScript
길이에 관해서는 모두 해결 방안의 후보 방안일 수 있지만, 분명히 마지막 하나만 옳다.원가 함수
Acost function는 예상 결과와 다른 비용을 최소화하는 데 도움을 줍니다.
인용문:
For each character in the string, figure out the difference in ASCII representation between the candidate character and the target character, and then square it so that the "cost" is always positive.
For example, if we have a capital "A" (ASCII 65) but it's supposed to be a capital "C" (ASCII 67), then our cost for that character is 4 (67 - 65 = 2, and 2^2 = 4).
문자열 복사의 예상 목표를 달성하기 위해서, 우리의 목표는 원가가 0이다.
이 기본 예시에서 알고리즘이 원가가 0이 되면 멈출 수 있다고 안전하게 가정할 수 있다.다른 더 복잡한 문제는 일정 시간 운행하고 그 자체의 최소화 결과를 평가해야 할 수도 있음을 주의하십시오.
비교 결과
다음으로 우리는 합병하고 결과를 비교해야 한다.
예:
- SavaScript
- JavaScripd
두 개로 잘라서 한 줄과 다른 줄을 조합할 수 있습니다. 예를 들면:- SavaScripd
- JavaScript
결과는 현재 정확한 문자열과 부정확한 문자열을 보여 줍니다.후보를 바꾸다
육종을 피하기 위해서는 조합 후 후보를 바꿔야 한다.
예:
- JadaScript
- JadaScript
이런 상황은 완전히 같은 후보이기 때문에 영원히 개선될 결과가 나오지 않을 것이다.우리는 그 중 적어도 하나를 수정해서 진화시켜야 한다.
예를 들어, "JaeaScript"는 지속적인 진화에 적합합니다.
후보 정리
객체에 대한 프로그래밍에서 다음을 계획할 수 있습니다.
저희가 후보반이 하나 있어요.
팀을 구성하다
우리는 팀 규모를 선택하고 내부에서 후보를 진화시킬 것이다.
팀은 반드시 서로 다른 단계를 거쳐야 한다.이 단계에서 우리는
비밀번호
우선, 우리는 문자열을 구조 함수로 하는 클래스를 설정하고, 무작위 문자열을 구축하는 방법을 설정합니다.
var Candidates = function(code) {
if (code) this.code = code;
this.cost = 9999;
};
Candidates.prototype.code = '';
Candidates.prototype.random = function(length) {
while (length--) {
this.code += String.fromCharCode(Math.floor(Math.random() * 255));
}
};
다음은 ASCII 코드 간의 차이를 찾아 제곱할 수 있는 원가 함수를 추가해야 합니다.Candidates.prototype.calcCost = function(compareTo) {
var total = 0;
for (i = 0; i < this.code.length; i++) {
total +=
(this.code.charCodeAt(i) - compareTo.charCodeAt(i)) *
(this.code.charCodeAt(i) - compareTo.charCodeAt(i));
}
this.cost = total;
};
이후에 우리는 합병 함수를 구축했다. 이 함수는 후보 항목을 매개 변수로 하고 중간 항목을 찾아 두 개의 새 하위 항목의 수조로 되돌려준다.Candidates.prototype.combine = function(cand) {
var pivot = Math.round(this.code.length / 2) - 1;
var child1 = this.code.substr(0, pivot) + cand.code.substr(pivot);
var child2 = cand.code.substr(0, pivot) + this.code.substr(pivot);
return [new Candidates(child1), new Candidates(child2)];
};
다음은 문자열의chracter를 바꿔야 합니다.따라서 문자열에서 무작위 위치를 선택하고 문자를 무작위로 1 또는 -1 증가시킵니다.그리고 우리는 새 문자열로 낡은 문자열을 교체했다.Candidates.prototype.mutate = function(chance) {
if (Math.random() > chance) return;
var index = Math.floor(Math.random() * this.code.length);
var upOrDown = Math.random() <= 0.5 ? -1 : 1;
var newChar = String.fromCharCode(this.code.charCodeAt(index) + upOrDown);
var newString = '';
for (i = 0; i < this.code.length; i++) {
if (i == index) newString += newChar;
else newString += this.code[i];
}
this.code = newString;
};
다음으로 우리는 한 조의 후보를 세워야 한다.클래스 구조 함수는 대상 문자열과 그룹의 크기를 매개 변수로 하고 무작위 후보로 채웁니다.var Group = function(goal, size) {
this.members = [];
this.goal = goal;
this.stageNumber = 0;
while (size--) {
var gene = new Candidates();
gene.random(this.goal.length);
this.members.push(gene);
}
};
이후 우리는 원가 점수에 따라 후보자를 정렬해야 한다.Group.prototype.sort = function() {
this.members.sort(function(a, b) {
return a.cost - b.cost;
});
};
그리고 우리는 페이지에 실제 HTML을 구축하기 위해 간단한 디스플레이 함수를 작성해야 한다.기본적으로 우리는 우리가 처한 단계와 팀의 모든 현재 후보를 보여주고 싶다.Group.prototype.display = function() {
document.body.innerHTML = '';
document.body.innerHTML += '<h2>Stage: ' + this.stageNumber + '</h2>';
document.body.innerHTML += '<ul>';
for (var i = 0; i < this.members.length; i++) {
document.body.innerHTML +=
'<li>' + this.members[i].code + ' (' + this.members[i].cost + ')';
}
document.body.innerHTML += '</ul>';
};
다음 단계는 스테이지를 실제로 만드는 것입니다.따라서 우리는 비용을 계산하고 후보자를 정렬하여 결과를 표시하고 최상의 결과를 조합하여 결과를 변이시킨다.그런 다음 반복합니다.구성원 문자열이 우리의 목표와 같을 때, 우리는if문장으로 중단을 설정합니다.Group.prototype.stage = function() {
for (var i = 0; i < this.members.length; i++) {
this.members[i].calcCost(this.goal);
}
this.sort();
this.display();
var children = this.members[0].combine(this.members[1]);
this.members.splice(this.members.length - 2, 2, children[0], children[1]);
for (var i = 0; i < this.members.length; i++) {
this.members[i].mutate(0.5);
this.members[i].calcCost(this.goal);
if (this.members[i].code == this.goal) {
this.sort();
this.display();
return true;
}
}
this.stageNumber++;
var scope = this;
setTimeout(function() {
scope.stage();
}, 20);
};
우리가 해야 할 마지막 일은 필요한 문자열 목표와 그룹의 크기를 매개 변수로 하는 새로운 그룹을 만드는 것이다.그리고 스테이지 함수를 호출하여 계산을 시작합니다.var population = new Group('JavaScript', 25);
population.stage();
요점을 요약하여 다시 말하다.
보시다시피 코드에서 변경을 많이 하지 않았습니다.단지 단도직입적이고 이해할 수 있다고 생각했기 때문이다.전체 알고리즘은 그의 개념을 이해하고 기계 학습의 일부 기초 지식에 좋은 입구를 제공했다.
만약 무슨 문제가 있으면 언제든지 질문하세요!
Codepen에서 결과 보기
유용한 링크 및 학점
Reference
이 문제에 관하여(기본 JavaScript AI 알고리즘), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/createdd/basic-javascript-ai-algorithm-6hd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)