在与 str2func 兼容的 Matlab 中生成随机闭合形式表达式

问题描述 投票:0回答:1

是否有 Matlab 代码可以生成随机闭合形式表达式作为与 str2func 兼容的表示法中的字符串?

给定一个函数和终端单元以及最大字符串长度,这是遗传编程的初始化任务,但使用 str2func 兼容字符串而不是树表示。

如果不是直接可能间接地进一步转换字符串输出。 例如,遗传编程中的初始化方法(如“full”或“grow”[1])会生成无法由 str2func 处理的前缀表示法表达式,因此需要进行额外的转换。

[1]波利,里卡多;兰登,威廉·B.; McPhee,Nicholas Freitag:遗传编程现场指南。 2008 年,第 14 页

matlab
1个回答
0
投票

您将需要提供更多信息。

但是,在 MATLAB 中使用

str2func
观察您想要生成随机封闭形式表达式的内容。为此,您需要

  • 定义一组在表达式中使用的函数和变量。
  • 递归或迭代构建表达式

这是一个例子:

function expr = generateRandomExpr(maxDepth, funcSet, terminalSet)
    % Generate random closed-form expressions recursively
    if maxDepth == 0
        % Base case: choose a terminal (variable or constant)
        expr = terminalSet{randi(numel(terminalSet))};
    else
        % Randomly choose to add a function or terminal
        if rand < 0.5 || maxDepth == 1
            expr = terminalSet{randi(numel(terminalSet))};
        else
            % Choose a function from the function set
            func = funcSet{randi(numel(funcSet))};
            numArgs = nargin(func); % Get the number of arguments for the function
            
            % Recursively generate expressions for function arguments
            args = cell(1, numArgs);
            for i = 1:numArgs
                args{i} = generateRandomExpr(maxDepth - 1, funcSet, terminalSet);
            end
            
            % Construct the expression as a string
            expr = [func '(' strjoin(args, ',') ')'];
        end
    end
end

% Example usage:

% Define your set of possible functions and terminals
funcSet = {@sin, @cos, @exp, @log, @(x, y) x + y, @(x, y) x * y}; % Operators and math functions
terminalSet = {'x', 'y', '1', '2', '3'}; % Variables and constants

% Generate random expressions of varying complexity
maxDepth = 3; % Set the maximum depth of the expression tree
randomExpr = generateRandomExpr(maxDepth, funcSet, terminalSet);

% Convert the generated string into a function handle
f = str2func(['@(x, y) ' randomExpr]);

% Display the random expression and function handle
disp(['Random Expression: ', randomExpr]);
disp(f);

这应该生成一个输出:

Random Expression: sin(exp(x))
f = 
  function_handle with value:
    @(x,y)sin(exp(x))

您的函数集(包括

sin
cos
exp
等函数)被定义为用于构建随机表达式的匿名函数。

您的终端集,其中包括常量和变量,例如

x
y
等,用作终端。

递归生成器是递归构造的表达式。根据递归深度,它们要么是集合中的函数,要么是终结符。

您的表达式构造是表示表达式的字符串的结果,可以将其传递给您的

str2func

如果您要重新格式化您的问题,我将编辑或删除我的帖子以简化问题。

© www.soinside.com 2019 - 2024. All rights reserved.