|
from greedrl.feature import * |
|
from cvrp import make_problem as make_cvrp_problem |
|
from torch.utils.data import Dataset, IterableDataset, DataLoader |
|
|
|
|
|
def make_problem(batch_count, batch_size, task_count): |
|
features = [continuous_feature('task_demand_x'), |
|
continuous_feature('distance_matrix')] |
|
|
|
problem_list = make_cvrp_problem(batch_count, batch_size, task_count) |
|
for problem in problem_list: |
|
problem.features = features |
|
|
|
return problem_list |
|
|
|
|
|
class Dataset(IterableDataset): |
|
def __init__(self, batch_count, batch_size, task_count): |
|
self._batch_size = batch_size |
|
self._task_count = task_count |
|
self._batch_count = batch_count |
|
self._index = 0 |
|
|
|
def __iter__(self): |
|
self._index = 0 |
|
return self |
|
|
|
def __next__(self): |
|
if self._batch_count is not None \ |
|
and self._index >= self._batch_count: |
|
raise StopIteration() |
|
|
|
p = make_problem(1, self._batch_size, self._task_count)[0] |
|
self._index += 1 |
|
return p |
|
|
|
|
|
def write_vrplib(filename, name, size, demand, capacity, location): |
|
with open(filename, 'w') as f: |
|
f.write('\n'.join([ |
|
"{} : {}".format(k, v) |
|
for k, v in ( |
|
('NAME', name), |
|
('TYPE', 'CVRP'), |
|
('COMMENT', 'NONE'), |
|
('DIMENSION', size + 1), |
|
('EDGE_WEIGHT_TYPE', 'EUC_2D'), |
|
('CAPACITY', capacity) |
|
) |
|
])) |
|
|
|
f.write('\n') |
|
f.write('NODE_COORD_SECTION\n') |
|
|
|
f.write('\n'.join(['{}\t{}\t{}'.format(i + 1, x, y) for i, (x, y) in enumerate(location)])) |
|
|
|
f.write('\n') |
|
f.write('DEMAND_SECTION\n') |
|
f.write('\n'.join(['{}\t{}'.format(i + 1, d) for i, d in enumerate([0] + demand)])) |
|
|
|
f.write('\n') |
|
f.write('DEPOT_SECTION\n') |
|
f.write('1\n') |
|
f.write('-1\n') |
|
f.write('EOF\n') |
|
|