Реализация функции Шекеля в Matlab - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь написать более быстрый способ оценки функции Шекеля, найденной здесь: https://www.sfu.ca/~ssurjano/shekel.html

Их код очень похож на тот, который я использовал, за исключением того, что я передаю матрицу значений x вфункция и в конечном итоге с тремя циклами в элементе для расчета элемента.Matlab должен уметь работать лучше.

Это код, который я использовал ранее:

function S = Shekel(X,m)
[R,d] = size(X);
% R is the population size, m the number of minima, and d the dimensions

% input control %
if d > 4
    error('More than 4 dimensions !!')
end
if nargin==1
    m=10;
elseif (m > 10) || (m < 2)
    error('Wrong m')
end

% coefficients %
A = [4 4 4 4
     1 1 1 1
     8 8 8 8
     6 6 6 6
     3 7 3 7
     2 9 2 9
     5 5 3 3
     8 1 8 1
     6 2 6 2
     7 3.6 7 3.6];

c = [.1 .2 .2 .4 .4 .6 .3 .7 .5 .5];

S = zeros(R,1);
for r = 1:R
    s = 0;
    for i = 1:m
        denom = c(i);
        for j = 1:d
            denom = denom + (X(r,j) - A(i,j))^2;
        end
        s = s - 1/denom;
    end
    S(r) = s;
end

Существует также реализация R, которая похожа на то, что я хотел бы сделать:https://www.sfu.ca/~ssurjano/Code/shekelr.html

До сих пор я дошел до этого, но он такой же медленный, как и предыдущий, потому что я делаю то же самое:

S = zeros(R,1);
for r = 1:R
    %S(r) = -sum(1./(sum((repmat(X(r,:),m,1)-A).^2,2)'+c),2);
    S(r) = -sum(1./(sum((repmat(X(r,:),m,1)-A).^2,2).'+c),2);
end

Функция может быть вызванас этим и вы должны получить -0.3007:

clear

p = 40; m = 10; d = 4;
X = repmat([1 2 3 4], p, 1);
OF = @Shekel;
OF(X, m)

Может кто-нибудь предложить более быстрый способ сделать это?

PS.Функция используется для тестирования дифференциальной эволюции

РЕДАКТИРОВАТЬ: фактические операции (размер популяции = 2, измерения = 4, #minimums = 10)

X =

1.5381    0.7603    3.2619    7.7624
8.1874    1.9172    0.4234    5.0153

A =

4.0    4.0    4.0    4.0
1.0    1.0    1.0    1.0
8.0    8.0    8.0    8.0
6.0    6.0    6.0    6.0
3.0    7.0    3.0    7.0
2.0    9.0    2.0    9.0
5.0    5.0    3.0    3.0
8.0    1.0    8.0    1.0
6.0    2.0    6.0    2.0
7.0    3.6    7.0    3.6

repmat (X (1, ​​:), m, 1) -A

1.5381    0.7603    3.2619    7.7624        4.0    4.0    4.0    4.0
1.5381    0.7603    3.2619    7.7624        1.0    1.0    1.0    1.0
1.5381    0.7603    3.2619    7.7624        8.0    8.0    8.0    8.0
1.5381    0.7603    3.2619    7.7624        6.0    6.0    6.0    6.0
1.5381    0.7603    3.2619    7.7624    -   3.0    7.0    3.0    7.0
1.5381    0.7603    3.2619    7.7624        2.0    9.0    2.0    9.0
1.5381    0.7603    3.2619    7.7624        5.0    5.0    3.0    3.0
1.5381    0.7603    3.2619    7.7624        8.0    1.0    8.0    1.0
1.5381    0.7603    3.2619    7.7624        6.0    2.0    6.0    2.0
1.5381    0.7603    3.2619    7.7624        7.0    3.6    7.0    3.6

XA =

-2.4619   -3.2397   -0.7381    3.7624
 0.5381   -0.2397    2.2619    6.7624
-6.4619   -7.2397   -4.7381   -0.2376
-4.4619   -5.2397   -2.7381    1.7624
-1.4619   -6.2397    0.2619    0.7624
-0.4619   -8.2397    1.2619   -1.2376
-3.4619   -4.2397    0.2619    4.7624
-6.4619   -0.2397   -4.7381    6.7624
-4.4619   -1.2397   -2.7381    5.7624
-5.4619   -2.8397   -3.7381    4.1624

(repmat (X (1, ​​:), m, 1) -A). ^ 2
(XA) ^ 2

 6.0612   10.4955     0.5448    14.1560
 0.2895    0.0574     5.1162    45.7307
41.7568   52.4129    22.4495     0.0564
19.9090   27.4542     7.4971     3.1062
 2.1373   38.9335     0.0686     0.5813
 0.2134   67.8922     1.5924     1.5315
11.9851   17.9748     0.0686    22.6809
41.7568    0.0574    22.4495    45.7307
19.9090    1.5368     7.4971    33.2058
29.8329    8.0638    13.9733    17.3260

сумма ((repmat (X (1, ​​:), m, 1) -A). ^ 2,2). '
сумма транспонированных строк XA

31.2575  51.1939  116.6756  57.9665  41.7208  71.2296  52.7094  109.9944  62.1487  69.1959

c =

0.1  0.2  0.2  0.4  0.4  0.6  0.3  0.7  0.5  0.5

sum ((repmat (X (1, ​​:)), м, 1) -А). ^ 2,2). '+ с
сумма (Ха) + с

31.3575  51.3939  116.8756  58.3665  42.1208  71.8296  53.0094  110.6944  62.6487  69.6959

1 ./ (сумма ((repmat)(X (r, :), m, 1) -A). ^ 2,2). '+ C)
1 / сумма (XA) + c

0.0319  0.0195  0.0086  0.0171  0.0237  0.0139  0.0189  0.0090  0.0160  0.0143

-сумма (1 ./ (сумма ((repmat (X (1, ​​:), m, 1) -A). ^ 2,2). '+ C), 2)
шекель (X (1)) = -сумма (1 / сумма (XA) + c)

-0.1729

.. и т. д. для X (2)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...