First, you should not use your original implies constructions, since they are ill-posed (the solver can make the prediction undefined by placing Vend cleverly as I said). Instead, use the explicit
exclusive or construct by defining two binary variables for every k and force them to sum to 1.
After that, it is, as always in integer programming, very beneficial if one can add additional redundant constraints on binary variables, which reduce the size of the continuous relaxation. In your case, you know a lot about the binary variables, since you know V (those are the cuts I told you to add)
Notice, although you could mistakenly think that you have exponential complexity 2^(H-1) in your model, that is not the case. Basically, there are only H combinatorial cases possible. They are
1. Vend <= min(V). All dynamics are the same
2. min(V) < Vend <= secondsmallestof(V). One dynamics follows model2, the rest model 3
3. etc
By using the O(H^2) cuts, you are helping the integer solver to discover this by making the continuous relaxation tighter.
Example to illustrate. I use d and 1-d instead of two separate binary variables to represent exclusive or. same thing. Let us look at the projection onto the d-variables for the continuous relaxation. You will see that it occupies a significant part of the hyper-cube
n = 3;
d = binvar(n,1);
v = randn(n,1);
vend = sdpvar(1)
const = [-10 <= vend <= 10];
for i = 1:n
const = [const,implies(d(i), v(i) <= vend-1e-3)];
const = [const,implies(1-d(i), v(i) >= vend)];
end
clf
plot(const,d,[],500,sdpsettings('relax',1))
Now add the cuts. Significant parts cuts, we're close to the case that only four corners are kept. i.e., the convex hull of the integer feasible points
for i = 1:n
for j = i:n
if v(i) <= v(j)
const = [const, d(i) <= d(j)];
end
end
end
clf
plot(const,d,[],500,sdpsettings('relax',1))
I would advice you to solve these problems with and without cuts on your model, in an example where you use a linear or convex quadratic cost instead, to see if it has any benefit on those models when you are using a strong solver (if you keep the bilinear cost it will be hard to say anything since those problems are pretty much intractable and I think it would be hard to play around efficiently)
BTW, you should install a better MILP/MIQP solver, glpk is pretty much the worst one available.