in Bin Packing/src/bin_packing_environment.py [0:0]
def step(self, action):
done = False
if action >= self.bag_capacity:
print("Error: Invalid Action")
raise
elif action > (self.bag_capacity - self.item_size):
# can't insert item because bin overflow
reward = BIG_NEG_REWARD - self.waste
elif action == 0: # new bag
self.num_bins_levels[self.item_size] += 1
# waste = sum of empty spaces in all bags
self.waste = self.bag_capacity - self.item_size
# reward is negative waste
reward = -1 * self.waste
self.__update_bin_type_distribution_map(0)
elif self.num_bins_levels[action] == 0:
# can't insert item because bin of this level doesn't exist
print('cannot insert item because bin of this level does not exist')
reward = BIG_NEG_REWARD - self.waste
else:
if action + self.item_size == self.bag_capacity:
self.num_full_bags += 1
else:
self.num_bins_levels[action + self.item_size] += 1
self.__update_bin_type_distribution_map(action)
self.num_bins_levels[action] -= 1
# waste = sum of empty spaces in all bags
self.waste = -self.item_size
# reward is negative waste
reward = -1 * self.waste
self.total_reward += reward
self.time_remaining -= 1
if self.time_remaining == 0:
done = True
# get the next item
self.item_size = self.__get_item()
# state is the number of bins at each level and the item size
state = self.num_bins_levels + [self.item_size]
info = self.bin_type_distribution_map
return state, reward, done, info