PGR21.com
- PGR21 관련된 질문 및 건의는 [건의 게시판]을 이용바랍니다.
- (2013년 3월 이전) 오래된 질문글은 [이전 질문 게시판]에 있습니다.
통합 규정을 준수해 주십시오. (2015.12.25.)
Date 2015/10/27 03:59:51
Name OrBef
File #1 java.tif (106.6 KB), Download : 16
Subject [질문] 자바 스크립트 / genetic algorithm 관련 질문입니다.


중학생 대상으로 아주 간단한 genetic algorithm 을 보여줄 일이 생겼습니다. genetic algorithm 자체야 뭐 간단한 개념이니까 설명하는 데 애로사항이 없는데, 예를 하나 보여주는 게 쉽지 않네요. 아이들이 사용하는 랭귀지가 자바 스크립트인데, 제가 C++ 을 마지막으로 프로그래밍에서 손 뗀 사람이라서 그렇습니다.

genetic algorithm 라이브러리를 쓰지 않고 아주 간단한 알고리즘을 직접 코딩해서 보여주고 싶은데, 이걸 대충 세 시간 정도에 마쳐야 합니다. 즉, 제가 미리 코드는 다 짜놓고, 그걸 브라우저에 부분 부분 추가하면서 어떤 식으로 시스템이 동작하는지 보여줘야 하는 거죠. 해서 어려운 예는 쓸 수 없고, 이미지에 첨부된 대로 하얀 공이 사다리 (수평선들) 를 점프해서 올라가는 예를 보여주려고 합니다. 사다리를 올라가려면 적당한 속도로 점프를 해야 하고, 그 점프를 위한 에너지를 충전해야 하는 상황입니다. 그럴 때 최적 속도를 '진화를 거쳐서' 산출하게 만들려고 합니다. (에너지 충전을 비효율 적으로 만들어서, 계단 하나를 올라가기 위한 최저속도로 점프하는 것이 최적값이도록 세팅해놓고, 과연 그 값을 찾을 수 있는지 보여주려고 합니다)

자, 여기서 질문입니다. 진화를 통해 최적 속도를 산출하는 알고리즘은 오히려 쉽게 만들 수 있겠는데, 최적 및 비최적 속도를 지닌 공들이 점프 경주를 하는 그래픽을 구현할 수가 없네요. 공 하나는 점프를 시킬 수가 있는데, 여러개를 정의하려면 어떻게 해야하는 지 전혀 모르겠어요. (참고로 저는 자바를 공부한 지 10시간이 되지 않습니다. 따라서 모르긴 해도 분명히 객체 지향 관련한 커맨드가 있을 것이고, 그걸 이용한 구현이 쉬울 것 같긴 합니다.)

현재까지 제가 짠 코드는 다음과 같고, 중간에 질문들을 넣었습니다.

[우선 제일 중요한 질문은, 아래와 같은 점퍼 그래픽을 '여러개의 객체가 동시에 뛰도록' 하려면 어떤 명령어를 써야하는 지 모르겠습니다. 상세 코드까지는 도와주실 시간이 안되시더라도 어떤 명령어를 알아봐야하는 지 팁을 주시면 감사하겠습니다 흑흑]

var jumperHeight=0; // 현재 점퍼의 높이
var standardVelocity = 2.5; // 점퍼가 선택한 점프 속도
var initialVelocity=standardVelocity; // 뭔가 standardvelocity 말고 막 쓰기 위해 굳이 추가로 정의한 점프 속도
var stepSize = 25; // 사다리 높이
var currentStep = 0; // 점퍼가 현재까지 돌파한 사다리 갯수
var EnergyNeeded = (standardVelocity^2 * 15); // 점프하기 위해 충전해야하는 에너지
var jumperEnergy = 0; // 현재 충전한 에너지

