一个非遗传情况下的Matlab遗传算法



我从未使用过优化工具,但我认为我现在必须使用,所以我有点迷失了方向。使用@A给出的答案后。Donda,我注意到这可能不是最好的解决方案,因为每次我运行函数时,它都会给出不同的矩阵"pares",而且在大多数情况下,它会说我需要更多的评估。所以我想,也许我的问题的答案是遗传算法优化,但我又一次不知道如何使用它们。

我的第一个问题描述如下,答案由@A给出。唐达是唯一一个有答案的人。我真的需要完成这个优化,我不知道如何使用GA工具处理这个案例。

再次提前感谢你,谢谢你@A。唐达,谢谢你的回答。

按照要求,我试图将我试图解释的代码放在这里,我希望它会产生以下结果:

    function opt_pares
clear all; clc; close all;
h = randi(24,8760,1);
nd = randi(365,8760,1);
veic = randi(333,8760,1);
max_veic = max(veic);
veicN = veic./max_veic;
Gh = randi(500,8760,1);
Dh = randi(500,8760,1);
Ih = Gh-Dh;
A = randi([300 800], 27,1);
max_Gh = max(Gh);
max_Dh = max(Dh);
max_Ih = max(Ih);
lat = 70;
HRA =15.*(h-12);
decl = 23.27*sind(360*(284+nd)/365);
Ii = zeros(8760,27);
Di = zeros(8760,27);
Gi = zeros(8760,27);
pares = randi([0,90],27,2);
inclin = pares(:,1);
azim = pares(:,2);
% for MATRIZC
    for n=1:27
    Ii(:,n) = Ih.*(sind(decl).*sind(lat).*cosd(inclin(n))-sind(decl).*cosd(lat).*sind(inclin(n)).*cosd(azim(n))+cosd(decl).*cosd(lat).*cosd(inclin(n)).*cosd(HRA)+cosd(decl).*sind(lat).*sind(inclin(n)).*cosd(azim(n)).*cosd(HRA)+cosd(decl).*sind(inclin(n)).*sind(azim(n)).*sind(HRA));
    Di(:,n) = 0.5*Dh.*(1+cosd(inclin(n)));
    Gi(:,n) = (Ii(:,n)+Di(:,n))*A(n,1);
    end
Gparque = sum(Gi,2);
max_Gparque = max(Gparque);
GparqueN = Gparque./max_Gparque;
RMSE = sqrt(mean((GparqueN-veicN).^2));
% end
end

我不知道这是否可能,也许这一次我可以更加自信。

我的主要目标是实现尽可能好的RMSE,为此我必须创建一个矩阵("ares"),其中每行包含一对值(每列一个值)。

这些值必须在一定范围内(0-90)。对于这27对中的每一对,我必须计算"Ii"/"Gi"/"Di",得到一个大小为8760*27的矩阵。

然后我对"Gi"求和,得到"Gparque"(向量8760*1),最后计算"RMSE"。当我计算RMSE时,我必须将矩阵"pares"修改为其他值,以获得更好的RMSE。一旦有27个值的许多组合可以在0-90范围内,我必须找到一个解决方案,可以优化搜索,以获得最小RMSE。

代码中注释中的部分(带有"pares"的for循环)是我不知道如何做的事情,因为我必须更改"pares"的值,但有一些优化标准可以近似RMSE的最小值。

我希望这次我能更好地解释这个疑问。

非常感谢!

好的,下面是一个问题的尝试。我不确定结果最终会有多有用,因为我不了解潜在的问题,也没有真正的数据来测试它。

你需要一个优化算法,这是对的,你的问题似乎比简单的线性代数更复杂。为了进行优化,我使用了优化工具箱中的函数fminsearch

首先,需要定义其值要优化的函数(目标函数)。根据您的代码,这是

