% Select a range of numbers from x, to maximize sum(x(a:b))
n = 5;
x = randn(n,1);
intvar a b
y = binvar(n,1); % y(a:b) = 1, 0 otherwise
the_sum = x'*y;
a_i = binvar(n,1); % a_i(i) == 1 implies a = i
b_i = binvar(n,1); % b_i(i) == 1 implies b = i
Model = [sum(a_i)==1,sum(b_i)==1];
for i = 1:n
Model = [Model, implies(a_i(i), a == i),
implies(b_i(i), b == i)];
end
% If a = i, then y(i) = 1 and y(1:i-1)=0, if b=i, y(i) = 1, y(i+1:end)=0
for i = 1:n
Model = [Model,
implies(a_i(i), [y(i) == 1,y(1:i-1)==0]),
implies(b_i(i), [y(i) == 1,y(i+1:end)==0])]
end
% Some more stuff we know or must add
Model = [Model, sum(y) == b - a + 1, 1 <= a, a <= b, b <= n, y >= a_i,y >= b_i]
optimize(Model,-the_sum)
value([a b])
value([a_i b_i y])
x