2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Генетические и др. алгоритмы в Matlab: неэффективность?
Сообщение04.01.2022, 21:05 
Ниже приведён код, использую версию R2015b.
Вкратце: есть булевый вектор $x$, состоящий всего из 20000 координат, нам надо найти, при каких значениях его длина максимальна.
Понятно, что каждая его координата должна быть равна 1, а не 0.
Но в Matlab ни генетический алгоритм, ни метод обжига не могут справиться с такой простой задачей, застревают очень далеко от оптимума.
Результаты улучшаются разве что при выборе начального вектора, более близкого к оптимальному, но и там застревают достаточно быстро.
Что это: ошибка пользователя и программного кода или баг в самом Matlab?

Вот результат когда, а ниже сам код.

код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
x_ga = DummyClass.findOptimumGA( 100, 0.5 ); x_sa = DummyClass.findOptimumSA( 1000, 0.5 );

Optimization terminated: maximum number of generations exceeded.
array len:     20000
result sum:    12122             % почему хотя бы не >19000?
non-zero rate: 0.606100      % почему хотя бы не >0.95?

Maximum number of iterations exceeded: increase options.MaxIter.
array len:     20000
result sum:    10038             % почему хотя бы не >19000?
non-zero rate: 0.501900      % почему хотя бы не >0.95?

x_ga = DummyClass.findOptimumGA( 100, 0.3 ); x_sa = DummyClass.findOptimumSA( 1000, 0.3 );

Optimization terminated: average change in the penalty fitness value less than options.TolFun
and constraint violation is less than options.TolCon.
array len:     20000
result sum:    13968             % почему хотя бы не >19000?
non-zero rate: 0.698400      % почему хотя бы не >0.95?

Maximum number of iterations exceeded: increase options.MaxIter.
array len:     20000
result sum:    13960              % почему хотя бы не >19000?
non-zero rate: 0.698000       % почему хотя бы не >0.95?
 



код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
classdef DummyClass
    properties
    end;

    properties ( Constant )
    end;

    methods ( Static )
        function [ resultOptimum ] = optfunc( x )
            resultOptimum = -( x * x' );
        end;
       
        function [ x_par ] = findOptimumGA( MaxIter, a )
            objectiveFunction = @( x ) DummyClass.optfunc( x );
            x0 = round( rand( 1, 20000 ) > a );
            lb = zeros( size( x0 ) );
            ub = ones( size( x0 ) );
           
            opts = gaoptimset( 'TolFun', 1e-40 );
            opts = gaoptimset( opts, 'PlotFcns', @gaplotbestf );
            opts = gaoptimset( opts, 'Generations', MaxIter );
            opts = gaoptimset( opts,'InitialPopulation', x0 );
           
            [x_par, fval, exitflag] = ga( objectiveFunction, numel(lb), [], [], [], [], lb, ub, [], 1 : numel(lb), opts);

            fprintf( 'array len:     %5d\n', numel( x_par ) );
            fprintf( 'result sum:    %5d\n', sum( x_par ) );
            fprintf( 'non-zero rate: %f\n', mean( 0 ~= x_par ) );
        end;
       
        function [ x_par ] = findOptimumSA( MaxIter, a )
            objectiveFunction = @( x ) DummyClass.optfunc( x );
            x0 = round( rand( 1, 20000 ) > a );
            lb = zeros( size( x0 ) );
            ub = ones( size( x0 ) );

            options = saoptimset('MaxIter', MaxIter );
            [x_par, fval, exitFlag, output] = simulannealbnd( objectiveFunction, x0, lb, ub, options);

            fprintf( 'array len:     %5d\n', numel( x_par ) );
            fprintf( 'result sum:    %5d\n', sum( x_par ) );
            fprintf( 'non-zero rate: %f\n', mean( 0 ~= x_par ) );
        end;
    end;
end
 

 
 
 
 Re: Генетические и др. алгоритмы в Matlab: неэффективность?
Сообщение08.01.2022, 19:12 
Я сам писал генетику в матлабе. Готовая функция работает неважно.

 
 
 [ Сообщений: 2 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group