에뮬레이터 입력 최적화 문제를 어떻게 분류하고 어떤 알고리즘으로 접근해야합니까? 완료하기 위해

질문의 성격으로 인해 많은 배경 정보를 포함해야합니다 (왜냐하면 질문의 범위를 좁히는가?). 다음과 같이 요약 할 수 있습니다.

매우 큰 조합 검색 공간에서 지역 최적을 찾는 방법은 무엇입니까?

배경

툴 지원 슈퍼 플레이 커뮤니티에서는 비용을 최소화하기 위해 비디오 게임 콘솔 또는 에뮬레이터에 특수 제작 된 (실시간으로 생성되지 않은) 입력을 제공하려고합니다 (보통 완료 시간). 현재이 작업을 수행하는 방법은 프레임 단위로 게임을하고 각 프레임에 대한 입력을 지정하여 종종 실행 부분을 여러 번 다시 실행하는 것입니다 (예 : 최근 에 젤다의 전설 : 오카리나의 시간에 대해 최근에 게시 된 실행 은 재시도 횟수는 총 198,590 회입니다.

이러한 런을 목표로 삼는 것은 일반적으로 경로 계획과 순회라는 두 가지 주요 요소로 이어집니다. 전자는 후자보다 훨씬 “창의적”이다.

경로 계획은 플레이어가 게임을 완료하기 위해 전체적으로 탐색해야하는 방법을 결정하는 것으로, 종종 런에서 가장 중요한 부분입니다. 예를 들어 사용할 정렬 방법을 선택하는 것과 유사합니다. 세계 최고의 버블 정렬은 단순히 백만 요소에 대한 빠른 정렬을 능가하지 않습니다.

그러나 완벽을 추구함에있어서 순회 (경로 수행 방법)도 큰 요소입니다. 유추를 계속하면 정렬 알고리즘이 구현되는 방식입니다. 특정 경로를 입력하지 않으면 일부 경로를 수행 할 수도 없습니다. 이것은 가장 지루한 도구 보조 프로세스이며 완료된 생산을 몇 달 또는 몇 년이 걸리게하는 것입니다. 그것은 같은 아이디어를 다른 것으로 변형시키는 것이 가장 좋을 때까지 내려 가기 때문에 (인간 에게는) 어려운 과정은 아니지만, 인간은 그들의 관심 범위에서 너무 많은 변형을 시도 할 수 있습니다. 이 작업에 기계를 적용하는 것이 여기에 적절 해 보입니다.

나의 목표는 이제 닌텐도 64 시스템에 대해 일반적으로 순회 프로세스를 자동화하는 것 입니다. 이 문제에 대한 검색 공간은 지금까지 무차별 대입 방식으로 공격에 너무 큽니다. N64 실행의 N 프레임 세그먼트 2 개 보유 30N 입력의 단지 30 프레임 (30 프레임 초)이 개 갖는 의미 가능한 입력, 900 가능한 입력하는 단계; 완전한 2 시간 실행을위한 솔루션은 물론 이러한 잠재적 인 솔루션을 테스트하는 것은 불가능합니다.

그러나 나는 전체 실행의 전체 글로벌 최적화를 시도하는 데 관심이 없습니다 (또는 오히려 시도조차하지 않을 것입니다). 오히려 초기 입력이 주어지면 런 의 특정 세그먼트 에 대한 로컬 최적 (또는 반 전역 최적화의 경우 가장 가까운 n 로컬 최적)을 근사하고 싶습니다 . 즉, 경로와 해당 경로의 초기 통과가 주어지면 비용을 최소화하기 위해 해당 통과의 이웃을 검색하지만 문제를 해결할 수있는 모든 경우를 시도하는 것으로 변질하지 마십시오.

따라서 내 프로그램은 시작 상태, 입력 스트림, 평가 기능을 수행하고 평가 결과를 최소화하여 로컬 최적을 출력해야합니다.

현재 상태

현재 모든 프레임 워크를 관리하고 있습니다. 여기에는 에뮬레이터 조작, 설정 및 해제, 구성 등을 통해 입력 스트림을 평가하는 것이 포함됩니다. 그리고 일종의 자리 표시 자로서 옵티마이 저는 매우 기본적인 유전자 알고리즘입니다. 입력 스트림의 모집단을 평가하고, 승자를 저장 / 교체하며, 우승자 스트림을 변경하여 새로운 모집단을 생성합니다. 이 프로세스는 시간 또는 생성 번호와 같은 임의의 기준이 충족 될 때까지 계속됩니다.

이 프로그램의 가장 느린 부분은 입력 스트림의 평가입니다 . 이것은 n 개의 프레임에 대한 게임 에뮬레이션을 포함하기 때문 입니다. (내가 이런 종류의 물건에 후크를 제공하는 내 자신의 에뮬레이터를 쓸 시간이 있었지만 지금은 다른 프로세스에서 기존의 에뮬레이터의 메시지를 합성하고 메모리를 수정하는 중입니다.) 200 프레임을 평가하는 데 약 14 초가 걸립니다. 따라서 함수 평가 수를 최소화하는 알고리즘 (선택권 제공)을 선호합니다.

에뮬레이터를 동시에 관리하는 프레임 워크에서 시스템을 만들었습니다. 따라서 선형 성능 규모 로 한 번에 여러 스트림을 평가할 수 있지만 실제로 실행중인 에뮬레이터의 수는 시스템 성능이 저하되기 전에 8 ~ 32 (및 32는 실제로 푸시) 일 수 있습니다. 이는 평가가 진행되는 동안 처리를 수행 할 수있는 알고리즘이 알고리즘을 선택하는 데 도움이된다는 것을 의미합니다.

테스트로, 내 평가 기능 (게임 Banjo Kazooie )은 프레임 당 플레이어에서 목표 지점까지의 거리를 합산하는 것이 었습니다. 이것은 최적의 솔루션이 가능한 한 빨리 그 지점에 가까워 야한다는 것을 의미했습니다. 아날로그 스틱으로 만 돌연변이를 제한하면 괜찮은 해결책 을 얻는 데 하루가 걸렸습니다 . (이것은 동시성을 구현하기 전에였습니다.)

동시성을 추가 한 후 A 버튼 누름의 돌연변이를 활성화하고 점프가 필요한 영역에서 동일한 평가 기능을 수행했습니다. 24 개의 에뮬레이터를 실행하면 초기에 비어있는 입력 스트림에서 목표에 도달하는 데 약 1 시간이 걸렸지 만, 최적의 상태에 근접한 것을 얻으려면 며칠 동안 실행해야 할 것입니다.

문제

내가 직면하고있는 문제는 수학 최적화 필드에 대해 내 최적화 문제를 올바르게 모델링하는 방법을 알지 못한다는 것입니다 ! 예를 들어 Wikipedia에 설명 된 많은 알고리즘의 개념을 대략적으로 따를 수는 있지만 문제를 분류하거나 해당 범주에 대한 최신 알고리즘을 선택하는 방법을 모르겠습니다.

내가 알 수 있듯이, 나는 매우 큰 이웃과의 조합 문제가 있습니다 . 또한 평가 기능은 매우 불 연속적이며 기울기가 없으며 고원이 많습니다 . 또한 제약이 많지는 않지만 문제를 해결하는 데 도움이 될 경우이를 표현할 수있는 기능을 기꺼이 추가 할 것입니다. 예를 들어 시작 버튼을 사용하지 말도록 지정하고 싶지만 일반적인 경우는 아닙니다.

질문

내 질문은 : 어떻게 모델링합니까? 어떤 종류의 최적화 문제를 해결하려고합니까? 어떤 알고리즘을 사용해야합니까? 나는 연구 논문을 읽는 것을 두려워하지 않으므로 내가 무엇을 읽어야하는지 알려주십시오!

직관적으로, 유전자 알고리즘은 실제로 배우지 않는 것처럼 보이기 때문에 최고 일 수는 없습니다. 예를 들어, 시작을 누르면 항상 평가가 더 나빠지는 것처럼 보이면 (게임을 일시 중지하기 때문에) “언제든지 시작을 누르는 것은 쓸모가 없습니다.” 그러나 Super Mario 64의 이른바 “뒤로 긴 점프 일시 중지”와 같이 시작을 누르는 것이 최적 이기 때문에이 목표조차 들리는 것처럼 사소한 것은 아닙니다 ! 여기서 뇌는 훨씬 더 복잡한 패턴을 배워야 할 것이다. “플레이어가이 특정 상태에 있고 버튼 누름 조합을 계속할 때를 제외하고는 시작을 누르는 것은 쓸모가 없습니다 .”

수정에 더 적합한 다른 방식으로 입력을 나타내야합니다 (또는 기계가 배울 수 있음). 실제로 필요한 것은 여러 프레임에 걸쳐있을 수있는 “액션”이기 때문에 프레임 당 입력이 너무 세밀 해 보입니다. 그러나 많은 발견이 프레임별로 이루어 지므로 완전히 배제 할 수는 없습니다. 위에서 언급 한 후진 점프는 프레임 수준의 정밀도를 요구합니다. 또한 입력이 직렬로 처리된다는 사실은 대문자로 표시 할 수있는 것이어야하지만 어떻게 해야할지 모르겠습니다.

현재 (반응 형) 타부 검색, 매우 큰 이웃 검색, 교육 학습 기반 최적화 및 Ant 식민지 최적화에 대해 읽고 있습니다.

이 문제는 무작위 유전자 알고리즘 이외의 다른 문제로 다루기가 너무 어렵습니까? 아니면 실제로 오래 전에 해결 된 사소한 문제입니까? 읽어 주셔서 감사합니다. 모든 답변에 미리 감사드립니다.



답변

귀하의 질문에 제공 한 정보에서 표준 최적화 방법 (내가 아는)을 적용하는 방법을 볼 수 없습니다. 객체는 그렇게 복잡하지는 않지만 (나중에 자세히 설명 할) 대상 함수는 불쾌합니다. 값은 제어 할 수없는 외부 시스템에 의해 정의되며, 좋은 속성을 가지지 않을 것입니다. 따라서 저는 유전자 알고리즘을 사용하는 것이 실현 가능하지 않으며 아마도 좋은 접근법이라고 생각합니다. 문제의 구조에 대한 단서가 없으면 다른 방법보다 더 잘 작동합니다. 고려해야 할 것이 많다

  • 물체 공간,
  • 대상 기능
  • 유전자 알고리즘의 매개 변수,

정교하게 해주세요.

당신의 물건은 무엇입니까?

당신은 이미 그 대답을했습니다 : 당신은 일련의 행동들을보고 있습니다. 각각은 하나의 프레임을 차지합니다. 나는 이것이 너무 세분화 될 수 있다고 생각한다. 각각 지속 시간 (프레임 수)이있는 일련의 작업을 시도하십시오. 이것은 “약간 더 오래 걸으십시오”와 같은 돌연변이가 자연스럽게 “A를 누르십시오”와 다른 확률을 갖도록합니다. 가장 잘 작동하는 것을 시도하십시오. 다른 재료에 대해 생각한 후에이 항목을 다시 방문해야 할 수도 있습니다.

당신의 목표 기능은 무엇입니까?

이것은 정말 중요합니다. 무엇을 최적화하고 싶습니까? 목표 시간? 다른 행동의 수는? 수집 된 별의 수는? 몇 가지 요소의 조합? 여러 대상을 얻는 즉시 사물이 털이 나옵니다. (보통) 더 이상 최적화되지 않습니다!

목표 달성 시간을 언급했습니다. 이것은 좋은 목표 기능이 아닐 수도 있습니다. 왜? 대부분의 시퀀스는 목표에 도달하지 못하기 때문에 일정한 결과를 달성하여 다음 과 같은 피트니스 환경을 만듭니다 (1 차원의 개념 스케치).


[ 출처 ]

타겟 기능이 거대한 영역이 있습니다 . 유전자 알고리즘은 모두 신호 에 관한 것 입니다. 솔루션의 작은 변화는 변화가 최적의 솔루션을 향한 (이상적으로) 지향되는 경우에만 품질의 개선 (또는 감소)을 나타내야합니다. 그렇지 않은 경우 (임의로) 무작위 검색 이상의 결과를 얻지 못하고 확률이 가까운 좋은 솔루션을 제공 합니다. 이것이 우리의 목표 기능에 무엇을 의미합니까? 전체적인 품질이 여전히 낮더라도 솔루션이 약간 개선 될 때마다 개선되어야합니다 . 그래서 어때?

0

0

11+final distance to goal+11+time to goal

목표에 도달하지 않은 경우 목표에 도달하는 시간으로 “무한”을 사용하면 두 번째 summand가 됩니다. 목표에 도달하지 않는 한, 가까이 다가 가면 체력이 까지 올라갑니다 . 목표에 도달하는 모든 시퀀스의 기준선은 이며 더 빠를수록 향상됩니다.

0

1

1

거리를 어떻게 측정합니까? 직선 거리는 유혹적인 것처럼 보일 수 있지만 문제가 있습니다. 다시, 잘못된 신호가 전송 될 수 있습니다. 이 간단한 시나리오를 고려하십시오.


[ 출처 ]

상단 복도로 점프하는 것으로 시작하는 모든 시퀀스는 목표 바로 위의 지점에 도달 할 때까지 향상되지만 실제로 목표에 도달 할 수는 없습니다! 더 나쁜 것은 목표에 도달하지 않은 모든 시퀀스 중에서 올라가는 시퀀스가 ​​내려가는 시퀀스보다 우수하므로 GA가 명확하게 파인 시퀀스를 거부 할 수 없다는 것입니다. 다시 말해, 선형 거리는 레벨에 막 다른 골목이있는 경우 GA를 포획 할 수있는 특히 나쁜 국소 최적화를 만듭니다.

따라서 게임 캐릭터가 서로 갈 수 있으면 레벨 위에 그리드를 오버레이하고 인접 지점을 연결하는 것이 좋습니다. 그런 다음 캐릭터와 가장 가까운 지점에서 목표에 가장 가까운 지점까지 가장 짧은 경로의 길이로 목표와의 거리를 계산합니다. 계산하기 쉽고 데드 엔드 (로컬 옵티마)에 들어가는 것은 즉시 처벌됩니다 ¹. 물론 레벨 데이터에 액세스 할 수 있어야한다고 생각합니다.

GA는 어떻게 작동합니까?

이제 우리는 실제 유전자 알고리즘을 얻을 수 있습니다. 주요 고려 사항은 모집단, 선택, 재생산 / 돌연변이 및 중지 기준입니다.

인구

얼마나 당신의 인구는 될 것입니다? 너무 작은 경우 좋은 솔루션에 도달하는 데 필요한 다양성을 제공하지 못할 수 있습니다. 너무 크면 쓸모없는 정크를 가지고 다니면서 프로세스 속도가 느려질 수 있습니다.

당신은 어떻게합니까 초기화 하여 인구를? 랜덤 액션 시퀀스를 선택합니까? 그렇다면 어느 길이입니까? 목표에 도달 할 수있는 적은 수의 수동으로 생성되고 합리적인 시드 솔루션이 있습니까?

선택

생존 / 재생을 위해 어떤 개인이 선발 됩니까? 최고의? 토너먼트 를 개최 합니까? 체력과 관련 하여 개인의 생존을 무작위로 결정 합니까? 어떤 경우에도 최선의 생존을 원하십니까, 아니면 죽을 수 있습니까 (지역 낙관론을 떠나는 것이 유용 할 수 있습니다) ²?

k

여기서 핵심 개념은 선택 압력입니다 . 생존하기가 얼마나 어렵습니까? 너무 작게 만들고 쓰레기 해결책을 제거하지 마십시오. 너무 높게 설정하면 변경 (특히 로컬 옵티마 간 이동)을 어렵게 만듭니다.

생식 및 돌연변이

한 라운드의 생존자를 선택한 후에는 다음 세대를 만들어야합니다 (부모가 생존하고 다음 세대의 일부입니까?). 돌연변이와 재조합이라는 두 가지 주요 전략이 있습니다.

세부 사항은 다를 수 있지만 돌연변이 는 분명합니다. 개인의 순서에서 모든 위치에 대해 약간의 확률로 변경하십시오. 모든 위치에 대해 독립적 으로이 작업을 수행하거나 무작위로 돌연변이 수를 선택하거나 확률이 다른 다른 돌연변이를 수행 할 수 있습니다 (예 : 새 요소 삽입, 제거, 변경 등). 돌연변이는 일반적으로 작은 변화 에 관한 것 입니다.

두 개 이상의 솔루션의 측면을 새로운 솔루션으로 결합하는 재조합은 더 까다 롭지 만 단계를 허용 할 수 있습니다 . 즉, 한 “피트니스 산”을 떠나 다른 경사면으로 바로 이동할 수 있습니다 (높을 수 있음). 고전적인 아이디어는 크로스 오버입니다 . 나는 그것이 여기에서 의미가 있는지 모르겠다 (지정된 시퀀스의 접두어를 다른 것으로 바꾸면 접미어의 가치가 떨어질 것 같다). 어쩌면 시퀀스의 다른 지점에서 게임 캐릭터의 레벨과 위치에 대한 지식을 사용하여이를 안내 할 수 있습니다. 즉, 캐릭터가 두 시퀀스에서 동일한 위치에있는 경우에만 크로스 오버 포인트를 만듭니다.

종료

N

k

1


보다시피,이 모든 것들이 실제 성능에 영향을주기 위해 서로 얽혀 있습니다. 여러 집단을 병렬로 운영하는 경우, 이주 및 / 또는 재앙으로 인한 유전자 드리프트 구현에 대해 생각할 수도 있습니다 . 길을 안내 할 이론이 거의 없으므로 다른 설정을 시도하고 그것이 어디로 향하는 지 살펴 봐야합니다. 바라건대 한 레벨에서 작동하는 것이 다른 레벨에서도 작동하기를 바랍니다. 행복한 땜질!

참고 : 위의 관점에서 BoxCar 2D 를 살펴보십시오 . 그들은 어떤 일을 꽤 잘하고 (다른 사람은 그렇지 않습니다) GA의 매개 변수가 성능에 영향을 줄 수있는 방법에 대한 직감을 얻을 수 있습니다.


  1. 실제로,이 피트니스를 사용하여 탐욕스럽게 시퀀스를 구성하는 것은 가능한 모든 다음 조치에서 목표까지의 거리를 최소화하는 조치를 선택하는 것이 좋습니다. GA를 사용하기 전에 사용해보세요.
  2. 물론 관찰자로서 당신은 항상 최고의 솔루션을 기억합니다.

답변

TLBO (Teaching-Learning-based Optimization) 방법 및 해당 코드에 대한 자세한 내용은 다음 백서를 참조하십시오.

R. Venkata Rao와 V. Patel의 복잡한 제약 최적화 문제를 해결하기위한 엘리트 교육 기반 학습 기반 최적화 알고리즘 . 산업 공학 계산의 국제 저널 3 (4) : 535–560 (2012)

추가 자료 :