11월 21, 2016

2의 보수


보수(complement)란?

각 자리의 숫자의 합이 어느 일정한 수가 되게 하는 수.


1의 보수

binary 에서 원래 수를 반대로 뒤집은 것.

6: 00000110
6에 대한 1의 보수: 11111001

2의 보수

원래 값의 1의 보수를 취한 후 1을 더한 것으로 원래 값의 음수에 해당. 2의 보수는 binary에서 음수를 표현하는 과정에서 도입된 개념. 최상위 비트 하나를 음수를 표현하는 경우 +0(00000000)과 -0(11111111)의 두개의 0이 존재하는 문제가 발생하는데 2의 보수법으로 이런 문제를 피해갈 수 있음.

6: 00000110
-6 (6에 대한 2의 보수): 11111010

Binary subtraction

6 - 3 = 6 + (-3)

00000110 - 00000011 = 00000110 + 11111101 = 00000011


reference

11월 17, 2016

Random Access Iterator


Random-access Iterator?

자신이 가르키고 있는 element과 연관되어 있는 임의의 position에 접근하여 포인터와 같은 functionality 를 제공할 수 있는 iterator. 모든 Random-access iterator 는 bidirectional iterator이며, 어떤 element에도 constant time으로 접근할 수 있음.


Funtionalities of Random-access Iterator

  • Bidirectional Iterator 가 제공하는 모든 기능
  • Arithmetic operator ex) it1+n, n+it1, it1-n, it1-it2
  • Inequality relation operator ex) it1<it2, it2>it1, it1<=it2, it1>=it2
  • Compound assignment operator ex) it1+=n, it1-=n
  • Offset dereference operator ex) it1[n]

reference

Bidirectional Iterator


Bidirectional Iterator

유효한 범위의 sequance of element에서 begin, end 양방향의 element에 모두 access 가능한 iterator. 모든 Bidirectional iterator 는 Forward Iterator.


Funtionalities of Bidirectional Iterator

  • Default/copy/copy-assignment constructible ex) X it1; , X it2(it1); , it2 = it1;
  • In/Equality operator ex) it1==it2, it1!=it2
  • Dereference as R-value ex) *it1, it1->m
  • Dereference as L-value ex) *it1 = t
  • Increment ex) ++it1, it1++
  • Decrement ex) --it1, it1--
  • L-value are swappable ex) swap(it1, it2)

X는 Bidirectional iterator type, m은 가르키는 멤버, t는 iterator가 가르키는 타입의 object.


reference

11월 13, 2016

Monte-Carlo 알고리즘과 MCTS(Monte-Carlo Tree Search)

Monte-Carlo 알고리즘

난수를 사용하여 함수의 값을 확률적으로 계산하는 알고리즘을 부르는 용어. 계산하려는 값이 닫힌 값으로 표현되지 않거나 복잡한 경우, 이를 근사적으로 계산하기 위해 사용된다. Monte-Carlo 알고리즘을 적용해 원의 넓이를 구하는 경우, 원과 원에 내접하는 정사각형을 그리고 정사각형 안에 많은 수의 점을 찍어 점이 원의 내부에 찍힌 확률을 계산하면 원의 넓이를 근사적으로 구할 수 있다. Monte-Carlo 알고리즘은 임의 시행의 횟수를 증가시킬 수록 정확도가 증가한다.


Monte-Carlo Tree Search(MCTS)란?

MCTS는 최선의 선택(optimal decision)을 찾는 방법이다. MCTS는 의사 결정을 위한 체험적 탐색 알고리즘으로 수식을 만들어 해를 찾기가 쉽지 않을 때 주로 사용되는데, 예를 들어 게임에서 최선의 수를 찾기 위한 방법으로 활용할 수 있다. MCTS를 게임에 적용한다면, 게임에서 두는 각각의 수가 노드이고 게임의 전체 과정은 각 수의 연속인 트리로 표현된다. 각 노드에는 승률이 기록되어 있으며, 게임에서 최선의 수를 찾는 과정은 가장 승률이 높은 노드를 찾아가는 것으로 근사될 수 있다. MCTS는 각 노드 별 승률을 계산하고 승률이 높은 노드를 찾아가는 과정이라 할 수 있다.

