Skip to content

Commit dc16a97

Browse files
bakerwhoantmarakis
authored andcommitted
Move viz code + changes to search (aimacode#812)
* Updating submodule * Moved viz code to notebook.py + changes * Changed use of 'next' * Added networkx to .travis.yml * Added others to .travis.yml * Remove time from .travis.yml * Added linebreaks and fixed case for no algo * Fixed spaces for args * Renamed *search as *search_for_vis
1 parent 0cd0612 commit dc16a97

File tree

4 files changed

+468
-2026
lines changed

4 files changed

+468
-2026
lines changed

.travis.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ install:
1212
- pip install flake8
1313
- pip install ipython
1414
- pip install matplotlib
15+
- pip install networkx
16+
- pip install ipywidgets
1517

1618
script:
1719
- py.test

notebook.py

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -886,3 +886,159 @@ def draw_table(self):
886886
self.fill(0, 0, 0)
887887
self.text_n(self.table[self.context[0]][self.context[1]] if self.context else "Click for text", 0.025, 0.975)
888888
self.update()
889+
890+
############################################################################################################
891+
892+
##################### Functions to assist plotting in search.ipynb ####################
893+
894+
############################################################################################################
895+
import networkx as nx
896+
import matplotlib.pyplot as plt
897+
from matplotlib import lines
898+
899+
from ipywidgets import interact
900+
import ipywidgets as widgets
901+
from IPython.display import display
902+
import time
903+
from search import GraphProblem, romania_map
904+
905+
def show_map(graph_data, node_colors = None):
906+
G = nx.Graph(graph_data['graph_dict'])
907+
node_colors = node_colors or graph_data['node_colors']
908+
node_positions = graph_data['node_positions']
909+
node_label_pos = graph_data['node_label_positions']
910+
edge_weights= graph_data['edge_weights']
911+
912+
# set the size of the plot
913+
plt.figure(figsize=(18,13))
914+
# draw the graph (both nodes and edges) with locations from romania_locations
915+
nx.draw(G, pos = {k : node_positions[k] for k in G.nodes()},
916+
node_color = [node_colors[node] for node in G.nodes()], linewidths = 0.3, edgecolors = 'k')
917+
918+
# draw labels for nodes
919+
node_label_handles = nx.draw_networkx_labels(G, pos = node_label_pos, font_size = 14)
920+
921+
# add a white bounding box behind the node labels
922+
[label.set_bbox(dict(facecolor='white', edgecolor='none')) for label in node_label_handles.values()]
923+
924+
# add edge lables to the graph
925+
nx.draw_networkx_edge_labels(G, pos = node_positions, edge_labels = edge_weights, font_size = 14)
926+
927+
# add a legend
928+
white_circle = lines.Line2D([], [], color="white", marker='o', markersize=15, markerfacecolor="white")
929+
orange_circle = lines.Line2D([], [], color="orange", marker='o', markersize=15, markerfacecolor="orange")
930+
red_circle = lines.Line2D([], [], color="red", marker='o', markersize=15, markerfacecolor="red")
931+
gray_circle = lines.Line2D([], [], color="gray", marker='o', markersize=15, markerfacecolor="gray")
932+
green_circle = lines.Line2D([], [], color="green", marker='o', markersize=15, markerfacecolor="green")
933+
plt.legend((white_circle, orange_circle, red_circle, gray_circle, green_circle),
934+
('Un-explored', 'Frontier', 'Currently Exploring', 'Explored', 'Final Solution'),
935+
numpoints=1,prop={'size':16}, loc=(.8,.75))
936+
937+
# show the plot. No need to use in notebooks. nx.draw will show the graph itself.
938+
plt.show()
939+
940+
## helper functions for visualisations
941+
942+
def final_path_colors(initial_node_colors, problem, solution):
943+
"returns a node_colors dict of the final path provided the problem and solution"
944+
945+
# get initial node colors
946+
final_colors = dict(initial_node_colors)
947+
# color all the nodes in solution and starting node to green
948+
final_colors[problem.initial] = "green"
949+
for node in solution:
950+
final_colors[node] = "green"
951+
return final_colors
952+
953+
def display_visual(graph_data, user_input, algorithm=None, problem=None):
954+
initial_node_colors = graph_data['node_colors']
955+
if user_input == False:
956+
def slider_callback(iteration):
957+
# don't show graph for the first time running the cell calling this function
958+
try:
959+
show_map(graph_data, node_colors = all_node_colors[iteration])
960+
except:
961+
pass
962+
def visualize_callback(Visualize):
963+
if Visualize is True:
964+
button.value = False
965+
966+
global all_node_colors
967+
968+
iterations, all_node_colors, node = algorithm(problem)
969+
solution = node.solution()
970+
all_node_colors.append(final_path_colors(all_node_colors[0], problem, solution))
971+
972+
slider.max = len(all_node_colors) - 1
973+
974+
for i in range(slider.max + 1):
975+
slider.value = i
976+
#time.sleep(.5)
977+
978+
slider = widgets.IntSlider(min=0, max=1, step=1, value=0)
979+
slider_visual = widgets.interactive(slider_callback, iteration = slider)
980+
display(slider_visual)
981+
982+
button = widgets.ToggleButton(value = False)
983+
button_visual = widgets.interactive(visualize_callback, Visualize = button)
984+
display(button_visual)
985+
986+
if user_input == True:
987+
node_colors = dict(initial_node_colors)
988+
if isinstance(algorithm, dict):
989+
assert set(algorithm.keys()).issubset(set(["Breadth First Tree Search",
990+
"Depth First Tree Search",
991+
"Breadth First Search",
992+
"Depth First Graph Search",
993+
"Uniform Cost Search",
994+
"A-star Search"]))
995+
996+
algo_dropdown = widgets.Dropdown(description = "Search algorithm: ",
997+
options = sorted(list(algorithm.keys())),
998+
value = "Breadth First Tree Search")
999+
display(algo_dropdown)
1000+
elif algorithm is None:
1001+
print("No algorithm to run.")
1002+
return 0
1003+
1004+
def slider_callback(iteration):
1005+
# don't show graph for the first time running the cell calling this function
1006+
try:
1007+
show_map(graph_data, node_colors = all_node_colors[iteration])
1008+
except:
1009+
pass
1010+
1011+
def visualize_callback(Visualize):
1012+
if Visualize is True:
1013+
button.value = False
1014+
1015+
problem = GraphProblem(start_dropdown.value, end_dropdown.value, romania_map)
1016+
global all_node_colors
1017+
1018+
user_algorithm = algorithm[algo_dropdown.value]
1019+
1020+
iterations, all_node_colors, node = user_algorithm(problem)
1021+
solution = node.solution()
1022+
all_node_colors.append(final_path_colors(all_node_colors[0], problem, solution))
1023+
1024+
slider.max = len(all_node_colors) - 1
1025+
1026+
for i in range(slider.max + 1):
1027+
slider.value = i
1028+
#time.sleep(.5)
1029+
1030+
start_dropdown = widgets.Dropdown(description = "Start city: ",
1031+
options = sorted(list(node_colors.keys())), value = "Arad")
1032+
display(start_dropdown)
1033+
1034+
end_dropdown = widgets.Dropdown(description = "Goal city: ",
1035+
options = sorted(list(node_colors.keys())), value = "Fagaras")
1036+
display(end_dropdown)
1037+
1038+
button = widgets.ToggleButton(value = False)
1039+
button_visual = widgets.interactive(visualize_callback, Visualize = button)
1040+
display(button_visual)
1041+
1042+
slider = widgets.IntSlider(min=0, max=1, step=1, value=0)
1043+
slider_visual = widgets.interactive(slider_callback, iteration = slider)
1044+
display(slider_visual)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy