4

Rnの関数/nの最小値を見つけるアルゴリズムがあります。そして、私は制約多様体を持っています。それは、特異な立方体の画像の形で与えられます。特異な立方体の内部空間をRnに、さらに重要なことにその逆にマッピングすることは非常に簡単であり、すべての座標に適用されたunar関数from_R_to_01を使用して実行できます。

したがって、私がやりたいのは、あるアリティのターゲット関数Fを取得し、同じアリティの別の関数を作成することです。これは、その座標がRnから制約マニフォールドManにマップされることを除いて、同じ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のアリティの無名関数を作成することです。これを行う方法がまったくわかりません。

4

2 に答える 2

4

リストである単一の引数を指定することによってのみ、可変アリティを持つ関数(匿名または非匿名)をシミュレートできます。次に、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 )).

もちろん、Manも適切な形式で値を返す必要があります。

于 2012-06-10T14:59:18.990 に答える
1

私はそれを持っていると思います!特定のアリティごとにOnRnを明示的に宣言する必要がある場合は、それらを作成しないでください。

最初に、単一の「caseMAof」ステートメントでunarとbinarMansの2つの別々の宣言を手動で記述しました。それから私は怠惰になり、Pythonを使用してこれらのすべてを生成しました。それから私はErlangに実行時に適切な宣言を生成して評価させるためのある種の評価を探しました。そして、ここにあります。チャームのように機能します。

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 ) ).
于 2012-06-12T18:33:37.253 に答える