Оптимизация линейной системы неравенств

Нам дают четыре очка, предполагается, что они упорядочены:

A = sort(randn(1,4))

Я хочу найти максимально возможное количество x в промежутке 0<x<1 такой, что

A(1)<x<A(2) or A(3)<x<A(4)

Некоторые примеры:

A = [-1.4924    0.3004    1.6630     2.1204], x = 0.3004
A = [-0.4754    0.1353    0.6552     1.3873]; x = 1.0000
A = [-1.0213   -0.4521   -0.0905     0.1000]; x = 0.1000
A = [-1.8258   -0.5790   -0.4568    -0.1950]; x = 0.0000
A = [ 1.5000    2.0000    2.5000     3.0000]; x = 1.0000

Можете ли вы предложить компактный код для этой работы, не перечисляя все возможные сценарии, используя if заявления?

1 ответ

Решение

Попытавшись сделать это без операторов if, я обнаружил, что читаемость кода значительно снизилась. Обратите внимание, что в приведенном ниже коде есть только один оператор if, а несколько других операторов if могут быть заменены на логические сравнения.

Все ваши тесты пройдены, и код остается очень сжатым (9 строк без комментариев и цикл по всем тестам).

A = [[-1.4924    0.3004    1.6630     2.1204];
     [-0.4754    0.1353    0.6552     1.3873];
     [-1.0213   -0.4521   -0.0905     0.1000];
     [-1.8258   -0.5790   -0.4568    -0.1950];
     [ 1.5000    2.0000    2.5000     3.0000]];

for i = 1:size(A,1)
    % Reshape A so that each set of 2 entries are compared
    Atmp = reshape(A(i,:),2,2);

    % Find any valid entries
    Valid = Atmp > 0 & Atmp < 1;
    Ind_Valid = find(Valid == 1);

    if (~isempty(Ind_Valid))
        % If there are valid entries, return:
        %   max(A(ind),0) if the entry is the 1st of the pair
        %   max(A(ind),1) if the entry is the 2nd of the pair
        max_Ind = max(Ind_Valid);
        x = max(Atmp(max_Ind),mod(max_Ind,2))
    else
        % If there are no valid entries, return:
        %   0 if max A < 0
        %   1 if max A > 1
        x = max(Atmp(:)) > 0
    end
end

Выход:

x =

    0.3004


x =

     1


x =

    0.1000


x =

     0


x =

     1
Другие вопросы по тегам