2016-11-26 4 views
0

기능 강화 프로그래밍을 사용하여 간단한 환경을 구현하려는 강화 학습을 고민 중입니다.파이썬 함수형 프로그래밍 및 함수형 구성 및 while 루프

저는 step: State, Action -> Stateaction_space: State -> [Action, ...]입니다.

내가

s = State() 
e = [s] 
while action_space(s): 
    a = best(action_space(s)) 
    s = step(s, a) 
    e.append(s) 

초기 State을 통해 기능 step의 반복적 인 구성을 구현하는 함수형 프로그래밍 방법을 찾고 있어요 그래서 내가해야 할 무슨 생각을 이해 [f(x) and c(x), f(f(x)) and c(f(x)), f(f(f(x))) and c(f(f(x)), ...]을 만드는 방법이지만, 불필요한 평가없이.

미리 감사드립니다.

+0

그리고 귀하의 질문은 무엇입니까? 이 혼란스런 사양을 감안할 때 나를 위해 codez을 작성 하시겠습니까? 어쨌든 당신이 원하는 것은 use ['functools.reduce'] (https://docs.python.org/3.5/library/functools.html#functools.reduce)입니다. 이것은 파이썬의 fold 연산입니다. – Bakuriu

+0

@Bakuriu 실제로, 이것은 [unfold] (https://en.wikipedia.org/wiki/Anamorphism)입니다. – phg

+0

@Bakuriu 찾는 방법이나 최소한 키워드를 묻습니다.나는 내가 찾고있는 해결책이 정확히'reduce'의 oposite라고 생각한다. 'reduce'가 2 요소를 취하고 하나를 반환하는 동안, 필요한 함수는 1 (마지막) 요소를 취하여 함수를 적용한 후 2를 반환합니다. 나는'확장 '이 그것의 이름 일 수 있다고 생각한다. – FPFTW

답변

1

이 시나리오에서는 이해가 불가능하지만 생성자를 만들 수 있습니다. 그로 가기 전에, 당신이 그들이 마지막 (행동) 인수가 falsy 때마다 falsy 뭔가를 (같은 False 또는 None) 반환하는 방식으로 귀하의 최고의단계를 함수를 정의하는 것도 제안한다. 코드를 단순화합니다.

그럼 당신이 발전기를 정의 할 수 있습니다

def unfold(s): 
    while s: 
     yield s 
     s = step(s, best(action_space(s))) 

이 지연되는 장점이 있습니다. 이처럼 사용할 수 있습니다

e = [s for s in unfold(State())] 

또는 단지를 :

e = list(unfold(State())) 

더 함수형 프로그래밍 접근 방식이 재귀 함수가 될 수있다 : 당신이 이름의 필요를 발견하면

def unfold(s): 
    return [s] + unfold(step(s, best(action_space(s)))) if s else [] 

e = unfold(State()) 

기능 성가신, 그럼 당신은이 트릭을 갈 수 :

e = (lambda unfold:lambda s:unfold(unfold,s))(
     lambda unfold, s: [s] + unfold(unfold, step(s, best(action_space(s)))) if s else [] 
    )(State()) 

이것은 매우 불분명합니다. 첫 번째 함수는 다른 함수를 인수 (두 번째 줄에있는 함수)와 함께 즉시 호출합니다. 실제 unfold 함수는 첫 번째 함수의 매개 변수 이름으로 이름을 가져옵니다.

그런 다음이 첫 번째 기능은 상태 인수를 받아 다른 함수 (lambda s:unfold(unfold,s))을 반환하고 그것으로을 전개 호출합니다. 또한이 함수를 즉시 호출하여 초기 값 State()을 전달합니다.

펼치기 unfold 또한 범위 내에서 유지하기 위해 재귀 트리 아래로 전달된다는 점에 유의하십시오.

+0

나는 그것이 가까와다고 생각한다. 올바른 결과를 제공하지만 순수 함수 프로그래밍이 아닙니다. – FPFTW

+0

더 많은 기능을 프로그래밍 할 수있는 몇 가지 대안을 추가했습니다. – trincot

+0

오, 고맙습니다. @ 트린 코토 – FPFTW

관련 문제