dinkelbach algorithm with fmincon for maximization problem
23 次查看(过去 30 天)
显示 更早的评论
Hello,
I am working on a fractional programming optimization problem and I used dinkelbach algorithm to solve it. I implemented dinkelbach with fmincon to solve the maximization problem. I have nonlinear constraints in form of log(1+Y)>=rj to define the minimum values. The problem is that each time I raise the minimum value I got lower results than the previous execution (normally the opposite shall happen).
Any help or advices will be helpful.
4 个评论
Torsten
2016-1-11
Does your problem only have one optimal solution (i.e. local maximum = global maximum) ? If not, this could explain the unsystemaic solution behaviour.
Best wishes
Torsten.
Samaneh Bidabadi
2021-8-19
Hello,
I also have almost the similar problem. The optimal solution (x and fval) and also the value of lambda for Dinkelbach's algorithm do not chage in every iteration. Any suggestions would be greatly appreciated. Please consider the attached files.
The written matlab code is as follows:
function [EE,p,B,p_F,B_F] = Dinkelbachalgorithm(F,H,G,q,w,Phi,d,Beta,c,a)
M=1e8;
Delta=(B_max*log(1+(P_max*abs(F)^2)/(B_max*N0))-d/Beta)/M;
for m=1:M
y_bar(m)=d/Beta+(m-1)*Delta;
%%%%start solving EE problem(31) using Dinkelbach's algorithm
eps=1e-5;
lambda=[];
n=1;
lambda(n)=0;
x=[];
F=1e-4;
while F>eps
%%%%%%Solve EE Problem using fmincon%%%%%%%
A=[1 0 1];
b=P_max;
lb=[0 0 0];%lower bound for B
ub=[Inf B_max Inf];%upper bound for B
if n==1
x0 =[4 1e3 1];%starting point
else
x0=xf';
end
objfun2=@(x)-((Beta-d/y_bar(m))*x(2)*log(1+x(1)*c/x(2))-lambda(n)*(Beta*mu*x(1)+P_c+d*(mu_F*x(3)-mu*x(1))/y_bar(m)));
[xf,fval,exitflag,output] = fmincon(objfun2,x0,A,b,[],[],lb,ub,@confun2);
x(n,:)=xf';
EE=-fval;
%%%%%%%%%%%%%%%%%%%%%%%%%
F=EE;
lambda(n+1)=((Beta-d/y_bar(m))*x(1,2)*log(1+x(1,1)*c/x(1,2)))/(Beta*mu*x(1,1)+P_c+d*(mu_F*x(1,3)-mu*x(1,1))/y_bar(m));
n=n+1;
end
EE(m)=F;
% xx(m,:)=x(n,:);
end
[Y,I] = max(EE);
% p(m)=x(I,1);
% B(m)=x(I,2);
% p_F(m)=x(I,3);
% B_F(m)=B_max-B;
% EE=Y;
function [c,ceq] = confun2(x)
c1=(B_max-x(2))*log(1+((x(3)*abs(F)^2)/((B_max-x(2))*N0)))-y_bar(m);
c=-c1;
ceq=[];
end
end
回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!