var draw = function() {
    background(184, 236, 255);
    
    line(0,300,400,300); // 사다리를 배열하는 커맨드를 몰라서 그냥 무자비하게 반복
    line(0,300-stepSize,400,300-stepSize);
    line(0,300-2*stepSize,400,300-2*stepSize);
    line(0,300-3*stepSize,400,300-3*stepSize);
    line(0,300-4*stepSize,400,300-4*stepSize);
    line(0,300-5*stepSize,400,300-5*stepSize);
    line(0,300-6*stepSize,400,300-6*stepSize);
    line(0,300-7*stepSize,400,300-7*stepSize);
    line(0,300-8*stepSize,400,300-8*stepSize);
    line(0,300-9*stepSize,400,300-9*stepSize);
    line(0,300-10*stepSize,400,300-10*stepSize);
    line(0,300-11*stepSize,400,300-11*stepSize);
    
    if (jumperEnergy >= EnergyNeeded) // 충전이 완료되었으면 점프
    {
        jumperHeight+=initialVelocity; // 루프 한 바퀴를 돌 때마다 점퍼 높이가 현재 속도에 비례해서 증가 혹은 감소
        initialVelocity-=0.1; // 루프 한 바퀴를 돌 때마다 점퍼 감속 [루프 한 바퀴라는 것이 시스템마다 실제 시간이 다르기 때문에 이 부분을 뭔가 물리적으로 더 직관적이도록 바꾸고 싶은데 어떻게 해야할 지 잘 모르겠습니다]
        ellipse(200,300-jumperHeight,10,10); // 점퍼 그리기
    
        if ((jumperHeight-currentStep*stepSize) >= stepSize) // 만약 점퍼가 상승중 특정 사다리를 넘어섰으면 그 아래로 떨어지지 않도록 기록
        {
            currentStep +=1;
        }
    
        if (jumperHeight <= currentStep*stepSize) // 점퍼가 하강중 사다리를 만나면 거기서부터 다시 에너지 충전하면서 점프 시도
        {
            initialVelocity = standardVelocity;
            jumperEnergy = 0;
        }
    }
    
    else
    {
        ellipse(200,300-jumperHeight,10,10); // 에너지가 모자라면 가만히 대기
        jumperEnergy +=1; // 대기하면서 루프 한 바퀴마다 조금씩 에너지 충전 [여기서도 루프 한 바퀴마다 조금씩이라는 말 자체가 매우 불분명하고, 시스템마다 구현 속도가 다를 것 같아요. 아마 setTimer 인가? 하는 명령을 쓰는 것이 나을 것 같은데, 정확히 어떻게 해야할 지 잘 모르겠습니다.
    }
};


통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
랜덤여신
15/10/27 05:03
수정 아이콘
1. 무언가 라이브러리를 쓰고 계신 것 같은데... 잘은 모르겠지만 draw()가 주기적으로 호출되는 구조인 것 같군요. 지금은 어떻게 호출하고 계신가요? setTimeout이나 setInterval이 아니라 자동으로 되고 있나요? 그렇다면 얼마나 자주 draw()를 호출할지가 웹 사이트에 적혀 있을 것입니다. 그것을 단위 시간으로 잡아야 할 것입니다.

2. 사다리 그리는 부분은 다음과 같이 리팩터할 수 있습니다:

for (var i=0;i<12;i++)
line(0, 300-stepSize*i, 400, 300-stepSize*i);

3. 공마다 보존되어야 하는 상태가 jumperHeight이므로 이걸 공의 수만큼 만들어야 할 것입니다. jumperHeight1, jumperHeight2, jumperHeight3, ..., jumperHeightN 이렇게 만드는 건 비효율적이므로 배열을 사용하는 게 좋습니다. 예를 들어 다음과 같이 만듭니다:

var numberOfBalls = 10;

var jumperHeight = [];
for (var i=0;i< numberOfBalls;i++)
jumperHeight[i] = 0;

만일 jumperEnergy 같은 것도 공마다 따로 상태가 있어야 한다면 이것도 복제해야 하겠죠.

4. 유전 알고리즘이라면 무작위 요소가 필요할 것 같은데... 지금 저대로 짜면 모든 공이 똑같이 움직일 것입니다. 자바스크립트에서 무작위 요소는 Math.random() 으로 구현할 수 있습니다. 0 이상 1 미만의 임의의 '실수'를 반환합니다. 여기에 적당한 수를 곱하고 더해서 씁니다. 예를 들어,

parseInt(Math.random() * 10) + 1

하면 1에서 10까지의 '정수'가 나올 것입니다.
15/10/27 05:13
수정 아이콘
오오오오 2,3,4 번 관련해서는 완전 제가 바라던 꿈의 답변입니다!!! 감사합니다 ㅠ.ㅠ;;;

1번 관련해서는 제가 라이브러리를 쓰고 있는 줄도 몰랐습니다. 자바 스크립트 독학용 사이트가 하나 있는데, (khan academy 라고...) 거기서는 그냥 저렇게 코드를 써놓으면 자동으로 돌아가거든요. 저게 기본형인 줄 알았는데 그게 아니라 히든 코드가 깔려있는 거였군요. 말씀하신대로 커맨드를 조금 알아보겠습니다.

하여튼, 진짜 감사합니다 랜덤여신님 완전 사랑해요.
랜덤여신
15/10/27 05:17
수정 아이콘
칸 아카데미에 그런 기능이 있었군요.

설명서를 보니, 1초에 30번씩 draw 함수가 자동으로 호출된다고 합니다. 이 수치는 frameRate() 함수로 바꿀 수 있다고 합니다. 예를 들어, frameRate(20) 이라고 쓰면 1초 / 20회 = 50밀리초마다 draw가 호출되겠죠. 그러므로 따로 setTimeout이나 setInterval을 쓸 필요는 없어 보입니다.

https://www.khanacademy.org/computer-programming/draw/5192527846309888
https://www.khanacademy.org/computer-programming/frameratefps/6427359154536448
15/10/27 05:20
수정 아이콘
어억 감사감사합니다 !!!!

랜덤여신님 혹시 나이 적절한 따님 있으시면 저랑 사돈 좀 굽신굽신
랜덤여신
15/10/27 05:30
수정 아이콘
그러려면 일단 결혼부터 해야겠군요... 아니, 애인부터 만들어야... 다이아 찍기보다 어려워 보이는군요. ㅠㅠ

