示例#1
0
    def find_bin(
        self, package
    ):  #Returns current foreign or non-foreign bin based on package and current values of globals.
        print('Find the correct bin for package {0}'.format(package))

        if (package.length > self.bins[0].length
                or package.width > self.bins[0].width):
            raise InvalidArgError('Package will never fit in any bin')

        if self.foreign == False:
            if len(self.bins) > self.current_bin:
                return self.bins[self.current_bin]
            else:
                self.bins.append(
                    Bin(self.bins[0].width, self.bins[0].length,
                        self.bins[0].max_layers, False))
                self.bins[self.current_bin].bin_id = self.next_bin_id
                self.next_bin_id = self.next_bin_id + 1
                return self.bins[self.current_bin]
        else:
            if len(self.bins_foreign) > self.current_bin_foreign:
                return self.bins_foreign[self.current_bin_foreign]
            else:
                self.bins_foreign.append(
                    Bin(self.bins_foreign[0].width,
                        self.bins_foreign[0].length,
                        self.bins_foreign[0].max_layers, True))
                self.bins_foreign[
                    self.current_bin_foreign].bin_id = self.next_bin_id
                self.next_bin_id = self.next_bin_id + 1
                return self.bins_foreign[self.current_bin_foreign]
示例#2
0
 def test_new_layer_should_change_current_layer_and_append(
         self
 ):  #Always remember to name your function with a leading 'test_'
     bin1 = Bin(4, 4, 2)
     old_current_layer = bin1.current_layer
     self.assertEqual(len(bin1.layers), 1)
     bin1.new_layer()
     self.assertEqual(len(bin1.layers), 2)
     self.assertNotEqual(old_current_layer, bin1.current_layer)
    def test_handle_throws_exception_invalid_colour(self):
        bin1 = Bin(5, 5, 1)
        pa = PackingAdvisor(bin1)
        p1 = Package(width=2, length=2, colour=7)

        with self.assertRaises(InvalidArgError):
            pa.handle(p1)
    def test_handle_find_bin_for_new_bins(self):
        bin1 = Bin(width=4, length=4, max_layers=1)

        p1 = Package(width=4, length=4, height=1, colour=2)
        p2 = Package(width=4, length=4, height=1, colour=1)
        p3 = Package(width=4, length=4, height=1, colour=0)
        p4 = Package(width=4, length=4, height=1, colour=3)

        pa = PackingAdvisor(bin1)

        self.assertEqual(len(pa.bins), 1)
        self.assertEqual(len(pa.bins_foreign), 1)
        pa.handle(p1)
        self.assertEqual(len(pa.bins), 1)
        self.assertEqual(len(pa.bins_foreign), 1)
        self.assertEqual(pa.find_bin_containing_package(p1),
                         pa.bins_foreign[0])
        pa.handle(p2)
        self.assertEqual(len(pa.bins), 1)
        self.assertEqual(len(pa.bins_foreign), 2)
        self.assertEqual(pa.find_bin_containing_package(p2),
                         pa.bins_foreign[1])
        pa.handle(p3)
        self.assertEqual(len(pa.bins), 1)
        self.assertEqual(len(pa.bins_foreign), 2)
        self.assertEqual(pa.find_bin_containing_package(p3), pa.bins[0])
        pa.handle(p4)
        self.assertEqual(len(pa.bins), 2)
        self.assertEqual(len(pa.bins_foreign), 2)
        self.assertEqual(pa.find_bin_containing_package(p4), pa.bins[1])
    def test_handle_package_larger_than_layer(self):
        bin1 = Bin(width=5, length=10, max_layers=1)

        p1 = Package(width=6, length=2)
        p2 = Package(width=2, length=11)

        pa = PackingAdvisor(bin1)

        with self.assertRaises(InvalidArgError):
            pa.handle(p1)
        with self.assertRaises(InvalidArgError):
            pa.handle(p2)
