2012-06-10 2 views
4

Rn에서 함수/n의 최소값을 찾는 알고리즘이 있습니다. 그리고 저는 단원 큐브 이미지의 형태로 주어지는 제한적인 다양성을 가지고 있습니다. 단일 큐브 내부 공간을 Rn에 매핑하는 것이 중요하며, 그 반대의 경우도 마찬가지입니다. 모든 좌표에 적용되는 unar 함수 from_R_to_01을 사용하여 수행 할 수 있습니다.Erlang에서 변수 arity의 함수를 만드는 방법은 무엇입니까?

내가 원하는 것은 내 목표 함수 F를 취해 같은 Arity의 다른 함수를 만드는 것인데, 그것의 좌표는 Rn에서 제약 조건으로 매핑된다는 점만 제외하면 같은 F가 될 것입니다 매니 폴드 맨. 따라서 나는 그것을 최소화 알고리즘에 줄 수 있고, Rn에 한 쌍의 좌표를 얻은 다음, 그것들을 동일한 매니 폴드에 매핑하여 "실제 좌표"좌표를 얻을 수 있습니다. 따라서 제한되지 않은 최적화에 비선형 프로그래밍 작업을 줄이기 위해.

글쎄, 질문으로 돌아갑니다. 이 코드는 2-ar 경우에 사용됩니다.

minn_man2(F, Man) -> 
    OnRn = fun (X, Y) -> # this is the limiting part 
     OnMan = Man(from_R_to_01(X), from_R_to_01(Y)), 
     apply(F, OnMan) 
    end, 
    [X | [ Y | []]] = minn(OnRn), 
    Man(from_R_to_01(X), from_R_to_01(Y)). 

어떻게하면 더 일반적으로 만들 수 있습니까? 가장 어려운 부분은 Fs의 무결 한 기능을 만드는 것입니다. 어떻게해야할지 전혀 모릅니다.

+0

'목록'이상인 경우 '프로 프리 스트'를 사용하십시오. –

답변

1

생각해 보겠습니다. 각각의 특정 상황에 대해 OnRn을 명시 적으로 선언해야하는 경우, 내가 작성하지 않는 이유는 무엇입니까?

처음에는 단일 'case MA of'문에 unar 및 binar Mans에 대한 두 개의 별도 선언을 수동으로 작성했습니다. 그런 다음 나는 게으르며 파이썬을 사용하여 이들 중 전체를 생성합니다. 그런 다음 Erlang이 실행에 대한 적절한 선언을 생성하고 평가할 수 있도록 일종의 eval을 찾았습니다. 그리고 여기 있습니다. 매력처럼 작동합니다.

minn_man(F, Man) -> 
    MA = proplists:get_value(arity, erlang:fun_info(Man)), 
    R1 = fun (X) -> from_R_to_01(X) end, 

    XiStr = string:join(["X" ++ integer_to_list(I) || I <- lists:seq(1, MA)], ", "), 
    RiXiStr = string:join(["R1(X" ++ integer_to_list(I) ++ ")" || I <- lists:seq(1, MA)], ", "), 
    FunStr = "fun (" ++ XiStr ++ ") -> apply(F, Man(" ++ RiXiStr ++")) end.", 

    {ok, Tokens, _} = erl_scan:string(FunStr), 
    {ok, [Form]} = erl_parse:parse_exprs(Tokens), 
    Binding1 = erl_eval:add_binding('F', F, erl_eval:new_bindings()), 
    Binding2 = erl_eval:add_binding('Man', Man, Binding1), 
    Binding3 = erl_eval:add_binding('R1', R1, Binding2), 
    {value, OnRn, _} = erl_eval:expr(Form, Binding3), 

    XY = minn(OnRn), 
    apply(Man, lists:map(fun from_R_to_01/1, XY)). 
4

변수 arity에 하나의 인수 만 지정하여 시뮬레이션 할 수 있습니다 (익명 또는 아님). 그런 다음 apply/2를 사용하여 평가할 수 있습니다.

귀하의 예 (시험 또는 전혀 최적화하지 않음) 할 수 물론

minn_man(F, Man) -> 
    OnRn = fun (L) -> 
     OnMan = apply(Man, [from_R_to_01(X) || X<-L]), 
     apply(F, OnMan) 
    end, 
Man([from_R_to_01(X) || X<-minn(OnRn)). 

같은이 남자도 적절한 형식의 값을 반환해야합니다.

관련 문제