def algorithm(self): self.routingDay = self.initRoutingDay() for pair, saving in self.savings: trip1 = self.routingDay.tripContainingRequest(pair[0], True) trip2 = self.routingDay.tripContainingRequest(pair[1], True) if trip1 and trip2: if not trip1.equals(trip2): newTrip = Trip(self.instance) newTrip.concatenateTrips(trip2, trip1, pair) if newTrip.isValid(): validChange = True benefit = True for toolID, tool in self.instance.tools.items(): if self.inventory[toolID] < 0: benefit = False newInventory = newTrip.inventoryChange() inventory1 = trip1.inventoryChange() inventory2 = trip2.inventoryChange() for toolID, tool in self.instance.tools.items(): change = newInventory[toolID] - inventory1[ toolID] - inventory2[toolID] if change < 0 and self.inventory[ toolID] + change < 0: validChange = False break if self.inventory[toolID] < 0 and change > 0: benefit = True if validChange and benefit: self.routingDay.addTrip(newTrip) self.routingDay.deleteTrip(trip1) self.routingDay.deleteTrip(trip2) for toolID, tool in self.instance.tools.items(): change = newInventory[toolID] - inventory1[ toolID] - inventory2[toolID] self.inventory[ toolID] = self.inventory[toolID] + change