칸 아카데미를 보니 위에서 말씀드린 Math.random(), parseInt() 같은 표준 함수들이 없는 것 같습니다. random(), round() 라는 자체 함수가 따로 있어서 그걸 쓰셔야 할 것 같군요. 어차피 유전 알고리즘을 설명하는 것이 주 목적이므로 칸 아카데미에서만 쓴다면 별 지장은 없어 보이지만요. 다만 수업의 목표에 따라서는 표준 자바스크립트에서는 돌아가지 않는 코드라는 것을 학생들에게 미리 알려주셔야 할 것 같습니다.

표준 함수보다 약간 더 쓰기 편하게 디자인되어 있는 면도 있습니다. 예를 들어 표준 Math.random()은 언제나 0에서 1까지의 실수만 반환하는데, 칸 아카데미의 random()은 random(10, 20) 식으로 인자를 줄 수가 있고, 그러면 10에서 20 사이의 실수를 반환하는군요.

그밖에 println() 이라는 함수가 디버깅하는 데 유용해 보입니다.

https://www.khanacademy.org/computer-programming/randomlow-high/827911487
https://www.khanacademy.org/computer-programming/roundnum/5907281296228352
15/10/27 05:34
수정 아이콘
그렇군요. 이거 확실하게 가르쳐주지 않으면 아이들이 나중에 뭥미? 하겠네요. 팁 감사드립니다 :)
Andromath
15/10/27 05:15
수정 아이콘
jumperHeight이랑 jumperEnergy를 array로 놓고 draw function에서 if-else를 for loop으로 묶어버리면 어떨까요.
그리고 말씀하신대로 setTimeOut을 각 for loop 끝날 때마다 놓아서 delay 주는 방법이 가장 간편해 보입니다.
그럼 각 object 별로 dynamic하게 움직이는 것처럼 보일 수 있을 것 같습니다.
15/10/27 05:20
수정 아이콘
아하 그렇게 해서 각자 따로 호출하는 방법도 있겠네요!!!
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
75983 [질문] 웹커뮤니티 제작에 관해서 질문드려봅니다. [18] 양주오1664 16/01/11 1664
75979 [질문] 안드로이드 개발 시작하는 초심자 도와주세요. [6] 신예terran2074 16/01/11 2074
75897 [질문] 웹 서버 구축에 관한 전반적인 질문드립니다. [7] 양주오1675 16/01/09 1675
75717 [질문] cpu만 바꾸고 싶습니다 [7] 마마무1694 16/01/07 1694
74937 [질문] 안드로이드 문법(?) 질문입니다. [5] 트루키3068 15/12/25 3068
73487 [질문] 대략 이런 논쟁이 있었습니다. [62] 대장님너무과민하시네요4886 15/12/03 4886
73316 [질문] C++ 결과값 저장 질문입니다. [20] 비상6045 15/11/30 6045
71806 [질문] 코딩용으로 청축 vs갈축 어떤게 좋나요, [4] 삭제됨3162 15/11/07 3162
71439 [질문] C 언어 프로그래밍 질문입니다.. [8] 용유진3030 15/11/01 3030
71064 [질문] 자바 스크립트 / genetic algorithm 관련 질문입니다. [8] OrBef2570 15/10/27 2570
70079 [질문] 코딩공부라는게 뭘까요? [8] 삭제됨1592 15/10/13 1592
69997 [질문] 프로그래밍에 지식이 있으신 분! 질문하나만 받아주세요 [9] 티타늄2368 15/10/11 2368
68589 [질문] 매트랩 무작위 변수 생성? 시뮬레이션 질문좀 드릴게요. [6] 하디1477 15/09/18 1477
68540 [질문] 안드로이드 / 안드로이드 웨어 독학할만한 서적 추천 부탁드립니다. 이걸어쩌면좋아1196 15/09/17 1196
67849 [질문] JAVA 간단한 질문입니다. [2] Riffrain1076 15/09/06 1076
63119 [질문] jquery 책 추천받습니다. [2] 포도사과2314 15/06/26 2314
62125 [질문] 게임 기획 지망생 노트북 구매 5개 모델 중 추천을 받고싶습니다. [2] 포도1798 15/06/12 1798
59967 [질문] 인상깊었던 영상을 찾습니다. 오큘러스754 15/05/14 754
59822 [질문] 오늘 팝업 광고 노출 문제 격으신분 계신가요? [2] homy2969 15/05/12 2969
58505 [질문] 코딩용 노트북 추천 부탁드립니다. [17] 클로로 루시루플18047 15/04/23 18047
57684 [질문] USB 에 있는 파일을 자동으로 메일로 보내는 프로그램 없을까요? [2] 화이트데이1295 15/04/11 1295
53808 [질문] 코딩 연습 및 실력 늘리는 방법 [4] iPhone62797 15/02/14 2797
53637 [질문] 코딩 배우기 [11] roastedbaby2401 15/02/11 2401
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로