4

我有一个算法可以在 Rn 上找到函数/n 的最小值。我有一个约束流形,它以奇异立方体图像的形式给出。将奇异立方体内部空间映射到 Rn,更重要的是反之亦然,这非常简单,可以通过将 unar 函数 from_R_to_01 应用于每个坐标来完成。

所以我想要做的是获取我的目标函数 F 的某个元数,并制作另一个具有相同元数的函数,这将是相同的 F,除了它的坐标将从 Rn 映射到约束流形 Man。因此,我可以将它提供给我的最小化算法,在 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,我为什么不制作它们。

首先,我在一个“case MA of”语句中手动为 unar 和 binar Mans 编写了两个单独的声明。然后我变得懒惰并使用python为我生成了一大堆这些。然后我寻找某种 eval 来让 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 回答