**You are now following this question**

- You will see updates in your followed content feed.
- You may receive emails, depending on your communication preferences.

# Is there a way to reduce execution time of the following because it took 6 hours and still is executing?

2 views (last 30 days)

Show older comments

##### 1 Comment

Jan
on 20 Feb 2023

### Answers (1)

Torsten
on 20 Feb 2023

Edited: Torsten
on 20 Feb 2023

Are you sure you can use "ga" with stochastic inputs that change from iteration to iteration ? I doubt it.

Look up "stochastic optimization" instead.

##### 26 Comments

Sadiq Akbar
on 20 Feb 2023

Torsten
on 20 Feb 2023

Yes, I have been using it with stochastic inputs.

Yes, one can use it, but if one should use it for stochastic optimization is a different question. I wouldn't.

Sadiq Akbar
on 21 Feb 2023

Walter Roberson
on 21 Feb 2023

Sadiq Akbar
on 22 Feb 2023

Sadiq Akbar
on 22 Feb 2023

You had developed the above code for me. It works but it takes a lot of time. I had to shut it down before it completed because it took round about 10 hours but was still executing. If we do pre-allocation in this, I hope it will take less time. I did pre-allocation at the beginning of the code like this:

Runs=100;

onev=zeros(Runs,1);

tow11=zeros(Runs,dim);

twov=zeros(Runs,dim);

two=zeros(Runs,dim);

But then instead of getting 21 values of one, two, I get 100 values and also they are wrong. How can I do pre-allocation in the above code, so that I get total of 21 values (from noise=-10 to Noise=10)? and the code becomes speedy?

Sadiq Akbar
on 22 Feb 2023

Further, the profile on and viewer tells me that the following lines are not used:

options = optimoptions('ga','PopulationSize', PopulationSize_Data);

options = optimoptions('ga','MaxGenerations', MaxGenerations_Data);

options = optimoptions('ga','FunctionTolerance', FunctionTolerance_Data);

options = optimoptions('ga','ConstraintTolerance', ConstraintTolerance_Data);

options = optimoptions('ga','CreationFcn', @gacreationuniform);

options = optimoptions('ga','CrossoverFcn', { @crossoverheuristic [] });

options = optimoptions('ga','MutationFcn', @mutationadaptfeasible);

But I want to use them because i want to tell 'ga' these these are the options, run according to these options. So what to do so that these are also in use?

Walter Roberson
on 22 Feb 2023

Each of those lines completely overwrites the previous options. To add additional options you should be using

options = optimoptions(options,'MaxGenerations', MaxGenerations_Data);

options = optimoptions(options,'FunctionTolerance', FunctionTolerance_Data);

and so on. Use 'ga' as the first parameter in the first optimoptions call, but use the previous options as the first parameter for the remaining calls.

Note that you can add multiple options in the same call.

Sadiq Akbar
on 23 Feb 2023

Walter Roberson
on 23 Feb 2023

Please post your current options setting code.

You should also consider that you are setting specific creation and crossover and mutation functions; those are not necessarily going to be better for your particular problem.

Sadiq Akbar
on 23 Feb 2023

Edited: Sadiq Akbar
on 23 Feb 2023

PopulationSize_Data=100;

MaxGenerations_Data=500;

FunctionTolerance_Data=1e-25;

ConstraintTolerance_Data=1e-25;

options = optimoptions('ga','PopulationSize', PopulationSize_Data);

options = optimoptions(options,'MaxGenerations', MaxGenerations_Data);

options = optimoptions(options,'FunctionTolerance', FunctionTolerance_Data);

options = optimoptions(options,'FunctionTolerance', FunctionTolerance_Data);

options = optimoptions(options,'ConstraintTolerance', ConstraintTolerance_Data);

options = optimoptions(options,'CreationFcn', @gacreationuniform);

options = optimoptions(options,'CrossoverFcn', { @crossoverheuristic [] });

options = optimoptions(options,'MutationFcn', @mutationadaptfeasible);

options = optimoptions(options,'Display', 'off');

Walter Roberson
on 23 Feb 2023

That is a very small tolerance unless your function values are on the order of 1e-12

Sadiq Akbar
on 23 Feb 2023

Sadiq Akbar
on 23 Feb 2023

I changed the values of:

FunctionTolerance_Data=1e-25;

ConstraintTolerance_Data=1e-25;

to the following:

FunctionTolerance_Data=1e-6;

ConstraintTolerance_Data=1e-6;

But still the results are degraded.

Walter Roberson
on 23 Feb 2023

Please document this section of code in more detail:

%%%%%%%%%%%%%%%%%%%%%%

% Swapping

