filiprydin commited on
Commit
9bdbf6a
·
1 Parent(s): ca0bc11

add TMAT 50 MOCVRP DH

Browse files
MOCVRP/models/TMAT_50_DH.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ca04dd800a52c0adfb8d946d42afcc57d54641758644058074c9762ca6baed5b
3
+ size 26939070
MOCVRP/test_tmat_50_dh.py ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 time
12
+ import torch
13
+ import numpy as np
14
+ import hvwfg
15
+
16
+ os.chdir(os.path.dirname(os.path.abspath(__file__)))
17
+ sys.path.insert(0, "..") # for problem_def
18
+ sys.path.insert(0, "../..") # for utils
19
+
20
+ ##########################################################################################
21
+ # import
22
+ import logging
23
+ from utils.utils import create_logger, copy_all_src, get_result_folder
24
+
25
+ from MOCVRP.MOCVRPTester import CVRPTester
26
+ from MOCVRPProblemDef import get_random_problems
27
+
28
+ ##########################################################################################
29
+ # parameters
30
+ env_params = {
31
+ 'problem_size': 50,
32
+ 'pomo_size': 50,
33
+ 'distribution': "TMAT" # EUC, TMAT, XASY
34
+ }
35
+
36
+ architecture = "GMS-DH" # GMS-DH or GMS-EB
37
+ # GMS-DH: Change GREAT_params and dh_params for encoder
38
+ # GMS-EB: Change GREAT_params for encoder
39
+
40
+ training_method = "Chb" # Linear or Chb
41
+
42
+ GREAT_params = {
43
+ 'embedding_dim': 128,
44
+ 'encoder_layer_num': 6,
45
+ 'qkv_dim': 16,
46
+ 'head_num': 8,
47
+ 'ff_hidden_dim': 512,
48
+ "great_asymmetric": True,
49
+ "dropout": 0.1,
50
+ }
51
+
52
+ dh_params = {
53
+ 'L1': 5, # GNN layer number, overrides GREAT_params['encoder_layer_num']
54
+ 'L2': 2 # Transformer layer number
55
+ }
56
+
57
+ decoder_params = {
58
+ 'embedding_dim': 128,
59
+ 'qkv_dim': 16,
60
+ 'head_num': 8,
61
+ 'logit_clipping': 10,
62
+ 'eval_type': 'argmax',
63
+ }
64
+
65
+ tester_params = {
66
+ 'use_cuda': USE_CUDA,
67
+ 'cuda_device_num': CUDA_DEVICE_NUM,
68
+ 'model_load_path': './result/TMAT_50_DH.pt', # path of pre-trained model
69
+ 'data_load_path': './data/TMAT_50', # path of test data. If None, random problems will be generated.
70
+ 'reference': [40, 3],
71
+ 'test_episodes': 200,
72
+ 'test_batch_size': 200,
73
+ 'augmentation_enable': False,
74
+ 'aug_factor': 8,
75
+ 'aug_batch_size': 25
76
+ }
77
+ if tester_params['augmentation_enable']:
78
+ tester_params['test_batch_size'] = tester_params['aug_batch_size']
79
+
80
+ logger_params = {
81
+ 'log_file': {
82
+ 'desc': 'test__cvrp',
83
+ 'filename': 'run_log'
84
+ }
85
+ }
86
+
87
+ ### Config end
88
+
89
+ if architecture == "GMS-DH":
90
+ encoder = "hybrid"
91
+ decoder = "MP"
92
+
93
+ encoder_params = dh_params
94
+ encoder_params['edge_attention_params'] = GREAT_params
95
+ elif architecture == "GMS-EB":
96
+ encoder = "GREAT-E"
97
+ decoder = "MP-E"
98
+ encoder_params = GREAT_params
99
+
100
+ decoder_params["training_method"] = training_method
101
+
102
+ ##########################################################################################
103
+ def _set_debug_mode():
104
+ global tester_params
105
+ tester_params['test_episodes'] = 100
106
+
107
+ def _print_config():
108
+ logger = logging.getLogger('root')
109
+ logger.info('DEBUG_MODE: {}'.format(DEBUG_MODE))
110
+ logger.info('USE_CUDA: {}, CUDA_DEVICE_NUM: {}'.format(USE_CUDA, CUDA_DEVICE_NUM))
111
+ logger.info('Model: {}'.format(architecture))
112
+ [logger.info(key + ": {}".format(env_params[key])) for key in env_params.keys()]
113
+ logger.info('Training Method: {}'.format(training_method))
114
+ [logger.info(key + ": {}".format(encoder_params[key])) for key in encoder_params.keys()]
115
+ [logger.info(key + ": {}".format(decoder_params[key])) for key in decoder_params.keys()]
116
+ [logger.info(key + ": {}".format(tester_params[key])) for key in tester_params.keys()]
117
+
118
+ def load_problems(path):
119
+ dists = torch.load(os.path.join(path, "dists"), weights_only=True)
120
+ demands = torch.load(os.path.join(path, "demands"), weights_only=True)
121
+
122
+ return dists, demands
123
+
124
+ ##########################################################################################
125
+ def main(n_sols = 101):
126
+
127
+ if DEBUG_MODE:
128
+ _set_debug_mode()
129
+
130
+ create_logger(**logger_params)
131
+ _print_config()
132
+
133
+ # We treat depot as any other node
134
+ env_params['problem_size'] += 1
135
+
136
+ tester = CVRPTester(encoder=encoder,
137
+ decoder=decoder,
138
+ training_method=training_method,
139
+ env_params=env_params,
140
+ encoder_params=encoder_params,
141
+ decoder_params=decoder_params,
142
+ tester_params=tester_params)
143
+
144
+ if tester_params['data_load_path'] is not None:
145
+ shared_dists, shared_demands = load_problems(tester_params['data_load_path'])
146
+ shared_dists = shared_dists.to(tester.device)
147
+ shared_demands = shared_demands.to(tester.device)
148
+ else:
149
+ shared_dists, shared_demands = get_random_problems(env_params['distribution'], tester_params['test_episodes'], env_params['problem_size'])
150
+
151
+ prefs = torch.zeros((n_sols, 2))
152
+ for i in range(n_sols):
153
+ prefs[i, 0] = 1 - 0.01 * i
154
+ prefs[i, 1] = 0.01 * i
155
+
156
+ timer_start = time.time()
157
+
158
+ sols = tester.run(shared_dists, shared_demands, prefs, print_results=False)
159
+
160
+ timer_end = time.time()
161
+
162
+ total_time = timer_end - timer_start
163
+
164
+ ref = np.asarray(tester_params['reference'])
165
+ hv = hvwfg.wfg(sols.astype(float), ref.astype(float))
166
+ hv_ratio = hv / (ref[0] * ref[1])
167
+
168
+ print('Run Time(s): {:.4f}'.format(total_time))
169
+ print('HV Ratio: {:.4f}'.format(hv_ratio))
170
+
171
+ ##########################################################################################
172
+
173
+ if __name__ == "__main__":
174
+ main()
MOCVRP/train_tmat_50_dh.py ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 MOCVRPTrainer import CVRPTrainer
22
+
23
+ ##########################################################################################
24
+ # parameters
25
+ env_params = {
26
+ 'problem_size': 50,
27
+ 'pomo_size': 50,
28
+ 'distribution': "TMAT" # EUC, TMAT, XASY
29
+ }
30
+
31
+ architecture = "GMS-DH" # GMS-DH or GMS-EB
32
+ # GMS-DH: Change GREAT_params and dh_params for encoder
33
+ # GMS-EB: Change GREAT_params for encoder
34
+
35
+ training_method = "Chb" # Linear or Chb
36
+ curriculum_learning = True
37
+
38
+ GREAT_params = {
39
+ 'embedding_dim': 128,
40
+ 'encoder_layer_num': 6,
41
+ 'qkv_dim': 16,
42
+ 'head_num': 8,
43
+ 'ff_hidden_dim': 512,
44
+ "great_asymmetric": True, # True for TMAT/XASY, False for EUC
45
+ "dropout": 0.1,
46
+ }
47
+
48
+ dh_params = {
49
+ 'L1': 5, # GNN layer number, overrides GREAT_params['encoder_layer_num']
50
+ 'L2': 2 # Transformer layer number
51
+ }
52
+
53
+ decoder_params = {
54
+ 'embedding_dim': 128,
55
+ 'qkv_dim': 16,
56
+ 'head_num': 8,
57
+ 'logit_clipping': 10,
58
+ 'eval_type': 'argmax',
59
+ }
60
+
61
+ optimizer_params = {
62
+ 'optimizer': {
63
+ 'lr': 1e-4,
64
+ 'weight_decay': 1e-6
65
+ },
66
+ 'scheduler': {
67
+ 'milestones': [180,],
68
+ 'gamma': 0.1
69
+ }
70
+ }
71
+
72
+ trainer_params = {
73
+ 'use_cuda': USE_CUDA,
74
+ 'cuda_device_num': CUDA_DEVICE_NUM,
75
+ 'epochs': 200,
76
+ 'train_episodes': 100*1000,
77
+ 'train_batch_size': 64,
78
+ 'logging': {
79
+ 'model_save_interval': 5,
80
+ },
81
+ 'model_load': {
82
+ 'enable': False, # enable loading pre-trained model
83
+ 'path': './Final_result/edge_50', # directory path of pre-trained model and log files saved.
84
+ 'epoch': 20, # epoch version of pre-trained model to laod.
85
+ }
86
+ }
87
+
88
+ logger_params = {
89
+ 'log_file': {
90
+ 'desc': 'train__cvrp',
91
+ 'filename': 'run_log'
92
+ }
93
+ }
94
+
95
+ def curriculum_function(epoch):
96
+
97
+ if epoch <= 100:
98
+ problem_size = 20
99
+ elif epoch <= 200:
100
+ problem_size = 50
101
+
102
+ batch_size = 64
103
+ fwd_batch_size = batch_size
104
+ problem_size += 1
105
+ pomo_size = problem_size - 1
106
+
107
+ return problem_size, pomo_size, batch_size, fwd_batch_size
108
+
109
+ ### Config end
110
+
111
+ if architecture == "GMS-DH":
112
+ encoder = "hybrid"
113
+ decoder = "MP"
114
+
115
+ encoder_params = dh_params
116
+ encoder_params['edge_attention_params'] = GREAT_params
117
+ elif architecture == "GMS-EB":
118
+ encoder = "GREAT-E"
119
+ decoder = "MP-E"
120
+ encoder_params = GREAT_params
121
+
122
+ decoder_params["training_method"] = training_method
123
+ ##########################################################################################
124
+ # main
125
+ def main():
126
+ if DEBUG_MODE:
127
+ _set_debug_mode()
128
+
129
+ create_logger(**logger_params)
130
+
131
+ _print_config()
132
+
133
+ # We treat depot as any other node
134
+ env_params['problem_size'] += 1
135
+
136
+ trainer = CVRPTrainer(encoder=encoder,
137
+ decoder=decoder,
138
+ training_method=training_method,
139
+ curriculum_learning=curriculum_learning,
140
+ curriculum_function=curriculum_function,
141
+ env_params=env_params,
142
+ encoder_params=encoder_params,
143
+ decoder_params=decoder_params,
144
+ optimizer_params=optimizer_params,
145
+ trainer_params=trainer_params)
146
+
147
+ copy_all_src(trainer.result_folder)
148
+
149
+ trainer.run()
150
+
151
+ def _set_debug_mode():
152
+ global trainer_params
153
+ trainer_params['epochs'] = 1
154
+ trainer_params['train_episodes'] = 10
155
+ trainer_params['train_batch_size'] = 10
156
+
157
+ def _print_config():
158
+ logger = logging.getLogger('root')
159
+ logger.info('DEBUG_MODE: {}'.format(DEBUG_MODE))
160
+ logger.info('USE_CUDA: {}, CUDA_DEVICE_NUM: {}'.format(USE_CUDA, CUDA_DEVICE_NUM))
161
+ logger.info('Model: {}'.format(architecture))
162
+ [logger.info(key + ": {}".format(env_params[key])) for key in env_params.keys()]
163
+ [logger.info("Curriculum Learning: {}".format(curriculum_learning))]
164
+ [logger.info("Training Method: {}".format(training_method))]
165
+ [logger.info(key + ": {}".format(encoder_params[key])) for key in encoder_params.keys()]
166
+ [logger.info(key + ": {}".format(decoder_params[key])) for key in decoder_params.keys()]
167
+ [logger.info(key + ": {}".format(optimizer_params[key])) for key in optimizer_params.keys()]
168
+ [logger.info(key + ": {}".format(trainer_params[key])) for key in trainer_params.keys()]
169
+
170
+ ##########################################################################################
171
+
172
+ if __name__ == "__main__":
173
+ main()