분류 전체보기 187

가비지 없이 foreach 사용하기

문제foreach문은 syntax sugar이다. 내부적으로 해당 타입의 Enumerator를 받아 루프를 수행한다. public class SomeGenericClass : IEnumerable{    public class SomeEnum : IEnumerator    {        public SomeEnum()        {            Console.WriteLine("Created");        }                public bool MoveNext()        {            return false;        }        public void Reset()        {            throw new NotImplementedExcepti..

언어/C# 2024.01.21

Dynamic 타입

Dynamic 리플렉션이나 다른 구성요소와 통신하는 일을 더 쉽게할 수 있도록 C# 컴파일러는 표현식의 타입을 dynamic으로 선언할 수 있게 했다. 만약 코드에서 dynamic으로 표시된 표현식이나 멤버를 호출하는 코드를 작성하면, 컴파일러는 페이로드(Payload)라 불리는 특별한 IL 코드를 생성한다. 실행 시점에서 페이로드 코드는 객체의 실제 타입을 기반으로 정확한 연산을 찾아 실행하는 일을 한다. public class Cat { public void Speak() { Console.WriteLine("Meow"); } } public class Dog { public void Speak() { Console.WriteLine("Woof"); } } public class Rock { } //..

언어/C# 2024.01.14

강화학습_Q-Learning #2

2023.12.19 - [Game AI] - 강화학습_Q-Learning #1 강화학습 튜닝 이전 글에서 Q러닝의 공식은 다음과 같다고 했다. $$Q(s,a) = (1-{\alpha})Q(s,a)+{\alpha}(r+{\gamma}max(Q(s',a'))$$ 여기서의 ${\alpha}$와 ${\gamma}$에 더하여, 임의의 상태를 가질 확률 ${\nu}$(뉴)와 임의의 행동을 취할 확률 ${\rho}$(로)를 인자로 더 추가할 수 있다. 알파 : 학습율 학습율은 현재 데이터가 저장된 Q-Value에 얼마나 영향을 미칠지를 결정한다. [0, 1]값을 갖는다. 0이면 학습이 아예 되지 않는다. 0.3정도로 시작해볼 수 있다. 그러나 피드백의 편차가 클 때에는 이 값이 더 낮아지는게 좋다. 반면에, 학습 반..

Game AI 2024.01.07

강화학습_Q-Learning #1

개요 강화학습이란 경험에 기초하여 학습하는 기법들을 칭한다. 강화학습은 일반적으로 3가지 요소를 지닌다 탐색 전략 : 게임 중 다양한 행동을 시도함 강화 함수 : 취한 행동을 평가함. 학습 규칙 : 위 두 가지를 연결함. 강화학습은 신경망으로 할 수 있지만 게임에서는 Q-Learning을 쓰는 것이 좋은 시작점이 될 수 있다. Q-Learning은 구현이 쉽고 게임이 아닌 산업에서 많이 쓰여졌으며 이론에 대한 깊은 이해 없이도 사용할 수 있다. Q-Learning Q-Learning은 취할 수 있는 액션들을 탐색하며 관련된 정보들을 저장하고 업데이트한다 Q러닝은 게임 세계를 State machine으로 다룬다. 알고리즘은 항상 어떤 상태를 가지며, 상태는 캐릭터의 환경이나 내부 정보들을 기록한다. 당연하..

Game AI 2023.12.19

Decision Tree Learning - (3) incremental way

2023.12.03 - [Game AI] - Decision Tree Learning (2) Decision Tree Learning (2) 2023.11.26 - [Game AI] - Decision Tree Learning - 1 Decision Tree Learning - 1 2021.10.21 - [Game AI] - 의사 결정 - Decision Tree 의사 결정 - Decision Tree Decision Tree Decision Tree는 Decision Making 구현법 중 하나이다. 빠르고, 쉽게 tsyang.tistory.com Incremental Learning 지금까지는 온전한 데이터들이 들어오면 그걸로 Decision Tree를 만들어 냈다. 그러나 새로운 데이터들이 들어온다..

Game AI 2023.12.09

Decision Tree Learning (2)

2023.11.26 - [Game AI] - Decision Tree Learning - 1 Decision Tree Learning - 1 2021.10.21 - [Game AI] - 의사 결정 - Decision Tree 의사 결정 - Decision Tree Decision Tree Decision Tree는 Decision Making 구현법 중 하나이다. 빠르고, 쉽게 구현 가능하고 이해하기 쉽다는 장점을 가지고 있다. 위 트 tsyang.tistory.com ID는 연속적인 속성에서 동작할 수 없고 속성의 값들이 많을 경우에도 활용이 어렵다. 따라서 속성의 값들은 몇 개(주로 2개)의 이산적인 카테고리로 나뉘어져야 한다. Single Split 연속적인 값들은 역치(threshold) 를 정하..

Game AI 2023.12.03

Decision Tree Learning - 1

2021.10.21 - [Game AI] - 의사 결정 - Decision Tree 의사 결정 - Decision Tree Decision Tree Decision Tree는 Decision Making 구현법 중 하나이다. 빠르고, 쉽게 구현 가능하고 이해하기 쉽다는 장점을 가지고 있다. 위 트리에서 Leaf 노드는 실행할 액션(output)이 된다. input이 어떻게 들 tsyang.tistory.com 개요 Decision Tree는 효율적인 학습 대상이다. Strong Supervision(결과가 맞았는지 틀렸는지 피드백)을 통해 만들어진 행동들로 동적 생성이 가능하다. ID3 게임 AI에서 Decision Tree 학습에는 일반적으로 ID3라는 걸 쓴다. 산업적으로는 C4, C4.5, C5같은..

Game AI 2023.11.26

IL2CPP가 Virtual Call과 Boxing을 처리하는 방법

이 글의 정보들은 2016년에 작성된 글을 기반으로 함. 따라서 2023년 현재 바뀐 부분이 있을 수 있음. Devirtualization 당연한 얘기지만, Virtual Call은 Direct Call보다 더 느리다. 따라서 일부 컴파일러는 Virtual Call을 Direct Call로 바꾸는 Devirtualization 기법을 사용하기도 한다. 단, 해당 코드가 컴파일 타임에 어떤 메서드를 실행시킬지를 판단할 수 있어야 한다. 이는 IL2CPP도 마찬가지이다. 다만 IL2CPP는 최적화에 보수적이기 때문에... var dog = new Dog(); //Dog는 Animal 클래스를 상속함. dog.Speak(); 위와 같은 상황에서도 Virtual Call을 호출하는 C++코드를 만들어낸다. (2..

Decision Learning(1) - Naive Bayes Classifiers

개요 의사 결정 학습 중 가장 먼저 시도해야봐야 할 것은 나이브 베이즈 분류기(Naive Bayes Classifiers)이다. 이건 구현하기도 쉽고 성능도 좋아서 학문적인 연구에서도 sanity check용으로 씀. 심지어는 많은 머신 러닝 연구들이 얘보다 못하기도 하다. 데이터 운전 중 코너링을 할 때 브레이크를 어디서 밟을지 학습하는 경우를 생각해보자. 이 때 AI는 플레이어의 실제 주행 데이터를 가지고 학습할 수 있다. 플레이어의 실제 주행에서 (브레이크 여부 / 코너까지 거리 / 현재 속도)를 기록할 수 있고, 다음과 같은 데이터가 나왔다고 가정해보자. brake? distance speed ON 2 11 ON 4 70 OFF 65 80 ON 86 84 OFF 8.2 12.5 OFF 81 14...

Game AI 2023.11.12

Learning (3) - 플레이어 행동 예측

개요 플레이어의 행동을 예측하는 것은 여러 성향의 플레이어들에게 대항하는 AI를 만드는 데 도움이 된다. 많은 연구 결과에 따르면 인간은 무작위로 행동하는데 잼병이라 이를 이용하여 플레이어의 행동을 어느정도 예측할 수 있다. 예제로 간단하게 플레이어가 왼쪽을 고르는지, 오른쪽을 고르는지 맞추는 게임이 있다고 하자. 그렇다면 플레이어의 행동을 다음과 같은 방법으로 예측해볼 수 있다. 그냥 확률로 계산 그냥 지금까지 통계적으로 플레이어가 어떤 행동을 했는지를 이용하는 것. 이 방법은 구현이 매우 간단하지만, 플레이어가 이를 눈치채고 다르게 행동할 가능성이 높다. N-Gram 플레이어가 왼쪽을 골랐으면 "L" 오른쪽을 골랐으면 "R"이라는 문자를 이용하여 플레이어가 지금까지 한 행동을 문자열로 표현할 수 있다..

Game AI 2023.10.29