Search code examples
matlabgenetic-algorithm

Matlab Optimisation - Minimise objective function using genetic algorithm


I want to set up the generic algorithm for a function that includes roughly 400 lines of script. The script itself is an optimisation process and I want to use the genetic algorithm to find the best input parameters into the optimisation process (M and OPratio). M lies between 0 and 10^7 and OPratio between 0 and 1. The function of the script is:

 NPVtotal = cut_off_optimisation(M,OPratio)

set up for the genetic algorithm:

nvars = 2;    % Number of variables
LB = [0 0];   % Lower bound
UB = [10000000 1];  % Upper bound
X0 = [6670000 0.45]; % Start point 
options.InitialPopulationMatrix = X0;
[M,OPratio,fval] = ga(cut_off_optimisation(M,OPratio),nvars,[],[],[],[],LB,UB)

I get following error:

Undefined function or variable 'M'.

I am new to optimisation and the genetic algorithm so would appreciate any help, please let me know if more information is necessary.


Solution

  • First of all I am assuming that the objective is to minimize the Objective function cut_off_optimisation.

    Now first update your function to look like this

    function y = cut_off_optimisation(x)    
    M=x(1);
    OPratio=x(2);
    
    %
    % paste body of your currently used function here
    %
    
    y=NPVtotal ;
    

    Now use this code to minimize your objective function.

    nvars = 2;    % Number of variables
    LB = [0 0];   % Lower bound
    UB = [10000000 1];  % Upper bound
    X0 = [6670000 0.45]; % Start point 
    options = gaoptimset('PlotFcns',{@gaplotbestf},'Display','iter','InitialPopulation',X0);
    [x,fval] = ga(@cut_off_optimisation,nvars,[],[],[],[],...
                  LB,UB,[],options);
    M=x(1);
    OPratio=x(2);
    

    Update: If you don't want to update your function. Just run this main code. Keep the function NPVtotal = cut_off_optimisation(M,OPratio) in the same folder as that of the main code.

    objectiveFunction=@(x)cut_off_optimisation(x(1),x(2));
    nvars = 2;    % Number of variables
    LB = [0 0];   % Lower bound
    UB = [10000000 1];  % Upper bound
    X0 = [6670000 0.45]; % Start point 
    options = gaoptimset('PlotFcns',{@gaplotbestf},'Display','iter','InitialPopulation',X0);
    [x,fval] = ga(objectiveFunction,nvars,[],[],[],[],...
                  LB,UB,[],options);
    M=x(1);
    OPratio=x(2);
    fval
    M
    OPratio
    

    Update: For getting final population members and fitness values. Replace the above ga function call statement to below statement.

    [x,fval,exitflag,output,population,score] = ga(objectiveFunction,nvars,[],[],[],[],LB,UB,[],options);
    M=x(1);
    OPratio=x(2);
    

    In here population will have the members of the final population and score will have fitness values for the final population. Default population size is 20. So you will have 20 rows in both the matrix. Number of columns in population will be equivalent to number of variables in the problem and score will be a column matrix. You can change the population size by adding option PopulationSize to gaoptimset.

    options = gaoptimset('PlotFcns',{@gaplotbestf},'Display','iter','InitialPopulation',X0,'PopulationSize',30);
    

    To know more about the options available for gaoptimset and their expected values and their {default values}. Go to matlab help and search for gaoptimset. There you will find a table with all these details. Here is the link from matlab website http://in.mathworks.com/help/gads/gaoptimset.html .There may be changes according to your matlab version. So its better to use help in matlab.