spoorendonk on master
vrptw time before demand (compare)
spoorendonk on master
format (compare)
spoorendonk on use-knapsack
spoorendonk on master
knapsack less output num customers from arg and 5 more (compare)
spoorendonk on use-knapsack
update knapsack value (compare)
spoorendonk on use-knapsack
spoorendonk on use-knapsack
workflow (compare)
spoorendonk on use-knapsack
knapsack less output num customers from arg and 2 more (compare)
spoorendonk on master
remove an optimize (compare)
spoorendonk on use-knapsack
update workflow (compare)
The first model seems fine. Though it is very hard to write the transit time constraints for the edge formulation. I'm also a bit curious to whether limiting the flow on each arc for a commodity to be integer, is strictly identical to limiting the flow on each path to be integer. It is easy to find a counter-example, but I could be that they have the same space of optimal solutions
what counts as an integer variable in the subproblem? For us the subproblems are RCSPPs, so they are always integer, no? but that doesn't meant that lambda naturally becomes integer, right?
in relation to the above. If edge flow variables are integers in can ultimately result in integer path variables.
type="I"
is maybe not super clear
I also added the strong constraints to the model. The next step would be to se if we can add them dynamically with some sort of callback =)
working on it, got could up in some multi threading for solving subproblems in parallel
but ok, yeah, whenever I could be of any help, you just say so =)
I don't know how much time you have on your hands? And what kind of help you would find interesting?
Setting up models to expose stuff that does/doesn't work helps me a lot - like the ttfcmcf. In that direction I am locking into https://github.com/GregorCH/ipet to thoroughly test and track running times.
It could also go deeper into the c++ if you feel really confident!
in digging in my well documented codebase...
def callback(cb: CallbackModel, where: Where):
if where == Where.PathMipCuts:
relax = cb.relaxation
for y in y_vars:
e = (arcs[y.id].start, arcs[y.id].end)
xEdges = [x for k in range(k) for x in x_vars[k] if x.edge = e]
xksum = sum([relax[x.id] for x in xEdges])
if xksum > relax[y.id]:
cb.addCut(xsum([ 1*x for x in xEdges]) <= y)