filiprydin commited on
Commit
2a67dd0
·
1 Parent(s): 1059c55

add FLEX2 50 MGMOTSPTW EB

Browse files
MGMOTSPTW/models/FLEX2_50_EB.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ea30951f945d83a026ae48437498fd8a283c6197544b9bc214f8406a663e9812
3
+ size 26393840
MGMOTSPTW/test_flex2_50_eb.py ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ##########################################################################################
2
+ # Machine Environment Config
3
+ DEBUG_MODE = False
4
+ USE_CUDA = not DEBUG_MODE
5
+ CUDA_DEVICE_NUM = 0
6
+
7
+ ##########################################################################################
8
+ # Path Config
9
+ import os
10
+ import sys
11
+ import torch
12
+ import numpy as np
13
+
14
+ os.chdir(os.path.dirname(os.path.abspath(__file__)))
15
+ sys.path.insert(0, "..") # for problem_def
16
+ sys.path.insert(0, "../..") # for utils
17
+
18
+ ##########################################################################################
19
+ # import
20
+ import logging
21
+ from utils.utils import create_logger, copy_all_src
22
+
23
+
24
+ from eb_MGMOTSPTW.MGMOTSPTester import TSPTester
25
+ from MGMOTSPProblemDef import get_random_problems
26
+
27
+ ##########################################################################################
28
+ import time
29
+ import hvwfg
30
+
31
+ ##########################################################################################
32
+ # parameters
33
+ env_params = {
34
+ 'distribution': "FLEX", # FIX or FLEX
35
+ 'problem_size': 50,
36
+ 'pomo_size': 50,
37
+ 'emax': 2
38
+ }
39
+
40
+ training_method = "Chb" # Linear or Chb
41
+
42
+ encoder_params = {
43
+ 'embedding_dim': 128,
44
+ 'encoder_layer_num': 6,
45
+ 'qkv_dim': 16,
46
+ 'head_num': 8,
47
+ 'ff_hidden_dim': 512,
48
+ "dropout": 0.1,
49
+ }
50
+
51
+ decoder_params = {
52
+ 'embedding_dim': 128,
53
+ 'qkv_dim': 16,
54
+ 'head_num': 8,
55
+ 'logit_clipping': 10,
56
+ 'eval_type': 'argmax',
57
+ }
58
+ decoder_params["training_method"] = training_method
59
+
60
+ tester_params = {
61
+ 'use_cuda': USE_CUDA,
62
+ 'cuda_device_num': CUDA_DEVICE_NUM,
63
+ 'model_load_path': './result/FLEX2_50.pt', # path of pre-trained model
64
+ 'data_load_path': './data/FLEX2_50', # path of test data. If None, random problems will be generated.
65
+ 'reference': [55, 30],
66
+ 'test_episodes': 200,
67
+ 'test_batch_size': 100,
68
+ 'augmentation_enable': False,
69
+ 'aug_factor': 8,
70
+ 'aug_batch_size': 25
71
+ }
72
+ if tester_params['augmentation_enable']:
73
+ tester_params['test_batch_size'] = tester_params['aug_batch_size']
74
+
75
+ logger_params = {
76
+ 'log_file': {
77
+ 'desc': 'test__tsp_n20',
78
+ 'filename': 'run_log'
79
+ }
80
+ }
81
+
82
+ ### Config end
83
+
84
+ ##########################################################################################
85
+ def _set_debug_mode():
86
+ global tester_params
87
+ tester_params['test_episodes'] = 100
88
+
89
+ def _print_config():
90
+ logger = logging.getLogger('root')
91
+ logger.info('DEBUG_MODE: {}'.format(DEBUG_MODE))
92
+ logger.info('USE_CUDA: {}, CUDA_DEVICE_NUM: {}'.format(USE_CUDA, CUDA_DEVICE_NUM))
93
+ [logger.info(key + ": {}".format(env_params[key])) for key in env_params.keys()]
94
+ logger.info('Training Method: {}'.format(training_method))
95
+ [logger.info(key + ": {}".format(encoder_params[key])) for key in encoder_params.keys()]
96
+ [logger.info(key + ": {}".format(decoder_params[key])) for key in decoder_params.keys()]
97
+ [logger.info(key + ": {}".format(tester_params[key])) for key in tester_params.keys()]
98
+
99
+ def load_problems(path):
100
+ edge_dists = torch.load(os.path.join(path, "dists"), weights_only=True)
101
+ edge_to_node = torch.load(os.path.join(path, "edge_to_node"), weights_only=True)
102
+ service_time = torch.load(os.path.join(path, "service_time"), weights_only=True)
103
+ tw_start = torch.load(os.path.join(path, "tw_start"), weights_only=True)
104
+ tw_end = torch.load(os.path.join(path, "tw_end"), weights_only=True)
105
+
106
+ return edge_dists, edge_to_node, service_time, tw_start, tw_end
107
+
108
+ ##########################################################################################
109
+ def main(n_sols = 101):
110
+
111
+ if DEBUG_MODE:
112
+ _set_debug_mode()
113
+
114
+ # We treat depot as any other node
115
+ env_params['problem_size'] += 1
116
+
117
+ create_logger(**logger_params)
118
+ _print_config()
119
+
120
+ tester = TSPTester(
121
+ training_method=training_method,
122
+ env_params=env_params,
123
+ encoder_params=encoder_params,
124
+ decoder_params=decoder_params,
125
+ tester_params=tester_params)
126
+
127
+ if tester_params['data_load_path'] is not None:
128
+ shared_problem, edge_to_node, service_time, tw_start, tw_end = load_problems(tester_params['data_load_path'])
129
+ edge_attr = shared_problem.to(tester.device)
130
+ edge_to_node = edge_to_node.to(tester.device)
131
+ service_time = service_time.to(tester.device)
132
+ tw_start = tw_start.to(tester.device)
133
+ tw_end = tw_end.to(tester.device)
134
+ else:
135
+ edge_attr, edge_to_node, service_time, tw_start, tw_end = get_random_problems(env_params['distribution'], tester_params['test_episodes'], env_params['problem_size'], env_params['emax'])
136
+
137
+ prefs = torch.zeros((n_sols, 2))
138
+ for i in range(n_sols):
139
+ prefs[i, 0] = 1 - 0.01 * i
140
+ prefs[i, 1] = 0.01 * i
141
+
142
+ timer_start = time.time()
143
+
144
+ sols = tester.run(edge_attr, edge_to_node, service_time, tw_start, tw_end, prefs, print_results=False)
145
+
146
+ timer_end = time.time()
147
+
148
+ total_time = timer_end - timer_start
149
+
150
+ ref = np.asarray(tester_params['reference'])
151
+ hv = hvwfg.wfg(sols.astype(float), ref.astype(float))
152
+ hv_ratio = hv / (ref[0] * ref[1])
153
+
154
+ print('Run Time(s): {:.4f}'.format(total_time))
155
+ print('HV Ratio: {:.4f}'.format(hv_ratio))
156
+
157
+ ##########################################################################################
158
+ if __name__ == "__main__":
159
+ main()
MGMOTSPTW/train_flex2_50_eb.py ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ##########################################################################################
2
+ # Machine Environment Config
3
+ DEBUG_MODE = False
4
+ USE_CUDA = not DEBUG_MODE
5
+ CUDA_DEVICE_NUM = 0
6
+
7
+ ##########################################################################################
8
+ # Path Config
9
+ import os
10
+ import sys
11
+
12
+ os.chdir(os.path.dirname(os.path.abspath(__file__)))
13
+ sys.path.insert(0, "..") # for problem_def
14
+ sys.path.insert(0, "../..") # for utils
15
+
16
+ ##########################################################################################
17
+ # import
18
+ import logging
19
+ from utils.utils import create_logger, copy_all_src
20
+
21
+ from MGMOTSPTrainer import TSPTrainer
22
+
23
+ ##########################################################################################
24
+ # parameters
25
+ env_params = {
26
+ 'distribution': "FLEX", # FIX or FLEX
27
+ 'problem_size': 50,
28
+ 'pomo_size': 50,
29
+ 'emax': 2
30
+ }
31
+
32
+ training_method = "Chb" # Linear or Chb
33
+ curriculum_learning = True
34
+
35
+ encoder_params = {
36
+ 'embedding_dim': 128,
37
+ 'encoder_layer_num': 6,
38
+ 'qkv_dim': 16,
39
+ 'head_num': 8,
40
+ 'ff_hidden_dim': 512,
41
+ "dropout": 0.1,
42
+ }
43
+
44
+ decoder_params = {
45
+ 'embedding_dim': 128,
46
+ 'qkv_dim': 16,
47
+ 'head_num': 8,
48
+ 'logit_clipping': 10,
49
+ 'eval_type': 'argmax',
50
+ }
51
+ decoder_params["training_method"] = training_method
52
+
53
+ optimizer_params = {
54
+ 'optimizer': {
55
+ 'lr': 1e-4,
56
+ 'weight_decay': 1e-6
57
+ },
58
+ 'scheduler': {
59
+ 'milestones': [180,],
60
+ 'gamma': 0.1
61
+ }
62
+ }
63
+
64
+ trainer_params = {
65
+ 'use_cuda': USE_CUDA,
66
+ 'cuda_device_num': CUDA_DEVICE_NUM,
67
+ 'epochs': 200,
68
+ 'train_episodes': 100*1000,
69
+ 'train_batch_size': 64,
70
+ 'logging': {
71
+ 'model_save_interval': 5,
72
+ },
73
+ 'model_load': {
74
+ 'enable': False, # enable loading pre-trained model
75
+ 'path': './Final_result/edge_50', # directory path of pre-trained model and log files saved.
76
+ 'epoch': 20, # epoch version of pre-trained model to laod.
77
+ }
78
+ }
79
+
80
+ logger_params = {
81
+ 'log_file': {
82
+ 'desc': 'train__tsp',
83
+ 'filename': 'run_log'
84
+ }
85
+ }
86
+
87
+ def curriculum_function(epoch):
88
+
89
+ if epoch <= 100:
90
+ problem_size = 20
91
+ fwd_batch_size = 64
92
+ else:
93
+ problem_size = 50
94
+ fwd_batch_size = 32
95
+
96
+ problem_size = problem_size + 1
97
+ pomo_size = problem_size - 1
98
+ batch_size = 64
99
+ emax = 2
100
+
101
+ return problem_size, pomo_size, batch_size, fwd_batch_size, emax
102
+
103
+ ### Config end
104
+
105
+ ##########################################################################################
106
+ # main
107
+ def main():
108
+ if DEBUG_MODE:
109
+ _set_debug_mode()
110
+
111
+ create_logger(**logger_params)
112
+
113
+ _print_config()
114
+
115
+ # We treat depot as any other node
116
+ env_params['problem_size'] += 1
117
+
118
+ trainer = TSPTrainer(
119
+ training_method=training_method,
120
+ env_params=env_params,
121
+ curriculum_learning=curriculum_learning,
122
+ curriculum_function=curriculum_function,
123
+ encoder_params=encoder_params,
124
+ decoder_params=decoder_params,
125
+ optimizer_params=optimizer_params,
126
+ trainer_params=trainer_params)
127
+
128
+ copy_all_src(trainer.result_folder)
129
+
130
+ trainer.run()
131
+
132
+ def _set_debug_mode():
133
+ global trainer_params
134
+ trainer_params['epochs'] = 1
135
+ trainer_params['train_episodes'] = 10
136
+ trainer_params['train_batch_size'] = 10
137
+
138
+ def _print_config():
139
+ logger = logging.getLogger('root')
140
+ logger.info('DEBUG_MODE: {}'.format(DEBUG_MODE))
141
+ logger.info('USE_CUDA: {}, CUDA_DEVICE_NUM: {}'.format(USE_CUDA, CUDA_DEVICE_NUM))
142
+ [logger.info(key + ": {}".format(env_params[key])) for key in env_params.keys()]
143
+ [logger.info("Curriculum Learning: {}".format(curriculum_learning))]
144
+ [logger.info("Training Method: {}".format(training_method))]
145
+ [logger.info(key + ": {}".format(encoder_params[key])) for key in encoder_params.keys()]
146
+ [logger.info(key + ": {}".format(decoder_params[key])) for key in decoder_params.keys()]
147
+ [logger.info(key + ": {}".format(optimizer_params[key])) for key in optimizer_params.keys()]
148
+ [logger.info(key + ": {}".format(trainer_params[key])) for key in trainer_params.keys()]
149
+
150
+ ##########################################################################################
151
+
152
+ if __name__ == "__main__":
153
+ main()