1

我正在努力为 matlab 中的全局优化工具箱编写一个完全参数化的适应度函数。

方法:

[x fvall,exitflag,output]=ga(fitnessfcn,nvars,A,b,Aeq,beq,lb,ub)

我有一个我调用的健身功能

fitnessfcn=@fitnessTest;

因此,该函数在单独的文件中说明。

问题: 我现在的问题是我的优化是一个简单但超长的总和,例如

成本=f1*x1+f2x2+...fnxn

n 应该被参数化(目前为 384)。在所有 matlab 帮助文件中,目标函数总是简短而整洁,例如

y = 100 * (x(1)^2 - x(2)) ^2 + (1 - x(1))^2;

我尝试了几种智能“编写”目标函数的方法,但是,我无法正确调用该函数:

如果我手动编写适应度函数(对于 fi=1)

function y = simple_fitness(x)
y = x(1)+ x(2)+ x(3)+ x(4)+ x(5)+ x(6)+ x(7)+ x(8);

全局优化工作

但是,如果我使用我的自动化方法:

    n = 8; %# number of function handles
parameters = 1:1:n;
store = cell(2,3);

for i=1:n
  store{1,i} = sprintf('x(%i)',parameters(i));
  store{2,i} = '+'; %# operator
end

%# combine such that we get
%# sin(t)+sin(t/2)+sin(t/4)
funStr = [store{1:end-1}];%# ignore last operator

endFunction=';';

%functionHandle = str2func(funStr)
y=strcat(funStr,endFunction)

matlab 无法正确识别函数:

错误:

下标分配尺寸不匹配。

fcnvectorizer 中的错误(第 14 行)y(i,:) = feval(fun,(pop(i,:)));

谢谢!我无法手动编写目标函数,因为我将有数百个变量。

4

1 回答 1

1

您可以使用函数句柄直接使用 sum(x),而不是编写所有索引,执行:fitnessfcn = @(x) sum(x)

于 2013-07-31T18:13:52.917 回答