VRP-System / DP.py
DP.py
Raw
import pandas as pd

class preparation:
    x = 0
    y = 0
    def __init__(self, x, y):
        preparation.x = x
        preparation.y = y

    # Data Preparation Requirements
    def startNode(x=200,y=100):
        x = preparation.x
        y = preparation.y
        Direct = [x,y]
        return Direct

    def get_cities():
        df = pd.read_excel (r'data.xlsx')
        locations = []
        for i in range(len(df['x'])):
            locations.append(df['city'][i])
        return locations

    def get_coordinates():
        df = pd.read_excel (r'data.xlsx')
        coordinates = []
        for i in range(len(df['x'])):
            coordinates.append([df['x'][i], df['y'][i]])    
        return coordinates

    def create_dictionary():
        cities = preparation.get_cities()
        coordinates = preparation.get_coordinates()
        map = {}
        map["Start"] = preparation.startNode()
        for i in range(len(cities)):
            map[cities[i]] = coordinates[i]
        return map

    def calc_distance(x1, y1, x2, y2):
        return ( ((x2 - x1 )**2) + ((y2-y1)**2) )**0.5

    def calc_cost(population):
        dict = preparation.create_dictionary()
        individual = {}
        cost = 2

        c = 0
        for x in population:
            individual[c] = x.split()
            c += 1

        sum = 0
        totalCost = []
        for v in individual.values():
            
            for x in v:

                for j in range(len(x)):

                    if j == 0 or j == len(x)-1:
                        x1 = dict['Start'][0]
                        y1 = dict['Start'][1]
                        x2 = dict[x[j]][0]
                        y2 = dict[x[j]][1]
                        dist = preparation.calc_distance(x1, y1, x2, y2)
                        sum += dist
                        continue

                    x1 = dict[x[j]][0]
                    y1 = dict[x[j]][1]
                    x2 = dict[x[j-1]][0]
                    y2 = dict[x[j-1]][1]
                    dist = preparation.calc_distance(x1, y1, x2, y2)
                    sum += dist

            totalCost.append(int(sum) * cost)
            sum = 0
        return totalCost

    def calc_fitness(population, target=30000):
        fit = []

        total = preparation.calc_cost(population)
        for x in total:
            fit.append(target - x)
        return fit

    def merge(list):
        newlist = list.copy()
        for i in range(len(list[0])):
            newlist[0][i] += ' ' + str(newlist[1][i])
        del newlist[1]
        newlist = newlist[0]
        return newlist

    def represent(dict):
        fit = []
        ind = []
        for k,v in dict.items():
            fit.append(int(k))
            ind.append(v)

        m = [fit,ind]
        return m