File size: 6,877 Bytes
60b4cf5
dd769a5
 
 
60b4cf5
dd769a5
 
 
 
60b4cf5
dd769a5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60b4cf5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
import gradio as gr
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

import itertools
import sys
import math
from tqdm import tqdm


# Define maps
maps = {
    "Map 1": [
        ('A', 0, 'LO'), ('B', 1, 'HI'),
        ('C', 1, 'LO'), ('D', 2, 'HI'),
        ('C', 3, 'LO'), ('B', 3, 'HI'),
        ('A', 4, 'HI'), ('B', 2, 'LO'),
        ('C', 0, 'HI'), ('D', 4, 'LO')
    ],
    "Map 2": [
        ('B', 0, 'LO'), ('C', 0, 'HI'),
        ('A', 1, 'HI'), ('D', 1, 'LO'),
        ('C', 2, 'LO'), ('B', 2, 'HI'),
        ('A', 3, 'LO'), ('D', 3, 'HI'),
        ('B', 4, 'HI'), ('C', 4, 'LO')
    ],
    "Map 3": [
        ('A', 0, 'HI'), ('D', 0, 'LO'),
        ('B', 1, 'LO'), ('C', 1, 'HI'),
        ('A', 2, 'LO'), ('D', 2, 'HI'),
        ('B', 3, 'HI'), ('C', 3, 'LO'),
        ('A', 4, 'LO'), ('D', 4, 'HI')
    ],
    "Map Easy": [
    ('B', 0, 'LO'), ('C', 0, 'LO'),
    ('C', 1, 'LO'), ('B', 1, 'LO'),
    ('B', 2, 'LO'), ('C', 2, 'LO'),
    ('C', 3, 'LO'), ('B', 3, 'LO'),
    ('B', 4, 'LO'), ('C', 4, 'LO')
]
}

def make_map(map1):

  # Load base image
  img_path = "map.png"
  base_img = mpimg.imread(img_path)


  # Mapping from Aisle to image X-coordinates (estimated from image)
  aisle_x_map = {
      'A': 145, 'B': 185, 'C': 320, 'D': 355
  }

  # Mapping from Row to image Y-coordinates (0-4 mapped top to bottom)
  row_y_map = {
      0: 120, 1: 185, 2: 255, 3: 325, 4: 385
  }

  # Prepare coordinates and colors
  x_coords = [aisle_x_map[a] for (a, r, h) in map1]
  y_coords = [row_y_map[r] for (a, r, h) in map1]
  colors = ['green' if h == 'LO' else 'red' for (a, r, h) in map1]


  # Plot on top of base image
  fig, ax = plt.subplots(figsize=(6, 6))
  ax.imshow(base_img)

  # Plot points with different colors
  for i in range(len(x_coords)):
      ax.plot(x_coords[i], y_coords[i], marker='o', color=colors[i])

  # Label each point
  for i, (x, y) in enumerate(zip(x_coords, y_coords)):
      ax.text(x, y, str(i + 1), color='black', fontsize=10, ha='center', va='bottom')

  # Add legend
  from matplotlib.lines import Line2D
  legend_elements = [Line2D([0], [0], marker='o', color='w', label='LO',
                            markerfacecolor='green', markersize=10),
                    Line2D([0], [0], marker='o', color='w', label='HI',
                            markerfacecolor='red', markersize=10)]
  ax.legend(handles=legend_elements, loc='upper right')


  # Set axis ticks and labels
  ax.set_xticks(list(aisle_x_map.values()))
  ax.set_xticklabels(list(aisle_x_map.keys()))
  ax.set_yticks(list(row_y_map.values()))
  ax.set_yticklabels(list(row_y_map.keys()))

  ax.axis('on')
  plt.show()
  
  def calculate_shortest_path(map_coords):
    """
        Calculates the shortest path to visit all points in a map using permutations.

        Args:
        map_coords: A list of tuples, where each tuple represents a point
                    in the map as (aisle, row, height). Aisle is a string
                    ('A', 'B', 'C', 'D'), row is an integer (0-4), and
                    height is a string ('LO', 'HI').

        Returns:
        A tuple containing the shortest length found and the corresponding path (list of indices).
    """
    min_length = float('inf')
    best_path = None

    num_points = len(map_coords)
    # Iterate through all possible permutations of visiting the points with a progress bar
    for path_indices in tqdm(itertools.permutations(range(num_points)), total=math.factorial(num_points), desc="Calculating Shortest Path"):
        current_length = 0.0
        # Calculate the length for the current permutation
        for i in range(num_points - 1):
            p1_index = path_indices[i]
            p2_index = path_indices[i+1]

        # Convert map coordinates to 3D space (aisle, row, height)
        x1 = aisle_map[map_coords[p1_index][0]]
        y1 = map_coords[p1_index][1]
        z1 = height_map[map_coords[p1_index][2]]

        x2 = aisle_map[map_coords[p2_index][0]]
        y2 = map_coords[p2_index][1]
        z2 = height_map[map_coords[p2_index][2]]

        # Calculate Euclidean distance between consecutive points
        distance = math.sqrt((x2 - x1)**2 + (y2 - y1)**2 + (z2 - z1)**2)
        current_length += distance

        # Update minimum length and best path if current path is shorter
        if current_length < min_length:
            min_length = current_length
            best_path = list(path_indices)

    return min_length, best_path