%%%%%%%%%%%%%%%%%%%%%%

[~, ix] = sort(u);

[~, ix1(ix)] = sort(twov(nn,:));

two(nn,:) = twov(nn,ix1);

along with

%%%%%%%%%%%%%%%%%%%%

% Swapping vector b

%%%%%%%%%%%%%%%%%%%%

[~, ix] = sort(u);

[~, ix1(ix)] = sort(b);

b = b(ix1);

u is a constant vector so the order of u is always the same. It is not clear why you want to do all of that. The only different the order makes is that for part of your calculation, you only use the first half of u .

Sadiq Akbar
on 24 Feb 2023

%%%%%%%%%%%%%%%%%%%%%%

% Swapping

%%%%%%%%%%%%%%%%%%%%%%

[~, ix] = sort(u);

[~, ix1(ix)] = sort(twov(nn,:));

two(nn,:) = twov(nn,ix1);

This re-arranges the elements of vector twov in the same order as is the order of vector u. I do this because usually the elements of vector twov are not in the same order as is my vector u.

%%%%%%%%%%%%%%%%%%%%

% Swapping vector b

%%%%%%%%%%%%%%%%%%%%

[~, ix] = sort(u);

[~, ix1(ix)] = sort(b);

b = b(ix1);

As 'GA' generates random vectors of same size as u is. So the order of the elements of those random vectors are not the same as is of u. So I use this code to make the order of each random vector of GA like that of u. Because if you see inside the function 'Vectorized.m', you will see the root mean sqaure error formula as:

e=norm(yo-ye).^2/(M*N);

If the sent random vector by GA to the function 'Vectorized.m' is not of the same order as u, then definitely the order of yo and ye are also different. So in that case the calculated root mean sqaure error value will be wrong. So to avoid this 1st I re-arrange the sent vector by GA like that of vector u.

Walter Roberson
on 24 Feb 2023

As 'GA' generates random vectors of same size as u is.

ga() generates in the same order as lb / ub so if you want a different order then reorder your lb / ub and the statements that access the entries of the vector.

Sadiq Akbar
on 25 Feb 2023

Edited: Sadiq Akbar
on 25 Feb 2023

ga() generates in the same order as lb / ub: I don't agree to this statement. I doubt you take the meaning of order as 'Rows x Colmns'. But I don't mean that. By order I mean the arrangemet of elements. For demonstration purpose, you just type the following commands in a script file say for example 'abc.m'.

u=[-34, 34, -50, 50, -45, 45, -65, 65];

dim=length(u);

lb=-90*ones(1,dim);

ub=90*ones(1,dim);

PopulationSize_Data=100;

MaxGenerations_Data=500;

FunctionTolerance_Data=1e-20;

ConstraintTolerance_Data=1e-20;

options = optimoptions('ga','PopulationSize', PopulationSize_Data);

options = optimoptions('ga','MaxGenerations', MaxGenerations_Data);

options = optimoptions('ga','FunctionTolerance', FunctionTolerance_Data);

options = optimoptions('ga','ConstraintTolerance', ConstraintTolerance_Data);

[B,fval] = ga(@(b)Vectorized(b,u,Noise(mm)), dim,[],[],[],[],lb,ub,[],options)

and also make a separate m-file for the following function:

%%%%%%%%%%%%%%%%%%%%%%

% Vectorized function

%%%%%%%%%%%%%%%%%%%%%%

function e=Vectorized(b,u,Noise)

M = 10;%Constant1

N = 10;%Constant2

d = 0.5;%Constant3

K = length(u)/2;%Constant4

alpha=ones(1,K);%Constant5

%%%%%%%%%%%%%%%%%%%%

% yo calculation

%%%%%%%%%%%%%%%%%%%

ho=(1:M)';

po=(1:N)';

i=1:K;

bro = u(:).';

ao=exp(1j*2*pi*(ho-1)*d.*sind(bro(i))); % ao calculation

fo=exp(1j*2*pi*(po-1)*d.*sind(bro(K+i))); % fo calculation

co = reshape(reshape(ao,1,[],K).*reshape(fo,[],1,K),[],K);% co calculation

yo=co*alpha'; % yo calculation

yo=awgn(yo,Noise);% ao calculation with noise

%%%%%%%%%%%%%%%%%%%%%%

% ye calculation

%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%

% Swapping vector b

%%%%%%%%%%%%%%%%%%%%

% [~, ix] = sort(u);

% [~, ix1(ix)] = sort(b);

% b = b(ix1);

bre = b(:).';

ae=exp(1j*2*pi*(ho-1)*d.*sind(bre(i)));

fe=exp(1j*2*pi*(po-1)*d.*sind(bre(K+i)));

