onoffindicies = [];
indicatorindicies1 = [];
indicatorindicies2 = [];
for k = 2:Horizon
for unit = 1:Nunits
range = k:min(Horizon,k+minup(unit)-1);
v = ones(1,length(range));
onoffindicies = [onoffindicies sub2ind([Nunits Horizon],unit*v,range)];
indicatorindicies1 = [indicatorindicies1 sub2ind([Nunits Horizon],unit*v,k*v)];
indicatorindicies2 = [indicatorindicies2 sub2ind([Nunits Horizon],unit*v,(k-1)*v)];
end
end
Constraints = [Constraints, onoff(onoffindicies) >= onoff(indicatorindicies1)-onoff(indicatorindicies2)];
for k = maxdown+1:Horizon
pause1=sum(onoff(1,(k-maxdown):(k-1)));
Constraints = [Constraints, implies(pause1==0, onoff(1,k)==1)];
endhorizon = 10;maxdown = 3;A = [ones(1,maxdown) zeros(1,horizon-maxdown)];for i = 1:horizon-maxdown-1 A = [A;circshift(A(end,:),1)]endpause1 = A*onoff(:);implies(pause1 == 0, inoff(1,maxdown+1:Horizon)'==1)
for k = maxdown+1:Horizon
(k-maxdown):(k-1)
end
ans =
1 2 3
ans =
2 3 4
ans =
3 4 5
ans =
4 5 6
ans =
5 6 7
ans =
6 7 8
ans =
7 8 9
and then I create a matrix which picks out those elements, and create all the sums using matrix-vector multiplication, although there was a typo and should be
A = [ones(1,maxdown) zeros(1,horizon-maxdown)];
for i = 1:horizon-maxdown-1
A = [A;circshift(A(end,:),[0 1])]
end
A =
1 1 1 0 0 0 0 0 0 0
0 1 1 1 0 0 0 0 0 0
0 0 1 1 1 0 0 0 0 0
0 0 0 1 1 1 0 0 0 0
0 0 0 0 1 1 1 0 0 0
0 0 0 0 0 1 1 1 0 0
0 0 0 0 0 0 1 1 1 0
it assumes onoff has length horizon, otherwise you will have to extract the relevant part accordingly
A = toeplitz([ones(1,maxdown) zeros(1,horizon-maxdown)],[1 zeros(1,horizon-maxdown-1)])'