fmincon не находит глобального минимума для выпуклой функции - PullRequest
0 голосов
/ 10 мая 2018

На мой взгляд, fmincon - это встроенная функция для локального минимума в matlab. Если целевая функция является выпуклой задачей, существует только один бассейн, а локальный минимум является глобальным минимумом. Начав с разных начальных точек в моем эксперименте, алгоритм получил другую функцию минимумов. Интересно, гарантирует ли fmincon сходство к глобальному минимуму для выпуклой задачи? Если нет, есть ли какие-нибудь другие техники, которые я могу использовать для выпуклой оптимизации как можно быстрее? Спасибо.

P.S. fmincon используйте interior-point-method для поиска минимума по умолчанию. Это нормальная проблема для interior-point method, то есть, начиная с другой начальной точки, метод может получить другой глобальный минимум для выпуклой задачи?

EDIT:

Цель состоит в том, чтобы минимизировать сумму потребления энергии группой пользователей в процессе связи, в то время как распределение полосы пропускания является поиском. Скорость передачи составляет

$r_k = x_k * log_2(1+\frac{g_k*p_k}{x_k})$

Проблема оптимизации следующая:

$min_{x} sum_k \frac{p_k*b_k}{r_k}$
s.t. $sum_k x_k \leq X_{max}$

Цель и ограничения все выпуклые, поэтому это должна быть выпуклая задача оптимизации.

Для программного кода это так же, как следует,

options = optimoptions('fmincon');
problem.options = options;
problem.solver = 'fmincon';
problem.objective = @(x) langBW(x, in_s, in_e, C1, a, p_ul);
problem.Aineq = ones(1,user_num);
problem.bineq = BW2;
problem.nonlcon = @(x) nonlConstr_bw(x,a,p_ul,T1,in_s,in_e,BW2);

problem.x0 = ones(user_num,1)
[b_ul,fval] = fmincon(problem);

langBW - это целевая функция, которая является выпуклой функцией x, код langBW выглядит следующим образом,

function fmin = langBW(x, in_s, in_e, C1, a, p_ul)
if size(x,1)<size(x,2)
    x = x';
end
b_ul = x;
r_ul = b_ul .* log2(1 + a.*p_ul./b_ul);

fmin = sum((in_s+in_e).*p_ul./r_ul) + sum(C1);

end

nonlConstr_bw является функцией нелинейных ограничений. Это показано следующим образом:

function [c,ceq] = nonlConstr_bw(x,a,p_ul,T1,in_s,in_e)
user_num = size(p_ul,1);
if size(x,1)<size(x,2)
    x = x';
end
b_ul = x;
r_ul = b_ul .* log2(1 + a.*p_ul./b_ul);

c1 = max(in_s./r_ul) + in_e./r_ul - T1;
c = c1;
ceq = zeros(user_num,1);

end

За исключением x, предоставляются все остальные переменные. Проблема в том, что когда я устанавливаю другое problem.x0, например, когда problem.x0=ones(user_num,1);, решение [b_ul,fval] = fmincon(problem); отличается от того, когда problem.x0=2*ones(user_num,1);. Вот что меня смущает.

1 Ответ

0 голосов
/ 10 мая 2018

fmincon использует следующие алгоритмы :

'interior-point' (default)
'trust-region-reflective'
'sqp' (Sequential Quadratic Programming)
'sqp-legacy'
'active-set'

Эти методы будут сходиться к локальному минимуму, но не обязательно к глобальному минимуму. Дальнейшие минимумы могут быть не уникальными. Единственный способ гарантировать глобальные минимумы - это поиск во всем пространстве решений.

Из вашего комментария, кажется, есть только минимумы сигнала? (Например, сдвинутая парабола?) Тогда она должна сходиться.

редактировать -

Даже если ваша функция выглядит выпуклой, ограничения могут привести к нескольким локальным минимумам . Иногда это называют «слабо» выпуклой функцией

enter image description here

...