전체 글 30

Rainbow DQN 강화학습 알고리즘 적용하기

이전 글 : OpenCV image를 grid-based tiles로 변환하기 https://minseob.tistory.com/12 고등학생들이 공부하고 연구한 내용을 개인적으로 블로그에 정리한 글이다. 전문적이지 않으며 틀린 내용이 있을 수 있음을 미리 밝힌다. 강화학습이란 특정 환경에서 정의된 에이전트가 순차적 의사결정 문제에서 부여되는 누적 보상을 최대화하기 위해 시행착오를 통해 행동을 교정하여 학습하는 머신러닝의 한 분야입니다. 따라서 강화학습의 목적은 에이전트가 누적 보상이 최대화되는 행동을 선택하는 것입니다. MDP란 아래 그림과 같은 그래프를 의미하고 상태, 행동, 전이 확률, 보상 함수, 감가율을 매개변수로 가집니다. MDP는 순차적 의사결정 문제의 하나로서 마르코프 성질을 가집니다. M..

정보/R&E 2022.03.25

벤포드의 법칙(Benford's Law)

벤포드의 법칙은 우리 주변에 존재하는 수들에 관한 법칙이다. 임의의 자연수와는 달리 단위가 존재하는 인간이 인위적으로 생산한 수들을 모아 보면 맨 앞자리 수가 1인 것이 다른 것 보다 많다. 벤포드의 법칙은 이러한 수들의 맨 앞자리 수의 확률 분포가 다음과 같다는 것이다. $P(d)=log_{10}(1+\frac{1}{d})$ (단, $d \in \{1,\ 2,\dotsc \ ,\ 9\}$이다.) 이를 이해하려면 수학Ⅰ에 나오는 상용로그의 성질을 알고 있어야 한다. 1보다 큰 $A$에 대하여 $logA$의 가수(양의 소수부분)가 $a$일 때 $A$의 첫 번째 자리수는 $\lfloor 10^{a} \rfloor$ 이다. $A=\overline{a_1a_2a_3a_4a_5}$ (A가 5자리수라 가정해도 일반..

정보/C 2022.01.20

자동 기울기 조절 파라솔 (아두이노 간단 프로젝트)

정보과목의 아두이노 짝꿍 프로젝트로 조원들과 '자동 기울기 조절 파라솔'을 만들었다. -목적 야외 탁자에 설치된 파라솔이 비가 올 때 풍속에 따라 자동으로 기울어지게 하여 비를 맞지 않게 할 수 있다. -작동 방식 테이블에 위치한 풍속 센서가 주변 바람의 속도를 실시간으로 측정한다. 측정된 풍속의 크기에 비례하여 서보모터의 기울기를 바꾼다. 서보모터에 연결된 파라솔이 기울어져서 비를 막는다. 사용자는 파라솔의 기둥을 돌려서 풍향만 맞추면 된다. -필요한 부품 6V 풍속센서, 서보모터, 아두이노 우노 보드, 6V 외부 전원 등이 있다. 먼저 풍속센서를 다음 회로와 같이 연결한다. 그리고 서보 모터를 다음 회로와 같이 연결한다. 그리고 이 서보모터를 이용하여 파라솔의 기울기를 조절해야 하므로 고무줄, 나무젓..

정보/아두이노 2021.12.10

나이스 api에서 급식, 시간표 가져와서 카카오톡 자동 전송하는 프로그램

주변 편의점 위치를 카카오톡으로 자동 전송하는 프로그램 (https://minseob.tistory.com/17) 을 완성한 후 카카오톡 자동전송 기능을 이용한 프로그램을 더 만들고 싶어졌다. 그리하여 이번에는 당일의 급식과 시간표를 카카오톡으로 자동 전송하는 프로그램을 제작하게 되었다. 이 프로그램으로 실제로 아침마다 반톡방에 급식과 시간표를 자동으로 전송할 계획이다. 전체 프로그램 코드 : https://github.com/MinseobKimm/NeisApiCrawlerWithKakao GitHub - MinseobKimm/NeisApiCrawlerWithKakao Contribute to MinseobKimm/NeisApiCrawlerWithKakao development by creating an..

정보/Python 2021.12.08

주변 편의점 위치를 카카오톡으로 자동 전송하는 프로그램

학교 현장체험학습 자유주제탐구로 위와 같은 프로그램을 Python으로 만들게 되었다. 제주도로 현장체험학습을 가서 친구들이 있는 톡방에 주변 편의점 위치를 자동으로 전송해주려는 목적으로 제작하였다. 전체 프로그램 코드 : https://github.com/MinseobKimm/PythonCrawlerWithKakao GitHub - MinseobKimm/PythonCrawlerWithKakao Contribute to MinseobKimm/PythonCrawlerWithKakao development by creating an account on GitHub. github.com 1. ip주소 이용하여 현재 위치 위도와 경도 값 받아오기 ip주소를 통해 위도 경도 값을 json 형태로 보내주는 ip-ap..

정보/Python 2021.12.07

[자작 게임] Journey to a star

정보과목의 C언어 콘솔 게임 제작 수행평가 겸, 교내 IT 컨텐츠 경진대회 겸 간단한 게임을 제작해보았다. 코드와 실행파일은 깃허브에 올려두었다. https://github.com/MinseobKimm/Journey-to-a-star GitHub - MinseobKimm/Journey-to-a-star: using Astar 2d simple console game using Astar 2d simple console game. Contribute to MinseobKimm/Journey-to-a-star development by creating an account on GitHub. github.com 작품명 Journey to a star 작품주제 Astar 알고리즘을 이용한 2D타일맵 게임 0. ..

정보/C 2021.11.01

완전제곱수 배열에서의 등차수열

완전제곱수 배열($1,4,9,16, ...$)에서 적당히 수를 뽑아서 등차수열을 만들 수 있을까? 유한한 수열의 예를 들면 $1^2$,$5^2$,$7^2$은 1,25,49로 항의 개수가 3개이고 공차가 24인 등차수열이다. 그렇다면 항의 개수가 무한한 수열은 어떨까? 답은 '만들 수 없다'이다. 이를 귀류법을 이용해 증명해보자. 먼저 $a_1^2,a_2^2,a_3^2$ 가 등차수열을 이룬다고 하자. ($a_1,a_2,a_3$는 임의의 증가하는 자연수 배열) 두 항 사이의 공차는 같아야 하므로 $a_2^2-a_1^2=a_3^2-a_2^2$ $(a_2-a_1)(a_2+a_1)=(a_3-a_2)(a_3+a_2)$ 이때, $a_2+a_1a_3-a_2$가 성립한다. 이제 $a_1^2,a_2^2,a_3^2,\dot..

수학 2021.10.30

병합정렬 알고리즘

병합 정렬(merge sort)은 합병정렬으로도 불리며 시간 복잡도 $O(nlogn)$ 를 가지는 굉장히 빠른 정렬 알고리즘이다. 과정은 다음과 같다. 1. 분할 2. 정복 3. 결합 4. 복사 각 과정에 대해 하나씩 설명해 보겠다. 가장 먼저 분할은 정렬되지 않은 배열을 두 부분으로 잘라서 두 개의 부분 배열로 분할하는 과정이다. 만약 배열의 원소 개수가 홀수인 경우에는 크기가 비슷하도록 분할한다. 9개면 4개, 5개로 분할할 수 있다. 두 번째 과정은 정복이다. 정복은 분할한 각 부분 배열을 재귀적으로 병합 정렬하는 과정이다. 즉, 분할한 두 개의 배열에 대하여 또다시 분할, 정복, 결합, 복사를 거치도록 하는 것이다. 분할, 정복 두 과정을 c언어 코드로 설명하자면 다음과 같다. void merge..

정보/알고리즘 2021.10.17

A* 알고리즘(A star)

A*알고리즘은 출발 노드에서부터 목표 노드까지 가는 최단 경로를 찾아내는 그래프 탐색 알고리즘 중 하나이다. 휴리스틱 방법을 이용하여 최단 경로를 도출해낸다. -개별 노드에 대한 평가함수(각 노드의 가중치를 평가) f(n)=g(n)+h(n) f(x) : 차후 경로 도출을 위한 함수 g(x) : 출발 노드로부터 현재 노드 n까지의 경로 가중치 h(n) : 현재 노드 n으로부터 목표 노드까지의 추정 경로 가중치 -알고리즘의 과정 출발노드를 OPEN List에 삽입->OPEN List에서 pop()하여 f(n)으로비용평가->CLOSED List 삽입 (이 과정을 종료노드까지 반복) -A*알고리즘 슈도코드 pq.enqueue(start.node, g(start_node)+h(start_node))// 우선순위 ..

정보/알고리즘 2021.10.13

OpenCV image를 grid-based tiles로 변환하기

이전 글 : OpenCV-python를 이용하여 Unrailed! 윈도우 창 캡쳐하기 https://minseob.tistory.com/7 OpenCV를 이용하여 게임 화면을 캡쳐한 다음에는 이 화면을 에이전트가 맵을 파악할 수 있도록 grid-based tiles로 변환해주는 작업이 필요하다. 그전에 이전 글에서 캡쳐한 Unrailed! 윈도우 창에서 물체를 인식할 수 있도록 변환해주는 작업이 필요하다. cut_image함수로 화면에서 인식에 필요한 맵 부분을 잘라낸다. def cut_image(im): """Cut the image""" im = rotate(im, -8) x, y = 0, 125 h, w = 320, 800 im = im[y:y + h, x:x + w] rows, cols = im...

정보/R&E 2021.08.30