트리 탐색의 문제점은 자식 노드가 많아지면 탐색에 시간이 굉장히 많이 걸린다는 점이다. 자유도가 높은 게임의 경우 자식 노드(다음에 둘 수 있는 수)가 굉장히 많아져 모든 결과를 살펴보고 노드 별 승률을 계산하는 것이 거의 불가능하다. MCTS는 전체 가능성을 모두 탐색하지 않고 다수의 random simulation을 통해 게임 결과를 구하여 이를 노드의 승률에 적용하는 알고리즘으로, 자유도가 높은 게임에서도 높은 효율성을 보여준다. MCTS 알고리즘은 Selection, Expansion, Simulation, Back propagation 네 가지 단계로 이루어진다.


  1. Selection (선택): 루트 R에서 시작하여 연속되는 자식 노드를 따라 내려가 노드L을 선택한다.
  2. Expansion (확장): 노드L에서 게임이 종료되지 않은 경우, 새로운 자식 노드C를 생성하거나 기존의 자식 노드 중 하나를 노드C로 선정한다.
  3. Simulation (시뮬레이션): 노드C를 대상으로 random playout을 수행한다
  4. Back propagation (역전파): playout의 결과를 노드 C에서 루트 R까지 업데이트한다.



MCTS를 적용하기 위해서는 다음과 같은 3가지 조건을 만족해야 한다고 한다.

  • 게임의 최대/최소 점수값이 있음
  • 게임의 규칙이 정해져 있으며, 게임이 완전 정보 게임이어야 함
  • 게임의 길이가 제한되어 비교적 빨리 게임이 끝나야 함

reference

11월 02, 2016

Visual studio 에서 C++ 프로젝트 작성 시 arguments 주는 방법


프로젝트 속성 > 디버깅 > 명령 인수

에 인수를 넣어준다. 인수는 공백(space or tab)으로 구분되며, 공백이 포함된 문자열을 하나의 인수로 전달 시엔 문자열을 큰 따옴표("")로 감싸준다.


reference

11월 01, 2016

ODBC data source 설정 시 ODBC driver for SQL server ODBC 항목이 나오지 않는 경우 해결 방법


증상

ODBC data source Administrator 에서 새로운 data source 를 만들 때 드라이버 선택 메뉴에서 ODBC driver for SQL Server 항목이 나타나지 않음.
(SQL Server 등 다른 선택 항목은 존재)


원인

ODBC driver가 설치되지 않았기 때문.


해결 방법

  • Microsoft ODBC driver for SQL Server를 설치
  • SSMS 설치(설치 과정에서 ODBC driver가 함께 설치됨)

reference

  • -

10월 28, 2016

HTTP


HTTP (HyperText Transfer Protocol)

WWW 상에서 정보를 주고 받을 수 있는 프로토콜로 HTML 문서 및 다른 종류의 데이터를 주고 받는데 사용. TCP, UDP 방식을 사용하며 80번 포트를 이용함. 버전 0.9, 버전 1.0 및 버전 1.1이 존재하는데 현재 대부분 버전 1.0 이나 버전 1.1을 사용함. HTTP/2를 개발 중.

HTTP는 클라이언트와 서버 사이의 요청/응답(request/response) 프로토콜로 요청 메시지, 응답 메시지가 각각 구분되어 있으며 이에 따라 공통으로 사용되는 헤더와 request 헤더, response 헤더가 존재함. 먼저 클라이언트가 서버에 연결을 요청하면 Connect, Request, Response, Close 과정을 거쳐 통신을 수행함. 버전 0.9 의 경우 같은 페이지 내에서도 요소마다 Connect와 Close 과정을 거쳐서 효율이 매우 떨어졌지만, 버전 1.0 부터 한번의 Connect 후에 Request와 Response를 반복할 수 있게 됨.


HTTP Request

HTTP Request |devwoodo's blog

HTTP Response

HTTP Response |devwoodo's blog

reference