-
Notifications
You must be signed in to change notification settings - Fork 0
/
grasp_main.py
117 lines (92 loc) · 4.82 KB
/
grasp_main.py
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
# -*- coding: utf-8 -*-
# Created by José Miguel García Benayas
import glob
import logging
import os
import random
import signal
import sys
import time
from graph_utils import GraphUtils
from instance import Instance
from solution_grasp import SolutionGrasp
# Logs
LOGGER = logging.getLogger(__name__)
# Sources
GRAPH_PATH_SETS = 'sets/'
CSV_OUTPUT_FILE = "solution_table_{0}_{1}.csv"
CSV_OUTPUT_FILE_LS = "solution_table_{0}_{1}_LS.csv"
ALL_FILES_TXT_EXT = "**/*.txt"
CSV_EXT = "csv"
CSV_OUTPUT_DIR = "output"
# Messages
MAIN_TOTAL_TIME = "Total time: {0} seconds."
MAIN_LOG_PROCESS = "Processed: {0} - Solution type: {1} - Iteration: {2} - Alpha: {3} - Time: {4:1.5f} - Clique: {5}"
MAIN_LOG_PROCESS_OLD = "Old Solution: {0} - Ratio: {1:.5f} - Cardinality: {2} - Time: {3:.5f}"
MAIN_LOG_PROCESS_LS = "New solution: {0} - Ratio: {1:.5f} - Cardinality: {2} - Time: {3:.5f}"
MAIN_SEP_NAMES = "_"
MAIN_LOG_TIMEOUT = "Timeout: {0} - {1}"
# Config
TOTAL_ITERATIONS = 100
TIMEOUT_VALUE = 1800
def split_name(total_path):
name_splitted = os.path.splitext(total_path)[0].split(os.sep)
return "{0}_{1}".format(name_splitted[1], name_splitted[-1])
class Timeout(Exception):
pass
def handler(sig, frame):
raise Timeout
if __name__ == '__main__':
signal.signal(signal.SIGALRM, handler)
fixed_seed = None
random_alpha = random.random()
alpha_list = [0.25, 0.5, 0.75, random_alpha]
graph = Instance()
solution_types = [SolutionGrasp.RATIO, SolutionGrasp.ADJACENT]
for file in glob.glob(GRAPH_PATH_SETS + ALL_FILES_TXT_EXT, recursive=True):
for solution_type in solution_types:
data = dict()
data_ls = dict()
filename = os.path.splitext(os.path.basename(file))[0]
graph.read_file(file)
instance_solution = SolutionGrasp()
for alpha in alpha_list:
for iteration in range(1, TOTAL_ITERATIONS + 1):
start_time = time.time()
signal.alarm(TIMEOUT_VALUE)
try:
solution = instance_solution.find_grasp_solution(graph, file, solution_type, fixed_seed, alpha)
find_grasp_sol_time = time.time() - start_time
ratio, density, cardinality = GraphUtils.calculate_solution(graph, solution)
local_search_sol = instance_solution.apply_ls(graph, solution)
find_ls_sol_time = time.time() - start_time
ls_ratio, ls_density, ls_cardinality = GraphUtils.calculate_solution(graph, local_search_sol)
table_key_name = filename + MAIN_SEP_NAMES + solution_type + MAIN_SEP_NAMES + str(
iteration) + MAIN_SEP_NAMES + str(alpha)
data.update({table_key_name: [graph.get_total_nodes(), density, ratio, cardinality,
find_grasp_sol_time, alpha]})
data_ls.update({table_key_name: [graph.get_total_nodes(), ls_density, ls_ratio, ls_cardinality,
find_ls_sol_time, alpha]})
if GraphUtils.is_clique_solution(graph, solution):
LOGGER.debug(MAIN_LOG_PROCESS.format(file, solution_type, iteration, alpha,
find_grasp_sol_time, solution))
else:
LOGGER.fatal(MAIN_LOG_PROCESS.format(file, solution_type, iteration, alpha,
find_grasp_sol_time, solution))
sys.exit()
if GraphUtils.is_clique_solution(graph, local_search_sol):
LOGGER.debug(MAIN_LOG_PROCESS_OLD.format(solution, ratio, cardinality, find_grasp_sol_time))
LOGGER.debug(MAIN_LOG_PROCESS_LS.format(local_search_sol, ls_ratio, ls_cardinality,
find_ls_sol_time))
else:
LOGGER.fatal(MAIN_LOG_PROCESS.format(file, solution_type, iteration, alpha,
find_grasp_sol_time, local_search_sol))
sys.exit()
except Timeout:
LOGGER.fatal(MAIN_LOG_TIMEOUT.format(iteration, file))
output_name = split_name(file)
export_filename = CSV_OUTPUT_FILE.format(solution_type, output_name)
GraphUtils.export_solution(CSV_OUTPUT_DIR, data, export_filename)
export_filename_ls = CSV_OUTPUT_FILE_LS.format(solution_type, output_name)
GraphUtils.export_solution(CSV_OUTPUT_DIR, data_ls, export_filename_ls)
sys.exit()