Реализация задачи оптимизации с использованием Matlab - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь реализовать задачу оптимизации с помощью matlab

enter image description here

Где N = 100, M = (N-1 / k) и L = 50.

N=100;
L = 50;
for K= 101:1:1000
M = (N-1)/K;
R=@(x) -((1./x(2)).*(N- (x(1).*M)-((min ( N./(L.*x(2)), K)-x(1))*(max(0,N-(L.*x(2).*x(1)))))/(x(1)+(min ( N./(L.*x(2)), K)-x(2)))) - (max(0,N-(L.*K*x(2)))));
LB = [1 1];
b=1:min((ceil(N/L)), K) ;
UB = [min((ceil(N./L)), K) ((N./(L*b))) ];
options = optimoptions('fmincon','Algorithm','interior-point'); % run interior-point algorithm
[xopt, vopt] = fmincon(R,1,[],[],[],[],LB,UB,[],options); 
v(K) = -vopt;
end 
 plot(101:1000,v,'v-','LineWidth',2);
xlabel('Number of Users (K)');
ylabel('Delivery Rate (R)');

Появляется следующая ошибка:

Warning: Length of lower bounds is > length(x); ignoring extra bounds. 
> In checkbounds (line 27)
  In fmincon (line 318)
  In R1 (line 19) 
Warning: Length of upper bounds is > length(x); ignoring extra bounds. 
> In checkbounds (line 41)
  In fmincon (line 318)
  In R1 (line 19) 
Index exceeds array bounds.

Error in
R1>@(x)-((1./x(2)).*(N-(x(1).*M)-((min(N./(L.*x(2)),K)-x(1))*(max(0,N-(L.*x(2).*x(1)))))/(x(1)+(min(N./(L.*x(2)),K)-x(2))))-(max(0,N-(L.*K*x(2)))))

Error in fmincon (line 546)
      initVals.f = feval(funfcn{3},X,varargin{:});

Error in R1 (line 19)
[xopt, vopt] = fmincon(R,1,[],[],[],[],LB,UB,[],options);

Caused by:
    Failure in initial objective function evaluation. FMINCON cannot continue.

Выходной график должен быть таким, как показано здесь:

(нижняя граница кривой)

1 Ответ

0 голосов
/ 21 мая 2019

Пары ошибок

  • Во-первых, первоначальное предположение должно быть массивом 1D длина 2 , любезно замените 1 на [1, 1]
  • Лучше сначала инициализировать переменную v, это ускорит ваши вычисления
  • Самым важным является верхняя граница l, поскольку, как вы можете видеть, она зависит от s, и она находится в знаменателе, рассмотримэто как нелинейное ограничение, затем установите UB = [] Вам нужно будет включить nonlcon в fmincon

Код выглядит следующим образом:

N=100;
L = 50;
t = 101:1:1000;
le = length(t);
v = zeros(1, le);

for K= 100:1:1000
M = (N-1)/K;
R = @(x) -(1./(x(1))).*(N-x(1).*((N-1)./K)-((min(ceil(N./(L.*x(2))), K)).*...
      max(N -L.*x(1).*x(2), 0))./((x(1) +(min(ceil(N./(L.*x(2))), K))))...
      -(max(N - K.*L.*x(2), 0)));
LB = [1 1];

options = optimoptions('fmincon','Algorithm','interior-point');
[xopt, vopt] = fmincon(R,[1, 1],[],[],[],[],LB,[],...
    @(x)nonlincon(x(1), x(2),N, L, K ),options); 
v(K-101+1) = -vopt;

end 
plot(101:1000,v,'v-','LineWidth',2);
xlabel('Number of Users (K)');
ylabel('Delivery Rate (R)');

function [c, ceq] = nonlincon(s, l,N, L, K )

    c(1) = l -N./(L.*s);
    c(2) = s - min((ceil(N./L)), K) ;
    ceq = [];

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...