Originally posted by: Sulivan
I am currently studying an airport ground service scheduling problem. I defined several concepts: aircrafts (ACs), services and service providers (SPs). Each service provider provides a specific type of service. Some services consume resources while some do not. When the resource of an SP is depleted, it has to move to a resource supply centre for replenishment. I defined the concept 'round' for the services of SPs: each time it's depleted, a round ends; once it is replenished, full of resource again and ready for service, a new round starts. I used something like "dvar interval svcs[sp][ac][r] optional" to represent the service of an SP to serve AC in its round r; "dvar interval reps[sp][r] optional" to represent the r-th time replenishment of SP, etc.
However, the problem is, for those SPs that do not consume resource, they serve only one 'round': all their services are performed in the firsh round, and no replenishment is required. So I added the following constraint to the model:
forall(sp in SPs: sp.rt == 0, r in 2..MaxRound, ac in ACs){ //Here sp.rt == 0 means it does not consume resource.
presenceOf(svcs[sp][ac][r]) == 0;
presenceOf(reps[sp][r-1]) == 0;
}
When there is only one aircraft, the solution is correct (23 N/A N/A N/A); when there are more than one aircrafts, the model gives 'No solution'. Studying the results I found that the model tends to make every svcs[sp][ac][r] present if possible. For example, if MaxRound = 4, an AC needs 23 units of serving time, then the model gives: (20 1 1 1) in each round. What I desire is (23 N/A N/A N/A), that is, make the optional variables absent if possible.
I even tried this:
forall(sp in SPs: sp.rt == 0, r in 2..MaxRound, ac in ACs){ //Here sp.rt == 0 means it do not consume resource.
presenceOf(svcs[sp][ac][1]) == 1;
startOf(svcs[sp][ac][1]) == ac.est; //AC's earliest service starting time.
sizeOf(svcs[sp][ac][1]) == 23;
}
Still, no solution. Isn't (23 N/A N/A N/A) a feasible solution?
Modifying the last one to sizeOf(svcs[sp][ac][1]) == 20; //or any smaller value.
OK, solution is found: (20 1 1 1), (19 2 1 1) ...
That's quite strange! I already make the dvar optional. Why doen't it accept (23 N/A N/A N/A) as a feasible solution? It works when there is only one AC.
The model files are attached. Please help!
#DecisionOptimization#OPLusingCPOptimizer