From 0968dac538f34d4a39f60edf220027518f875c40 Mon Sep 17 00:00:00 2001 From: Almog-David Date: Sun, 4 Aug 2024 16:37:45 +0300 Subject: [PATCH] fixrd path to comparisons --- .../firefighter_problem/comparisons.py | 36 +++--- .../spreading_minbudget.csv | 20 --- .../spreading_minbudget.png | Bin 29855 -> 0 bytes .../spreading_minbudget_preprocessed.csv | 19 --- experiments/spreading_minbudget.csv | 114 ------------------ 5 files changed, 18 insertions(+), 171 deletions(-) delete mode 100644 experiments/firefighter_problem/spreading_minbudget.csv delete mode 100644 experiments/firefighter_problem/spreading_minbudget.png delete mode 100644 experiments/firefighter_problem/spreading_minbudget_preprocessed.csv delete mode 100644 experiments/spreading_minbudget.csv diff --git a/experiments/firefighter_problem/comparisons.py b/experiments/firefighter_problem/comparisons.py index 75d6876..34fed01 100644 --- a/experiments/firefighter_problem/comparisons.py +++ b/experiments/firefighter_problem/comparisons.py @@ -118,7 +118,7 @@ def Compare_NonSpread(): This function runs multiple experiments on randomly generated layered networks and plots the results comparing the budget used by different algorithms. """ - ex1 = experiments_csv.Experiment("./experiments/", "non_spreading.csv", backup_folder=None) + ex1 = experiments_csv.Experiment("./experiments/firefighter_problem/", "non_spreading.csv", backup_folder=None) ex1.clear_previous_results() # to clear previous experiments input_ranges = { @@ -144,7 +144,7 @@ def multiple_runs(runs=30): ex1.run_with_time_limit(multiple_runs, input_ranges={}, time_limit=0.9) # Preprocess the DataFrame to extract numeric budget values - results_csv_file = "./experiments/non_spreading_minbudget.csv" + results_csv_file = "./experiments/firefighter_problem/non_spreading_minbudget.csv" results = pd.read_csv(results_csv_file) # Extract the numeric budget from the 'Budget' column @@ -164,7 +164,7 @@ def extract_budget_numeric(budget): results = results.dropna(subset=['Budget_numeric']) # Save the preprocessed DataFrame to a temporary CSV file - preprocessed_csv_file = "./experiments/non_spreading_minbudget_preprocessed.csv" + preprocessed_csv_file = "./experiments/firefighter_problem/non_spreading_minbudget_preprocessed.csv" results.to_csv(preprocessed_csv_file, index=False) print("\n DataFrame-NonSpread: \n", results) @@ -177,7 +177,7 @@ def extract_budget_numeric(budget): y_field="Budget_numeric", z_field="algorithm", mean=True, - save_to_file="./experiments/non_spreading.png" + save_to_file="./experiments/firefighter_problem/non_spreading.png" ) print("\n DataFrame-NonSpread: \n", ex1.dataFrame) @@ -189,7 +189,7 @@ def Compare_SpreadingMaxSave(): This function runs multiple experiments on randomly generated directed graphs and plots the results comparing the number of nodes saved by different algorithms. """ - ex2 = experiments_csv.Experiment("./experiments/", "spreading_maxsave.csv", backup_folder=None) + ex2 = experiments_csv.Experiment("./experiments/firefighter_problem/", "spreading_maxsave.csv", backup_folder=None) ex2.clear_previous_results() # to clear previous experiments input_ranges = { @@ -224,7 +224,7 @@ def multiple_runs(runs=10): ## DATA ISSUE WE HAD SO THIS IS A FIX ## # Load the results - results_csv_file = "./experiments/spreading_maxsave.csv" + results_csv_file = "./experiments/firefighter_problem/spreading_maxsave.csv" results = pd.read_csv(results_csv_file) # Ensure 'algorithm' column is of type string @@ -245,7 +245,7 @@ def multiple_runs(runs=10): results['Nodes_Saved'] = results['Nodes_Saved'].astype(int) # Save the cleaned DataFrame to a new CSV file (optional, for debugging) - cleaned_csv_file = "./experiments/spreading_maxsave_preprocessed.csv" + cleaned_csv_file = "./experiments/firefighter_problem/spreading_maxsave_preprocessed.csv" results.to_csv(cleaned_csv_file, index=False) # Plot the results using the cleaned DataFrame @@ -261,7 +261,7 @@ def multiple_runs(runs=10): sharex=True, sharey=True, mean=True, - save_to_file="./experiments/spreading_maxsave_budget.png" + save_to_file="./experiments/firefighter_problem/spreading_maxsave_budget.png" ) multi_plot_results( @@ -276,7 +276,7 @@ def multiple_runs(runs=10): sharex=True, sharey=True, mean=True, - save_to_file="./experiments/spreading_maxsave_100_edge_prob.png" + save_to_file="./experiments/firefighter_problem/spreading_maxsave_100_edge_prob.png" ) multi_plot_results( @@ -291,7 +291,7 @@ def multiple_runs(runs=10): sharex=True, sharey=True, mean=True, - save_to_file="./experiments/spreading_maxsave_200_edge_prob.png" + save_to_file="./experiments/firefighter_problem/spreading_maxsave_200_edge_prob.png" ) multi_plot_results( @@ -306,7 +306,7 @@ def multiple_runs(runs=10): sharex=True, sharey=True, mean=True, - save_to_file="./experiments/spreading_maxsave_400_edge_prob.png" + save_to_file="./experiments/firefighter_problem/spreading_maxsave_400_edge_prob.png" ) print("\n DataFrame-NonSpread: \n", ex2.dataFrame) @@ -318,7 +318,7 @@ def Compare_SpreadingMinBudget(): This function runs multiple experiments on randomly generated directed graphs and plots the results comparing the budget used by different algorithms. """ - ex3 = experiments_csv.Experiment("./experiments/", "spreading_minbudget.csv", backup_folder=None) + ex3 = experiments_csv.Experiment("./experiments/firefighter_problem/", "spreading_minbudget.csv", backup_folder=None) ex3.clear_previous_results() # to clear previous experiments input_ranges = { @@ -349,7 +349,7 @@ def multiple_runs(runs=10): ex3.run_with_time_limit(multiple_runs, input_ranges={}, time_limit=0.9) # Preprocess the DataFrame to extract numeric budget values - results_csv_file = "./experiments/spreading_minbudget.csv" + results_csv_file = "./experiments/firefighter_problem/spreading_minbudget.csv" results = pd.read_csv(results_csv_file) # Extract the numeric budget from the 'Budget' column @@ -369,7 +369,7 @@ def extract_budget_numeric(budget): results = results.dropna(subset=['Budget_numeric']) # Save the preprocessed DataFrame to a temporary CSV file - preprocessed_csv_file = "./experiments/spreading_minbudget_preprocessed.csv" + preprocessed_csv_file = "./experiments/firefighter_problem/spreading_minbudget_preprocessed.csv" results.to_csv(preprocessed_csv_file, index=False) print("\n DataFrame-NonSpread: \n", results) @@ -382,17 +382,17 @@ def extract_budget_numeric(budget): y_field="Budget_numeric", z_field="algorithm", mean=True, - save_to_file="./experiments/spreading_minbudget.png" + save_to_file="./experiments/firefighter_problem/spreading_minbudget.png" ) single_plot_results( results_csv_file=preprocessed_csv_file, - filter={"edge_probability":0.1}, - x_field="graph_nodes", + filter={"graph_nodes":400}, + x_field="edge_probability", y_field="Budget_numeric", z_field="algorithm", mean=True, - save_to_file="./experiments/spreading_minbudget_edge.png" + save_to_file="./experiments/firefighter_problem/spreading_minbudget_400_edge.png" ) print("\n DataFrame-NonSpread: \n", ex3.dataFrame) diff --git a/experiments/firefighter_problem/spreading_minbudget.csv b/experiments/firefighter_problem/spreading_minbudget.csv deleted file mode 100644 index 7c2b261..0000000 --- a/experiments/firefighter_problem/spreading_minbudget.csv +++ /dev/null @@ -1,20 +0,0 @@ -algorithm,runtime,graph_nodes,Budget -spreading_minbudget,0.4963123999768868,100,"(4, [(89, 1), (47, 1), (84, 1), (30, 1), (38, 2), (50, 2), (3, 2), (26, 2)])" -heuristic_minbudget,0.12413459992967546,100,"(4, [(47, 1), (92, 1), (44, 1), (17, 1), (83, 2), (62, 2), (50, 2), (26, 2), (69, 3), (29, 3)])" -spreading_minbudget,0.39317540009506047,100,"(11, [(3, 1), (15, 1), (28, 1), (54, 1), (71, 1), (96, 1), (97, 1), (17, 1), (35, 1), (45, 1), (22, 1)])" -heuristic_minbudget,1.0460371000226587,100,"(10, [(22, 1), (35, 1), (28, 1), (54, 1), (96, 1), (17, 1), (97, 1), (15, 1), (45, 1), (71, 1)])" -spreading_minbudget,0.2668848999310285,100,"(14, [(14, 1), (20, 1), (30, 1), (40, 1), (48, 1), (57, 1), (71, 1), (80, 1), (86, 1), (91, 1), (92, 1), (96, 1), (5, 1), (89, 1)])" -heuristic_minbudget,3.6302230999572203,100,"(14, [(14, 1), (40, 1), (48, 1), (86, 1), (96, 1), (20, 1), (91, 1), (80, 1), (92, 1), (71, 1), (30, 1), (5, 1), (57, 1), (89, 1)])" -spreading_minbudget,1.212209300021641,200,"(22, [(70, 1), (128, 1), (53, 1), (55, 1), (125, 1), (152, 1), (28, 1), (104, 1), (17, 1), (20, 1), (174, 1), (5, 1), (31, 1), (35, 1), (44, 1), (120, 1), (151, 1), (172, 1), (175, 1), (190, 1), (146, 1), (168, 1)])" -heuristic_minbudget,1.0129838000284508,200,"(14, [(174, 1), (151, 1), (146, 1), (168, 1), (17, 1), (172, 1), (152, 1), (190, 1), (35, 1), (5, 1), (44, 1), (175, 1), (120, 1), (52, 1), (128, 2), (109, 2), (148, 2), (16, 2), (76, 2), (32, 2), (114, 2), (8, 2), (95, 2), (39, 2), (48, 2), (138, 2), (116, 2), (157, 2)])" -spreading_minbudget,0.5931069999933243,200,"(5, [(5, 1), (44, 1), (193, 1), (170, 1), (24, 1)])" -heuristic_minbudget,5.592074999934994,200,"(4, [(44, 1), (24, 1), (193, 1), (170, 1)])" -spreading_minbudget,1.2939483999507502,200,"(40, [(89, 1), (3, 1), (4, 1), (13, 1), (17, 1), (19, 1), (27, 1), (45, 1), (50, 1), (62, 1), (74, 1), (84, 1), (92, 1), (95, 1), (97, 1), (118, 1), (119, 1), (123, 1), (124, 1), (128, 1), (138, 1), (142, 1), (144, 1), (146, 1), (152, 1), (153, 1), (180, 1), (191, 1), (198, 1), (11, 1), (29, 1), (93, 1), (100, 1), (141, 1), (164, 1), (167, 1), (173, 1), (184, 1), (102, 1), (86, 1)])" -heuristic_minbudget,20.179923600051552,200,"(40, [(4, 1), (146, 1), (144, 1), (153, 1), (152, 1), (62, 1), (173, 1), (119, 1), (13, 1), (89, 1), (142, 1), (164, 1), (27, 1), (45, 1), (102, 1), (95, 1), (141, 1), (128, 1), (29, 1), (167, 1), (86, 1), (191, 1), (74, 1), (100, 1), (11, 1), (84, 1), (3, 1), (118, 1), (93, 1), (180, 1), (92, 1), (50, 1), (138, 1), (17, 1), (184, 1), (19, 1), (124, 1), (123, 1), (198, 1), (97, 1)])" -spreading_minbudget,3.5869039999088272,400,"(21, [(69, 1), (116, 1), (239, 1), (159, 1), (250, 1), (37, 1), (192, 1), (144, 1), (387, 1), (29, 1), (287, 1), (7, 1), (63, 1), (300, 1), (305, 1), (93, 1), (280, 1), (112, 1), (149, 1), (11, 1), (230, 1)])" -heuristic_minbudget,2.8195147999795154,400,"(15, [(287, 1), (305, 1), (300, 1), (149, 1), (63, 1), (11, 1), (93, 1), (280, 1), (112, 1), (230, 1), (29, 1), (343, 1), (103, 1), (364, 1), (339, 1), (190, 2), (110, 2), (121, 2), (393, 2), (193, 2), (200, 2), (354, 2), (1, 2), (147, 2), (159, 2), (367, 2), (267, 2), (204, 2), (50, 2), (373, 2)])" -spreading_minbudget,6.544073999975808,400,"(63, [(103, 1), (333, 1), (88, 1), (2, 1), (17, 1), (27, 1), (29, 1), (66, 1), (72, 1), (76, 1), (89, 1), (135, 1), (143, 1), (148, 1), (150, 1), (152, 1), (165, 1), (166, 1), (190, 1), (222, 1), (250, 1), (257, 1), (275, 1), (289, 1), (291, 1), (292, 1), (293, 1), (306, 1), (315, 1), (326, 1), (327, 1), (363, 1), (373, 1), (380, 1), (386, 1), (40, 1), (109, 1), (112, 1), (140, 1), (182, 1), (229, 1), (238, 1), (239, 1), (325, 1), (390, 1), (9, 1), (90, 1), (171, 1), (184, 1), (359, 1), (385, 1), (393, 1), (11, 1), (51, 1), (71, 1), (212, 1), (364, 1), (230, 1), (368, 1), (391, 1), (52, 1), (353, 1), (276, 1)])" -heuristic_minbudget,45.2434607000323,400,"(62, [(327, 1), (150, 1), (364, 1), (166, 1), (291, 1), (143, 1), (229, 1), (315, 1), (17, 1), (109, 1), (212, 1), (27, 1), (2, 1), (11, 1), (257, 1), (306, 1), (148, 1), (239, 1), (390, 1), (363, 1), (71, 1), (76, 1), (275, 1), (276, 1), (72, 1), (184, 1), (325, 1), (353, 1), (51, 1), (135, 1), (112, 1), (165, 1), (238, 1), (293, 1), (289, 1), (385, 1), (9, 1), (140, 1), (222, 1), (250, 1), (386, 1), (359, 1), (29, 1), (373, 1), (292, 1), (391, 1), (326, 1), (40, 1), (380, 1), (171, 1), (230, 1), (393, 1), (182, 1), (368, 1), (52, 1), (66, 1), (152, 1), (88, 1), (89, 1), (333, 1), (190, 1), (90, 1)])" -spreading_minbudget,4.017668400076218,400,"(43, [(44, 1), (56, 1), (71, 1), (104, 1), (105, 1), (110, 1), (130, 1), (142, 1), (151, 1), (157, 1), (171, 1), (179, 1), (189, 1), (214, 1), (222, 1), (229, 1), (232, 1), (271, 1), (281, 1), (296, 1), (297, 1), (308, 1), (309, 1), (335, 1), (339, 1), (344, 1), (354, 1), (355, 1), (359, 1), (371, 1), (373, 1), (382, 1), (385, 1), (68, 1), (89, 1), (98, 1), (150, 1), (253, 1), (254, 1), (307, 1), (369, 1), (378, 1), (84, 1)])" -heuristic_minbudget,96.92596789996605,400,"(43, [(56, 1), (84, 1), (222, 1), (214, 1), (307, 1), (335, 1), (369, 1), (371, 1), (309, 1), (339, 1), (104, 1), (189, 1), (229, 1), (232, 1), (382, 1), (296, 1), (130, 1), (151, 1), (171, 1), (110, 1), (179, 1), (271, 1), (71, 1), (344, 1), (354, 1), (378, 1), (254, 1), (385, 1), (68, 1), (157, 1), (281, 1), (308, 1), (44, 1), (373, 1), (105, 1), (359, 1), (142, 1), (253, 1), (297, 1), (150, 1), (355, 1), (89, 1), (98, 1)])" -,195.34563290001824,, diff --git a/experiments/firefighter_problem/spreading_minbudget.png b/experiments/firefighter_problem/spreading_minbudget.png deleted file mode 100644 index a42e7c25bbc3a85acee593bf595d4519f8ff6b3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29855 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