function RMSE = fun(pares)
    inclin = pares(:,1);
    azim = pares(:,2);
    Ii = zeros(8760,27);
    Di = zeros(8760,27);
    Gi = zeros(8760,27);
    for n=1:27
        Ii(:,n) = Ih.*(sind(decl).*sind(lat).*cosd(inclin(n))-sind(decl).*cosd(lat).*sind(inclin(n)).*cosd(azim(n))+cosd(decl).*cosd(lat).*cosd(inclin(n)).*cosd(HRA)+cosd(decl).*sind(lat).*sind(inclin(n)).*cosd(azim(n)).*cosd(HRA)+cosd(decl).*sind(inclin(n)).*sind(azim(n)).*sind(HRA));
        Di(:,n) = 0.5*Dh.*(1+cosd(inclin(n)));
        Gi(:,n) = (Ii(:,n)+Di(:,n))*A(n,1);
    end
    Gparque = sum(Gi,2);
    max_Gparque = max(Gparque);
    GparqueN = Gparque./max_Gparque;
    RMSE = sqrt(mean((GparqueN-veicN).^2));
end

现在我们可以调用

pares_opt = fminsearch(@fun, randi([0,90],27,2))

使用随机初始化。优化需要相当长的时间,因为目标函数没有非常有效地实现。这里有一个矢量化的版本,它做同样的事情:

% precompute
cHRA = cosd(HRA);
sHRA = sind(HRA);
sdecl = sind(decl);
cdecl = cosd(decl);
slat = sind(lat);
clat = cosd(lat);
function RMSE = fun(pares)
    % precompute
    cinclin = cosd(pares(:,1))';
    sinclin = sind(pares(:,1))';
    cazim = cosd(pares(:,2))';
    sazim = sind(pares(:,2))';
    Ii = bsxfun(@times, Ih, ...
        sdecl * (slat * cinclin - clat * sinclin .* cazim) ...
        + (cdecl .* cHRA) * (clat * cinclin + slat * sinclin .* cazim) ...
        + (cdecl .* sHRA) * (sinclin .* sazim));
    Di = 0.5 * Dh * (1 + cinclin);
    Gi = (Ii + Di) * diag(A);
    Gparque = sum(Gi,2);
    max_Gparque = max(Gparque);
    GparqueN = Gparque./max_Gparque;
    RMSE = sqrt(mean((GparqueN-veicN).^2));
end

我们还没有实现pares位于[0,90]内的约束。一种粗略的方法是插入以下行:

    if any(pares(:) < 0) || any(pares(:) > 90)
        RMSE = inf;
        return
    end

在目标函数的开头。

综合起来:

function Raquel
h = randi(24,8760,1);
nd = randi(365,8760,1);
veic = randi(333,8760,1);
max_veic = max(veic);
veicN = veic./max_veic;
Gh = randi(500,8760,1);
Dh = randi(500,8760,1);
Ih = Gh-Dh;
A = randi([300 800], 27,1);
lat = 70;
HRA =15.*(h-12);
decl = 23.27*sind(360*(284+nd)/365);
% precompute
cHRA = cosd(HRA);
sHRA = sind(HRA);
sdecl = sind(decl);
cdecl = cosd(decl);
slat = sind(lat);
clat = cosd(lat);
pares_opt = fminsearch(@fun, randi([0,90],27,2))

    function RMSE = fun(pares)
        if any(pares(:) < 0) || any(pares(:) > 90)
            RMSE = inf;
            return
        end
        % precompute
        cinclin = cosd(pares(:,1))';
        sinclin = sind(pares(:,1))';
        cazim = cosd(pares(:,2))';
        sazim = sind(pares(:,2))';
        Ii = bsxfun(@times, Ih, ...
            sdecl * (slat * cinclin - clat * sinclin .* cazim) ...
            + (cdecl .* cHRA) * (clat * cinclin + slat * sinclin .* cazim) ...
            + (cdecl .* sHRA) * (sinclin .* sazim));
        Di = 0.5 * Dh * (1 + cinclin);
        Gi = (Ii + Di) * diag(A);
        Gparque = sum(Gi,2);
        max_Gparque = max(Gparque);
        GparqueN = Gparque./max_Gparque;
        RMSE = sqrt(mean((GparqueN-veicN).^2));
    end
end

对于模拟数据,如果我在相同的随机化数据上运行两次优化,但初始值不同,我会得到不同的解决方案。这表明目标函数存在一个以上的局部极小值。希望真实数据不会出现这种情况。

相关内容

最新更新