panos deemac
panos deemac

Reputation: 101

Why my code (based on genetic algorithm optimtool) is unable to read a value as input?

I am using the MATLAB optimtool for genetic algorithm optimization.

I am opening a new script with the name 'm_0a4'
FitnessFunction = @m_0b4;
NumberOfVariables = 1;
[x,fval] = ga(FitnessFunction, numberOfVariables);%Here I minimize the difference y

I am opening a second new script naming it 'm_0b4'
function y = m_0b4(x)
prompt = 'write it down';
i = input(prompt) %the input value
y = x - i; % the variable I want to minimize

The functionnn m_0b4 request me for a value 'i' and I am typing the input,
The script m_0a4 of genetic algorithm calls the 'y'.

As I type the value, MATLAB keep on requesting me again for a value. When I am typing 'Enter' MATLAB brings me an error.

Assignment has more non-singleton rhs dimensions than non-singleton subscripts
Caused by: Failure in user-supplied fitness function evaluation. GA cannot continue.

I cant think why MATLAB doesn't understand that I give an input (for example the number 5). Is there any idea?

Thank you in advance!

Upvotes: 0

Views: 398

Answers (2)

BillBokeey
BillBokeey

Reputation: 3511

I think what you should do would be to ask the user for the input once before the call to ga.

In order for your function m_0b4 to take this input into account, you can declare FitnessFunction as an anonymous function of 1 argument :

Your new function :

function y = m_0b4(x,i)
y = x - i;
end

In the Main script :

prompt = 'write it down';
i = input(prompt)

% Declare your fitness function that will be executed with the input entered by the user 
FitnessFunction=@(x) m_0b4(x,i);

% Minimize
NumberOfVariables = 1;
[x,fval] = ga(FitnessFunction, NumberOfVariables);

Minor note (Major problem):

The function you're trying to minimize tends to -infinity when x tends to -infinity....


Working example (One that admits a minimum)

function y = m_0b4(x,i)
y = abs(x - i);
end

Result :

With an input i set to 20 (And a maximum of 100 generations) :

x =

20.012668610027522

fval =

0.012668610027522

Upvotes: 2

shamalaia
shamalaia

Reputation: 2351

I cannot say why your code does not work, but here a workaround:

function y = m_0b4(x)
i = input('write it down \n')
y = x - i;

Upvotes: 1

Related Questions