Как решить «Индексы массива должны быть положительными целыми или логическими значениями» при использовании панели инструментов оптимизации? - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь реализовать эту проблему оптимизации с помощью панели инструментов оптимизации:

enter image description here

где N = 60 файлы и K = 130 пользователи при 1/K ≤ M ≤ t∗N/K, для которых t∗ =3.поэтому я написал этот код:

 clear all; 
    close all; 
    clc;
    N=60;
    t=3;
    K=130;
    for M=0:0.1:1.4
        r=zeros(size(1:M));
        f=le(1/K,M);
        c=le(M,3*N/K);
        if f || c
        R2 = @(s) -(s-(s./ floor(N./s)).*M);
        LB = 1;
        UB = min(N, K);
        options = optimoptions('fmincon','Algorithm','interior-point'); % run interior-point algorithm
        [sopt, ropt] = fmincon(R2,1,[],[],[],[],LB,UB,[],options); 
        r(M) = -ropt;
        end 
    end 
    plot(0:1.4,r(M),'r-','LineWidth',2);
    xlabel('Cache Capacity (M)');
    ylabel('Delivery Rate (R)');

Однако вывод должен быть таким, как показано на графике, с ограничением набора срезов

enter image description here

Ошибка следующая:

Индексы массива должны быть положительными целыми числами или логическими значениями.

Ошибка в try (строка 17) r(M) = -ropt;

1 Ответ

0 голосов
/ 30 мая 2019
  • Сначала определите r вне цикла for
 r =zeros(size(0:0.1:1.4));
  • Для индексации r внутри цикла for вам нужно целое число, M - число с плавающей запятой.

    Вы можете просто определить дополнительный индекс i

  • Также вам не нужно указывать r индексы при печати, если вы хотите построить весь массив, и не забудьте сохранить абсциссу как 0:0.1:1.4

Код следующий

N=60;
t=3;
K=130;
i = 0;
r = zeros(size(0:0.1:1.4)); 
for M=0:0.1:1.4
    i = i+1;

    f=le(1/K,M);
    c=le(M,3*N/K);
    if f || c
       R2 = @(s) -(s-(s./ floor(N./s)).*M);
       LB = 1;
       UB = min(N, K);
       options = optimoptions('fmincon','Algorithm','interior-point'); % run interior-point algorithm
       [sopt, ropt] = fmincon(R2,1,[],[],[],[],LB,UB,[],options); 
       r(i) = -ropt;
     end 

    end 
plot(0:0.1:1.4,r,'r-','LineWidth',2);
xlabel('Cache Capacity (M)');
ylabel('Delivery Rate (R)');


В качестве альтернативы вы можете просто предопределить все M элементы как M = 0:0.1:1.4, а затем выполнить цикл, используя целочисленный индекс, который также можно использовать при индексации r

Соответствующий код выглядит следующим образом

N=60;
t=3;
K=130;
M = 0:0.1:1.4; 
r = zeros(size(M));

for i = 1:length(M)

    f=le(1/K,M(i));
    c=le(M(i),3*N/K);
    if f || c
        R2 = @(s) -(s-(s./ floor(N./s)).*M(i));
        LB = 1;
        UB = min(N, K);
        options = optimoptions('fmincon','Algorithm','interior-point'); % run interior-point algorithm
        [sopt, ropt] = fmincon(R2,1,[],[],[],[],LB,UB,[],options); 
        r(i) = -ropt;
    end 

end 
plot(0:0.1:1.4,r,'r-','LineWidth',2);
xlabel('Cache Capacity (M)');
ylabel('Delivery Rate (R)');

График enter image description here

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