def run_app(coord_text):
    # Parse the input text into a list of tuples (Aisle, Row, Height)
    coords = []
    for line in coord_text.strip().split('\n'):
        parts = line.strip().split(',')
        if len(parts) == 3:
            aisle = parts[0].strip().upper()
            try:
                row = int(parts[1].strip())
            except ValueError:
                continue
            height = parts[2].strip().upper()
            coords.append((aisle, row, height))
    if not coords:
        return None

    # Generate and save the map image
    import matplotlib.pyplot as plt
    import matplotlib.image as mpimg
    import io
    from PIL import Image

    # Use the same logic as make_map, but output to a buffer
    img_path = "/content/map.png"  # You may want to update this path
    base_img = mpimg.imread(img_path)
    aisle_x_map = {'A': 145, 'B': 185, 'C': 320, 'D': 355}
    row_y_map = {0: 120, 1: 185, 2: 255, 3: 325, 4: 385}
    x_coords = [aisle_x_map.get(a, 0) for (a, r, h) in coords]
    y_coords = [row_y_map.get(r, 0) for (a, r, h) in coords]
    colors = ['green' if h == 'LO' else 'red' for (a, r, h) in coords]
    fig, ax = plt.subplots(figsize=(6, 6))
    ax.imshow(base_img)
    for i in range(len(x_coords)):
        ax.plot(x_coords[i], y_coords[i], marker='o', color=colors[i])
    for i, (x, y) in enumerate(zip(x_coords, y_coords)):
        ax.text(x, y, str(i + 1), color='black', fontsize=10, ha='center', va='bottom')
    from matplotlib.lines import Line2D
    legend_elements = [Line2D([0], [0], marker='o', color='w', label='LO', markerfacecolor='green', markersize=10),
                      Line2D([0], [0], marker='o', color='w', label='HI', markerfacecolor='red', markersize=10)]
    ax.legend(handles=legend_elements, loc='upper right')
    ax.set_xticks(list(aisle_x_map.values()))
    ax.set_xticklabels(list(aisle_x_map.keys()))
    ax.set_yticks(list(row_y_map.values()))
    ax.set_yticklabels(list(row_y_map.keys()))
    ax.axis('on')
    buf = io.BytesIO()
    plt.savefig(buf, format='png')
    plt.close(fig)
    buf.seek(0)
    img = Image.open(buf)
    return img

# Update Gradio interface to accept multiline text and output image
demo = gr.Interface(fn=run_app, inputs=gr.Textbox(lines=10, label="Enter coordinates (Aisle,Row,Height per line)"), outputs="image", title="Shortest Path Finder",)
demo.launch()