can anyone help me about Error using optim.problemdef.OptimizationProblem/solve Invalid argument at position 2. Value must be finite.
2 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
when i use optimization toolbox, i get this errors:
Error using optim.problemdef.OptimizationProblem/solve
Invalid argument at position 2. Value must be finite.
Error in structureOpt (line 23)
[vv,sol,fval,exitflag,output] = solve(prob,x0,'Solver','ga','Options',options);
Caused by:
Failure in user-supplied fitness function evaluation.
Cannot continue.
Failure in initial user-supplied fitness function
evaluation. GA cannot continue.
I really can't find what goes wrong, The attachment is my program
thank you very much!
ub=[];
for i = 1:48
ub=[ub,'1'];
end
vv=optimvar('vv','LowerBound',0,'UpperBound',bin2dec(ub),'Type','integer');
[jc,rrc,allrea,allima,~]=fcn2optimexpr(@problemfun,vv);
prob=optimproblem;
prob.ObjectiveSense='maximize';
prob.Objective=jc;
tol=0.1;
prob.Constraints.rrc1=rrc-tol-6<=0;
prob.Constraints.rrc2=rrc-6+tol>=0;
prob.Constraints.allrea=allrea>=0;
prob.Constraints.allima=allima>=0; %'FunctionTolerance', 1e-8, ...
options=optimoptions(@ga,'PopulationSize', 150, ...
'MaxGenerations', 400, ...
'EliteCount', 10, ...
'PlotFcn',@gaplotbestf);
rng default
x0.vv=randperm(bin2dec(ub),1);
problemfun(x0)
[vv,sol,fval,exitflag,output] = solve(prob,x0,'Solver','ga','Options',options);
% rng default
% x0.vv=randperm(bin2dec(ub),1);
% [vv,sol,fval,exitflag,output] = solve(prob);
function h1=form_h(v,map,text3,nloc)
class(v)
nodestr=dec2bin(v);
nodenum=strfind(nodestr,'1')+6;
aa=zeros(6,9);
for j=1:6
aa1=j;
for i=1:5
aa(j,i)=aa1+6*(i-1);
end
end
for j=1:6
aa1=30+(j-1)*(1+2*4);
for i=1:4
aa(j,5+i)=aa1+i*2;
end
end
a4=[1+4*6 2+4*6 3+4*6 4+4*6 5+4*6 6+4*6];
[lia1,~]=ismember(aa(1,:),nodenum(1,1));
[lia2,~]=ismember(aa(2,:),nodenum(1,1));
[lia3,~]=ismember(aa(3,:),nodenum(1,1));
[lia4,~]=ismember(aa(4,:),nodenum(1,1));
[lia5,~]=ismember(aa(5,:),nodenum(1,1));
[lia6,~]=ismember(aa(6,:),nodenum(1,1));
[lia7,~]=ismember(a4,nodenum(1,end));
if sum(lia1)
nodenum=[2,nodenum];
elseif sum(lia2)
nodenum=[1,nodenum];
elseif sum(lia3)
nodenum=[4,nodenum];
elseif sum(lia4)
nodenum=[3,nodenum];
elseif sum(lia5)
nodenum=[6,nodenum];
else
nodenum=[5,nodenum];
end
if lia7==0
[lia1,~]=ismember(aa(1,:),nodenum(1,end));
[lia2,~]=ismember(aa(2,:),nodenum(1,end));
[lia3,~]=ismember(aa(3,:),nodenum(1,end));
[lia4,~]=ismember(aa(4,:),nodenum(1,end));
[lia5,~]=ismember(aa(5,:),nodenum(1,end));
[lia6,~]=ismember(aa(6,:),nodenum(1,end));
if sum(lia1)
nodenum=[nodenum,2+4*6];
elseif sum(lia2)
nodenum=[nodenum,1+4*6];
elseif sum(lia3)
nodenum=[nodenum,4+4*6];
elseif sum(lia4)
nodenum=[nodenum,3+4*6];
elseif sum(lia5)
nodenum=[nodenum,6+4*6];
else
nodenum=[nodenum,5+4*6];
end
end
h=zeros(size(map,1),size(nodenum,2)-1);
a=nloc(nodenum(1,1),:)-nloc(nodenum(1,2),:);
a=a/norm(a);
b=nloc(nodenum(1,3),:)-nloc(nodenum(1,2),:);
b=b/norm(b);
c=(nodenum(1,2)-1)*6;
h(c+1:c+3,1)=(a+b)';
for i=3:size(nodenum,2)-1
a=nloc(nodenum(1,i-1),:)-nloc(nodenum(1,i),:);
b=nloc(nodenum(1,i+1),:)-nloc(nodenum(1,i),:);
a=a/norm(a);
b=b/norm(b);
c=(nodenum(1,i)-1)*6;
h(c+1:c+3,i-1)=(a+b)';
end
a=nloc(nodenum(1,end-1),:)-nloc(nodenum(1,end),:);
a=a/norm(a);
c=(nodenum(1,end)-1)*6;
h(c+1:c+3,end)=a';
[a,b]=sort(map(:,2));
h1=h(b,:);
end
function [jc,rrc,allrea,allima,hc]=problemfun(vv)
load('data.mat');
alp=0.01;
bet=0.01;
cc=alp*mm+bet*kk;
n=size(mm,1);
sys.n=n;
[V,D] = eig(kk,mm);
[lambda,ki]=sort(diag(D));
V=V(:,ki);
num=3;
Vc=V(:,1:num);
mc=Vc'*mm*Vc;
kc=Vc'*kk*Vc;
ccc=Vc'*cc*Vc;
hc=form_h(vv,map,text3,nloc);
A=[zeros(size(mc,1)),eye(size(mc,1));
-1*inv(mc)*kc,-1*inv(mc)*ccc];
B=[zeros(size(mc,1),size(hc,2));
inv(mc)*Vc'*hc];
X=lyap(A,B*B');
[~,b]=eig(X);
jc=trace(X)*geomean(diag(b))/std(diag(b));
rc=[];
for i=1:size(A,1)
rc=[rc,A^(i-1)*B];
end
rrc=rank(rc);
[~,ba]=eig(A);
ba=diag(ba);
rea=real(ba);
ima=imag(ba);
allrea=all(rea);
allrea=min(abs(allrea))-1;
allima=ima<=0;
allima=all(allima);
allima=min(abs(allima))-1;
end
0 commentaires
Réponse acceptée
Torsten
le 8 Août 2023
Déplacé(e) : Torsten
le 8 Août 2023
Above your error - written out more clearly so that you as the coder should be able to understand the problem.
In
nodestr=dec2bin(v);
v is of class "struct", but it must be of class "numeric", "logical" or "char".
And you know that "ga" expects a double scalar value to be returned from "problemfun" ? jc is taken as this value from "ga". Is this your intention ?
1 commentaire
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Get Started with Optimization Toolbox dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!