示例#6
0
    def __init__(self, bin):
        #Initialise internal bin-lists NOTE: two lists of bins - one foreign and one non-foreign
        bin.bin_id = 1
        bin.foreign = False
        self.bins = [bin]
        bin2 = Bin(bin.width, bin.length, bin.max_layers)
        bin2.bin_id = 2
        bin2.foreign = True
        self.bins_foreign = [bin2]

        # Internal global variables. Strict rules for which methods may assign to these
        self.x = 0
        self.y = 0
        self.package_fits = False
        self.current_bin = 0
        self.current_bin_foreign = 0
        self.next_bin_id = 3

        # Package metadata
        self.fragile = False  #Currently obsolete
        self.foreign = False

        self.COLUMN_LENGTH = 2
    def test_handle(self):
        bin1 = Bin(width=8, length=8, max_layers=1)

        p1 = Package(width=4, length=2)
        p2 = Package(width=4, length=2)
        p3 = Package(width=2, length=2)

        pa = PackingAdvisor(bin1)
        pa.handle(p1)
        pa.handle(p2)
        pa.handle(p3)

        self.assertEqual(bin1.current_layer.packages[0].position.x, 0)
        self.assertEqual(bin1.current_layer.packages[0].position.y, 0)
        self.assertEqual(bin1.current_layer.packages[1].position.x, 0)
        self.assertEqual(bin1.current_layer.packages[1].position.y, 4)
        self.assertEqual(bin1.current_layer.packages[2].position.x, 2)
        self.assertEqual(bin1.current_layer.packages[2].position.y, 0)
    def test_airspace_true(self):  #Returns true when airspace is empty

        #Arrange
        bin1 = Bin(4, 4, 2)
        pa = PackingAdvisor(bin1)
        p1 = Package(4, 2)
        p2 = Package(2, 2)
        p3 = Package(4, 2)
        p4 = Package(2, 2)

        #Act
        pa.handle(p1)
        pa.handle(p2)
        pa.handle(p3)

        #Assert
        pa.x = 2  #Is set manually to de-couple the test of airspace from find_x_y_lower_layer
        pa.y = 2
        self.assertTrue(pa.check_airspace(bin1, p4))
    def test_airspace_false(self):  #Returns false when airspace is not empty

        #Arrange
        bin1 = Bin(4, 4, 2)
        pa = PackingAdvisor(bin1)
        p1 = Package(3, 2)
        p2 = Package(4, 2)
        p3 = Package(4, 2)
        p4 = Package(1, 2)

        #Act
        pa.handle(p1)
        pa.handle(p2)
        pa.handle(p3)

        #Assert
        pa.x = 0
        pa.y = 3
        self.assertFalse(pa.check_airspace(bin1, p4))
    def test_gravity_capable_of_opening_new_layers(self):
        bin1 = Bin(4, 4, 4)

        p1 = Package(4, 2)
        p2 = Package(4, 2)
        p3 = Package(4, 2)
        p4 = Package(width=4, length=2, colour=3)
        p5 = Package(4, 2)
        p6 = Package(4, 2)

        pa = PackingAdvisor(bin1)

        pa.handle(p1)
        pa.handle(p2)
        pa.handle(p3)
        pa.handle(p4)
        pa.handle(p5)
        pa.handle(p6)

        self.assertEqual(pa.bins[0].current_layer.find_layer_number(), 4)
    def test_gravity_check(self):
        bin1 = Bin(4, 4, 3)
        pa = PackingAdvisor(bin1)
        p1 = Package(2, 2)
        p2 = Package(4, 2)
        p3 = Package(4, 2)
        p4 = Package(4, 2)

        pa.handle(p1)
        pa.handle(p2)

        pa.bins[0].new_layer()
        pa.x = 0
        pa.y = 0
        self.assertFalse(pa.calc_gravity(pa.bins[0].current_layer, p3) > 0.75)
        pa.handle(p3)

        pa.bins[0].new_layer()
        pa.x = 2
        pa.y = 0
        self.assertTrue(pa.calc_gravity(pa.bins[0].current_layer, p4) > 0.75)
    def test_handle_advanced(self):
        #The code in this case is the main.py() at the time of every feature working first time (31/10 2016)
        bin1 = Bin(width=5, length=10, max_layers=3)

        p1 = Package(width=3, length=2)
        p2 = Package(width=2, length=2)
        p3 = Package(width=4, length=2)
        p4 = Package(width=3, length=2)
        p5 = Package(width=4, length=2, colour=3)
        p6 = Package(width=2, length=2)
        p7 = Package(width=2, length=2)
        p8 = Package(width=4, length=2)
        p9 = Package(width=4, length=2)
        p10 = Package(width=2, length=2, colour=3)
        p11 = Package(width=4, length=2)
        p12 = Package(width=4, length=2)
        p13 = Package(width=2, length=2)
        p14 = Package(width=4, length=2)
        p15 = Package(width=3, length=2, colour=2)
        p16 = Package(width=4, length=2, colour=2)
        p17 = Package(width=2, length=2, colour=2)

        pa = PackingAdvisor(bin1)

        pa.handle(p1)
        pa.handle(p2)
        pa.handle(p3)
        pa.handle(p4)
        pa.handle(p5)
        pa.handle(p6)
        pa.handle(p7)
        pa.handle(p8)
        pa.handle(p9)
        pa.handle(p10)
        pa.handle(p11)
        pa.handle(p12)
        pa.handle(p13)
        pa.handle(p14)
        pa.handle(p15)
        pa.handle(p16)
        pa.handle(p17)

        self.assertEqual(p1.position.x, 0)
        self.assertEqual(p1.position.y, 0)
        self.assertEqual(p1.position.layer.find_layer_number(), 1)
        self.assertEqual(p2.position.x, 0)
        self.assertEqual(p2.position.y, 3)
        self.assertEqual(p2.position.layer.find_layer_number(), 1)
        self.assertEqual(p3.position.x, 2)
        self.assertEqual(p3.position.y, 0)
        self.assertEqual(p3.position.layer.find_layer_number(), 1)
        self.assertEqual(p4.position.x, 4)
        self.assertEqual(p4.position.y, 0)
        self.assertEqual(p4.position.layer.find_layer_number(), 1)
        self.assertEqual(p5.position.x, 6)
        self.assertEqual(p5.position.y, 0)
        self.assertEqual(p5.position.layer.find_layer_number(), 1)
        self.assertEqual(p6.position.x, 4)
        self.assertEqual(p6.position.y, 3)
        self.assertEqual(p6.position.layer.find_layer_number(), 1)
        self.assertEqual(p7.position.x, 8)
        self.assertEqual(p7.position.y, 0)
        self.assertEqual(p7.position.layer.find_layer_number(), 1)
        self.assertEqual(p8.position.x, 0)
        self.assertEqual(p8.position.y, 0)
        self.assertEqual(p8.position.layer.find_layer_number(), 2)
        self.assertEqual(p9.position.x, 2)
        self.assertEqual(p9.position.y, 0)
        self.assertEqual(p9.position.layer.find_layer_number(), 2)
        self.assertEqual(p10.position.x, 8)
        self.assertEqual(p10.position.y, 2)
        self.assertEqual(p10.position.layer.find_layer_number(), 1)
        self.assertEqual(p11.position.x, 4)
        self.assertEqual(p11.position.y, 0)
        self.assertEqual(p11.position.layer.find_layer_number(), 2)
        self.assertEqual(p12.position.x, 8)
        self.assertEqual(p12.position.y, 0)
        self.assertEqual(p12.position.layer.find_layer_number(), 2)
        self.assertEqual(p13.position.x, 0)
        self.assertEqual(p13.position.y, 0)
        self.assertEqual(p13.position.layer.find_layer_number(), 3)
        self.assertEqual(p14.position.x, 2)
        self.assertEqual(p14.position.y, 0)
        self.assertEqual(p14.position.layer.find_layer_number(), 3)
        #Last three packages are in foreign destination bin
        self.assertEqual(p15.position.x, 0)
        self.assertEqual(p15.position.y, 0)
        self.assertEqual(p15.position.layer.find_layer_number(), 1)
        self.assertEqual(p16.position.x, 2)
        self.assertEqual(p16.position.y, 0)
        self.assertEqual(p16.position.layer.find_layer_number(), 1)
        self.assertEqual(p17.position.x, 0)
        self.assertEqual(p17.position.y, 3)
        self.assertEqual(p17.position.layer.find_layer_number(), 1)

        #Lastly the bin_id's are checked
        self.assertEqual(pa.find_bin_containing_package(p8).bin_id, 1)
        self.assertEqual(pa.find_bin_containing_package(p15).bin_id, 2)
示例#13
0
 def test_new_layer_should_fail_if_no_more(self):
     bin2 = Bin(4, 4, 1)
     self.assertFalse(bin2.new_layer())