dinkelbach algorithm with fmincon for maximization problem

24 views (last 30 days)
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 Comments
Torsten
Torsten on 11 Jan 2016
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
Samaneh Bidabadi on 19 Aug 2021
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

Sign in to comment.

Answers (0)

Community Treasure Hunt

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

Start Hunting!