'Need advice on optimizing warehouse layout

I'm currently working for a distribution center with ~500 shelves with items for sale and ready to be shipped out to customers. I have decided to create a ranking for each aisle, where the best selling products will be stored at the front and the worst selling products will be stored at the back. I assumed that this would automatically improve efficience in my warehouse. However, after implementing this (see here). After using BFS to simulate a warehouse worker's route it's turned out that this new layout is actually taking more steps for a worker to complete than a regular non-optimized layout.. Example of my unordered warehouse on the left vs my ordered warehouse on the right, still taking more steps through BFS.

This is my code for BFS, however I think my problem lies in the way I decide where high demand items go, not in my BFS.

    List<String> findPathBFS(magazijnObject[,] grid, bool[,] vis,
                 string start, string goal)
        {
            List<string> path = new List<string>();
            // Stores indices of the matrix cells
            Queue<pair> q = new Queue<pair>();
            int row = 0; int col = 0;
            // Mark the starting cell as visited
            // and push it into the queue
            for (int x = 0; x < grid.GetLength(0); x++)
                for (int y = 0; y < grid.GetLength(1); y++)
                {
                    if (grid[x, y].Locatie == start)
                    {
                        row = x; col = y;
                        x = grid.GetLength(0); y = grid.GetLength(1);
                        break;
                    }
                }
            q.Enqueue(new pair(row, col, null));
            vis[row, col] = true;

            // Iterate while the queue
            // is not empty
            while (q.Count != 0)
            {
                pair cell = q.Peek();
                int x = cell.first;
                int y = cell.second;
                
                if (grid[x, y].Locatie == goal)
                {
                    //Console.WriteLine(cell.parent.first + " " + cell.parent.second);
                    findPath(cell, path);
                    return path;
                }
                q.Dequeue();

                // Go to the adjacent cells
                for (int i = 0; i < 4; i++)
                {
                    int adjx = x + dRow[i];
                    int adjy = y + dCol[i];
                    if (isValid(vis, adjx, adjy, grid))
                    {
                        if (grid[adjx, adjy].Loopbaar || grid[adjx, adjy].Locatie == goal) 
#Locatie = Location of item in aisle, Loopbaar = whether or not a worker can walk here.
                        {
                            q.Enqueue(new pair(adjx, adjy, cell));
                            vis[adjx, adjy] = true;
                        }

                    }
                }
            }
            return path;
        }

And this is my pair Class which defines a cell and it's parent

      class pair
        {
            public int first, second;
            public pair parent;
            public pair(int first, int second, pair parent)
            {
                this.first = first;
                this.second = second;
                this.parent = parent;
            }
            public String toString()
            {
                return (first + " " + second);
            }
        }

        static int[] dRow = { -1, 0, 1, 0 };
        static int[] dCol = { 0, 1, 0, -1 };

        static bool isValid(bool[,] vis,
                      int row, int col, magazijnObject[,] test)
        {

            // If cell lies out of bounds
            if (row < 0 || col < 0 ||
                row >= test.GetLength(0) || col >= test.GetLength(1))
                return false;

            // If cell is already visited
            if (vis[row, col])
                return false;

            // Otherwise
            return true;
        }
        private static void findPath(pair node, List<String> path)
        {
            if (node != null)
            {
                findPath(node.parent, path);
                path.Add(node.toString());
            }
        }

I'm curious to see whether you have any ideas on how to improve this layout in a way. As this obviously is not an improvement. Kind regards, D.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source