Оптимизация линейной системы неравенств
Нам дают четыре очка, предполагается, что они упорядочены:
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