ce = reshape(reshape(ae,1,[],K).*reshape(fe,[],1,K),[],K);

ye=ce*alpha';

%%%%%%%%%%%%%%%%%

% MSE

%%%%%%%%%%%%%%%%%

e=norm(yo-ye).^2/(M*N);

end

Now run the script file 'abc.m' and compare the result of 'B' with u. Do you see that B is in the same order as is u. Again by order I mean the arrangement of elements.

Likewise, run the script file 'abc.m' for the 2nd time and again compare B with u.Do you see that B and u have same order. I mean the arrangement of elements in both B and u is the same? Definitly not. you will see that some time the order(arrangement of elelents) is same and some time different. So to ensure it that they are alwasy in the same order(arrangement), I use the mentioned pice of code.

Sadiq Akbar
on 25 Feb 2023

Consider the following:

u=[10 20 30 40];

B=[9.9 20.1 30.01 39.9];

Error=u-B;

MSE=mean(Error.^2)

MSE=0.0075

Now if B=[39.9 30.01 20.1 9.9], then the Error and the mean sqaure error are as:

u=[10 20 30 40];

B=[39.9 30.01 20.1 9.9];%B=[9.9 20.1 30.01 39.9];

Error=u-B;

MSE=mean(Error.^2)

MSE=499.5575

See that there is a lot of difference between the two MSE. That's why I use the mentioned piece of code to be ensured that both u and B are having the same order i.e., arrangement.

Walter Roberson
on 25 Feb 2023

I copied your code and tested. I had to add definitions for mm and Noise but I could run after that.

Just as I expected, the generated values passed in as the first parameter to Vectorized are in the same order as the constraints expressed in lb / ub. All of your lb are the same as each other, and all of your ub are the same as each other.

If you need random values that match in order with what is in u then what you should do is

u=[-34, 34, -50, 50, -45, 45, -65, 65];

u = sort(u);

A = eye(8) + diag(-ones(1,7),1);

A = A(1:7,:);

B = zeros(7,1);

[B,fval] = ga(@(b)Vectorized(b,u,Noise(mm)), dim, A, B, [], [], lb, ub, [], options)

The A B is to construct a matrix similar to

1 -1 0 0 0 0 0 0

0 1 -1 0 0 0 0 0

0 0 1 -1 0 0 0 0

which is being used to express b(K) - b(K+1) <= 0 -- which is another way to write b(K) <= b(K+1) which is the requirement that the b entries are in increasing order and so matching the now-sorted u values.

You currently have

i=1:K;

and things like ao=exp(1j*2*pi*(ho-1)*d.*sind(bro(i))); % ao calculation which selects particular elements of bro (which is in turn the input u) . That is in the context where your original u is alternating pairs negative and positive. I do not understand why you are extracting only the first half of u for those purposes -- but if you need to preserve that kind of sub-selection of u then you can calculate the appropriate indices ahead of time and pass them into Vectorized .

Sadiq Akbar
on 25 Feb 2023

Thanks a lot for your kind response dear Walter Roberson. Actually 'GA' generates its random population of vectors having the same size as u.And then it sends each member of that generated population to the function 'Vectorized.m' .So, we don't know in advance each memebr. That's why we re-arrange them inside the function 'Vectorized.m'. Further, I am not talking about lb and ub. They are passed as they are.No problem in that. I am re-stating that it is the generated vector by GA whose order (i.e., arrangement of elements) is some times different and some time same as u (not lb or ub). However, what you are saying is beyond my understanding. If you can do it, then please do it for me.

If you need random values that match in order with what is in u : Yes, I want that but I don't want to generate it myself. I am interested in those values which are gnerated by GA itself.

which is the requirement that the b entries are in increasing order and so matching the now-sorted u values: Here you are misunderstanding it. The values of u are not in increasing order. These values may be any real number like:

u=[-34, 34, -50, 50, -45, 45, -65, 65];

u=[3, 4, 0, 5, -4, 5, -5, 6];

u=[0, 4, -5, 0, -45, 59, -65, 65];

u=[1,, 2, 0, 5, -4, 45, 5, 15];

etc.

What I want?

I want that whatever values are put in vector u, the same values or nearly the same values and in the same arrangement should be returned by GA to me.

Walter Roberson
on 25 Feb 2023

### See Also

### Categories

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!**An Error Occurred**

Unable to complete the action because of changes made to the page. Reload the page to see its updated state.

Select a Web Site

Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .

You can also select a web site from the following list

How to Get Best Site Performance

Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.

Americas

- América Latina (Español)
- Canada (English)
- United States (English)

Europe

- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)

- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)

Asia Pacific

- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)