summaryrefslogtreecommitdiffstats
path: root/vrptw_base.py
blob: 37b73d31d351019ab3547384914b46eea7c6da46 (plain)
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
import numpy as np


class Node:
    def __init__(self, x, y, demand, earliest_time, latest_time, service_time):
        super()
        self.x = x
        self.y = y
        self.demand = demand
        self.earliest_time = earliest_time
        self.latest_time = latest_time
        self.service_time = service_time


class Graph:
    def __init__(self, file_path):
        super()
        # node_num 结点个数
        # node_dist_mat 节点之间的距离(矩阵)
        # pheromone_mat 节点之间路径上的信息度浓度
        self.node_num, self.nodes, self.node_dist_mat = self.create_from_file(file_path)

    def create_from_file(self, file_path):
        # 从文件中读取服务点、客户的位置
        with open(file_path, 'rt') as f:
            node_list = list(line.split() for line in f)
        node_num = len(node_list)
        nodes = list(Node(float(item[0]), float(item[1]), float(item[2]), float(item[3]), float(item[4]), float(item[5])) for item in node_list)

        # 创建距离矩阵
        node_dist_mat = np.zeros((node_num, node_num))
        for i in range(node_num):
            node_a = nodes[i]
            for j in range(i, node_num):
                node_b = nodes[j]
                node_dist_mat[i][j] = Graph.calculate_dist(node_a, node_b)
                node_dist_mat[j][i] = node_dist_mat[i][j]

        return node_num, nodes, node_dist_mat

    @staticmethod
    def calculate_dist(node_a, node_b):
        return np.linalg.norm((node_a.x - node_b.x, node_a.y - node_b.y))