Operator '<' is not supported for operands of type 'struct'.

6 views (last 30 days)
When I test this code which is shown below. I got an error of " Operator '<' is not supported for operands of type 'struct'. "
Error in untitled2 (line 157)
if NewSol.Cost < pop(i).Cost
. How can i solve this error?
clc;
clear all;
close all;
%% Problem Definition
% [lb,ub,D,fobj] = Get_Functions_details(Function_name); % The shifted functions' information
D = 2; % Number of Decision Variables
lb1=[2 0.001];
ub1=[33 0.5 ];
[ sLOSS,Busvoltage]=power_flow1()
n = 200; % Population Size
m = 2; % Number of search agenets in a group
%% Generate initial population of cheetahs (Algorithm 1, L#2)
empty_individual.Position = [];
empty_individual.Cost = [];
BestSol.Cost = sLOSS;
pop = repmat(empty_individual,n,1);
for i=1:n
pop(i).Position = lb1+rand.*(ub1-lb1);
pop(i).Position(1) = round(pop(i).Position(1));
end
for i=1:n
pop(i).Cost = power_flow_DG(pop(i).Position(1),pop(i).Position(2))
if pop(i).Cost < BestSol.Cost
BestSol.Cost = pop(i).Cost; % Initial leader position
end
end
%% Initialization (Algorithm 1, L#3)
pop1 = pop; % Population's initial home position
BestCost = []; % Leader fittnes value in a current hunting period
X_best = BestSol; % Prey solution sofar
Globest = BestCost; % Prey fittnes value sofar
%% Initial parameters
t = 0; % Hunting time counter (Algorithm 1, L#4)
it = 1; % Iteration counter(Algorithm 1, L#5)
MaxIt = D*10000; % Maximum number of iterations (Algorithm 1, L#6)
T = ceil(D/10)*60; % Hunting time (Algorithm 1, L#7)
FEs = 0; % Counter for function evaluations (FEs)
%% CO Main Loop
while FEs <= MaxIt % Algorithm 1, L#8
m = 1+randi (ceil(n/2));
i0 = randi(n,1,m); % select a random member of cheetahs (Algorithm 1, L#9)
for k = 1 : m % Algorithm 1, L#10
i = i0(k);
% neighbor agent selection (Algorithm 1, L#11)
if k == length(i0)
a = i0(k-1);
else
a = i0(k+1);
end
X = pop(i).Position; % The current position of i-th cheetah
X1 = pop(a).Position; % The neighbor position
Xb = BestSol%.Position; % The leader position
Xbest = X_best%.Position;% The pery position
kk=0;
% Uncomment the follwing statements, it may improve the performance of CO
if i<=2 && t>2 && t>ceil(0.2*T+1) && abs(BestCost(t-2)-BestCost(t-ceil(0.2*T+1)))<=0.0001*Globest(t-1)
X = X_best.Cost;
kk = 0;
elseif i == 3
X = BestSol.Cost;
kk = -0.1*rand*t/T;
else
kk = 0.25;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if mod(it,100)==0 || it==1
xd = randperm(numel(X));
end
Z = X;
%% Algorithm 1, L#12
for j = 1:1 % select arbitrary set of arrangements
%% Algorithm 1, L#13
r_Hat = randn; % Randomization paameter, Equation (1)
r1 = rand;
if k == 1 % The leader's step length (it is assumed that k==1 is associated to the leade number)
alpha = 0.001*t/T.*(ub1(j)-lb1(j)); % Step length, Equation (1) %This can be updated by desired equation
else % The members' step length
%alpha = 0.001 * t / T * abs(Xb.j - X.j) + 0.001 * round(double(rand > 0.9));
alpha = 0.001*t/T*abs(Xb(j).Cost-X(j))+0.001.*round(double(rand>0.9));%member step length, Equation (1)%This can be updated by desired equation
end
r = randn;
r_Check = abs(r).^exp(r/2).*sin(2*pi*r); % Turning factor, Equation (3)%This can be updated by desired equation
beta = X1(j)-X(j); % Interaction factor, Equation (3)
h0 = exp(2-2*t/T);
H = abs(2*r1*h0-h0);
%% Algorithm 1, L#14
r2 = rand;
r3 = kk+rand;
%% Strategy selection mechanism
if r2 <= r3 % Algorithm 1, L#15
r4 = 3*rand; % Algorithm 1, L#16
if H > r4 % Algorithm 1, L#17
Z(j) = X(j)+r_Hat.^-1.*alpha; % Search, Equation(1) (Algorithm 1, L#18)
else
Z(j) = Xbest(j).Cost+r_Check.*beta; % Attack, Equation(3) (Algorithm 1, L#20)
end
else
Z(j) = X(j); % Sit&wait, Equation(2) (Algorithm 1, L#23)
end
end
%% Update the solutions of member i (Algorithm 1, L#26)
% Check the limits
xx1=find(Z<lb1);
Z(xx1)=lb1(xx1)+rand(1,numel(xx1)).*(ub1(xx1)-lb1(xx1));
xx1=find(Z>ub1);
Z(xx1)=lb1(xx1)+rand(1,numel(xx1)).*(ub1(xx1)-lb1(xx1));
% Evaluate the new position
NewSol.Position = Z;
NewSol.Position(1)= round(NewSol.Position(1));
NewSol.Cost = power_flow_DG(NewSol.Position(1),NewSol.Position(2));
%NewSol.taille=pop.taille;
if NewSol.Cost < pop(i).Cost
pop(i).Cost = NewSol.Cost;
if pop(i).Cost < BestSol.Cost
BestSol = pop(i);
end
end
FEs = FEs+1;
end
t = t+1; % (Algorithm 1, L#28)
%% Leave the prey and go back home (Algorithm 1, L#29)
if t>T && t-round(T)-1>=1 && t>2
if abs(BestCost(t-1)-BestCost(t-round(T)-1))<=abs(0.01*BestCost(t-1))
% Change the leader position (Algorithm 1, L#30)
best = X_best.Cost;
j0=randi(D,1,ceil(D/10*rand));
% best(j0) = lb1(j0)+rand(1,length(j0)).*(ub1(j0)-lb1(j0));
BestSol.Cost = power_flow_DG(NewSol.Position(1),NewSol.Position(2));
BestSol.Position = best; % Leader's new position
FEs = FEs+1;
i0 = randi(n,1,round(1*n));
% Go back home, (Algorithm 1, L#30)
pop(i0(n-m+1:n)) = pop1(i0(1:m)); % Some members back their initial positions
pop(i).Cost = X_best; % Substitude the member i by the prey (Algorithm 1, L#31)
t = 1; % Reset the hunting time (Algorithm 1, L#32)
end
end
it = it +1; % Algorithm 1, L#34
%% Update the prey (global best) position (Algorithm 1, L#35)
if BestSol.Cost<X_best.Cost
X_best=BestSol;
end
BestCost(t)=BestSol.Cost;
Globest(1,t)=X_best.Cost;
%% Display
if mod(it,500)==0
disp([' FEs>> ' num2str(FEs) ' BestCost = ' num2str(Globest(t))]);
end
end
fit(run) = Globest(end) ;
mean_f = mean (fit);
std_f = std (fit);
% clc
toc
  1 Comment
Stephen23
Stephen23 on 2 Apr 2024
Edited: Stephen23 on 2 Apr 2024
We cannot run your code because you have not provided us with power_flow1.m
But you can tell us the classes of the structure content that you are comparing.
Note that bdata33bus.m and ldata33busmod4.m are not runnable Mfies, and thus the .m extension is very misleading. You should simply use a .txt extension and e.g. READMATRIX to import their data.

Sign in to comment.

Answers (1)

Constantino Carlos Reyes-Aldasoro
Hard to know the exact issue without access to all the code and variables but most probably it is because you cannot compare a struct, all of it, just specific fields, look at the following code:
a=3;
b=[1 2 3];
c.a =1; c.b=2;
a>1
ans = logical
1
b>1
ans = 1x3 logical array
0 1 1
% the following will create an error so let's use a try-catch
try
c>1
catch
disp('Error will be Operator ''>'' is not supported for operands of type ''struct''. ')
end
Error will be Operator '>' is not supported for operands of type 'struct'.
However, if you only try one field of the struct
c.a>1
ans = logical
0
That works, so look at the variable that you are trying to compare withy < and see if it is a struct. Then see which fields you need to compare and that should fix the problem.

Categories

Find more on Variables in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!