# -*-coding:utf-8-*-
import sys
sys.path.append('../../../')
from nsga2.individual import Individual
from nsga2.customer import Customer
from nsga2.cusset import CusSet
from nsga2.carset import CarSet
from nsga2.car import Car
from nsga2.problems import Problem
from nsga2.utils import NSGA2Utils
from vrp_definitions import VRPDefinitions
import random
import functools
import numpy as np
import math
from sklearn.cluster import KMeans
from sklearn.externals import joblib
from sklearn import cluster
mileage_0 = 8 # km per Litre
mileage_m = 6 # km per Litre
load_truck = 5500
weight = 12500
load_max = load_truck + weight
data = np.loadtxt('C:\\Users\\smx\\Desktop\\nsga2-master\\120_10.txt').astype(np.int64)
# print('data:', data)
cus_num = 21
dismat = [[0] * (cus_num) for row in range(cus_num)]
for i in data:
for j in data:
# print('i[0]:',i[0])
# print('j[0]:',j[0])
dismat[i[0]][j[0]] = ((i[1]-j[1])**2+(i[2]-j[2])**2)**0.5
# print('dismat:',dismat)
# def mileage(load):
# consumption = mileage_0 + ((mileage_m - mileage_0) * (load - load_truck) / (load_max - load_truck))
# return consumption
def mileage(load):
consumption = mileage_0 + ((mileage_m - mileage_0) * (load - load_truck) / (load_max - load_truck))
return consumption
class VRP(Problem):
def __init__(self, vrp_definitions):
self.vrp_definitions = vrp_definitions
self.max_objectives = [None, None]
self.min_objectives = [None, None]
self.problem_type = None
self.n = 20
def __dominates(self, individual2, individual1):
worse_than_other = self.vrp_definitions.f1(individual1) <= self.vrp_definitions.f1(
individual2) and self.vrp_definitions.f2(individual1) <= self.vrp_definitions.f2(individual2)
better_than_other = self.vrp_definitions.f1(individual1) < self.vrp_definitions.f1(
individual2) or self.vrp_definitions.f2(individual1) < self.vrp_definitions.f2(individual2)
return worse_than_other and better_than_other
def initSolusion(self, cusset):
carset = []
c = 0
global countcar
countcar = 0
car = Car(countcar)
cus_list = range(len(cusset.cusset))
random.shuffle(cus_list)
for cid in cus_list:
c = c + cusset.cusset[cid].me
if c <= car.Capacity:
car.route.append(cid)
else:
# random.shuffle(car.route)
carset.append(car)
# print car.route
c = cusset.cusset[cid].me
countcar = countcar + 1
car = Car(countcar)
car.route.append(cid)
carset.append(car)
return carset
def CRSM(self, carroute, cusset):
li = []
car = Car(1)
cc = 0
ss = 0
Tc = 0
Ts = 0
i=1
#carroute:一輛車走過的所有路徑
individual = Individual()
cset = self.initSolusion(cusset)
individual.car_route.extend(cset)
# print('carroute:',carroute)
while i <= 10:
i = i+1
# for i in range(10):
cur_cw = car.Capacity
cc = 0
ss = 0
sss = 0
curT = 0
preid = 0
lastid = None
for nc in carroute:
# print('nc:',nc)
if cur_cw == 0:
cur_cw = car.Capacity
curT = curT + (dismat[0][preid] / car.Velocity) * 2
cc = cc + self.calTC(dismat[0][preid],carroute,cusset,car.carWeight, car.Velocity) + self.calTC(
dismat[0][nc],carroute,cusset,car.carWeight + car.Capacity, car.Velocity)
# print('cusset.dismat',cusset.dismat)
# print('individual.car_route:',individual.car_route)
cc = cc + self.calTC(dismat[preid][nc],carroute,cusset,car.carWeight + cur_cw, car.Velocity)
# print cusset.cusset[nc].demand
curT = curT + dismat[preid][nc] / car.Velocity
ss = self.calSat(curT, cusset.cusset[nc].eS, cusset.cusset[nc].lS, cusset.cusset[nc].eH,
cusset.cusset[nc].lH)
sss = sss + ss
# print ss
# dd = np.random.normal(cusset.cusset[nc].me, cusset.cusset[nc].va, 1)
dd = cusset.cusset[nc].me + np.random.normal(cusset.cusset[nc].me, cusset.cusset[nc].me / 9)
cusset.cusset[nc].demand = dd
cur_cw = car.Capacity - cusset.cusset[nc].demand
curT = curT + cusset.cusset[nc].st
preid = nc
if cur_cw < 0:
cur_cw = car.Capacity + cur_cw
curT = curT + (dismat[0][nc] / car.Velocity) * 2
cc = cc + self.calTC(dismat[0][nc],carroute,cusset,car.carWeight, car.Velocity) + self.calTC(
dismat[0][nc],carroute,cusset,car.carWeight + car.Capacity, car.Velocity)
lastid = nc
# print 'sss', sss
cc = cc + self.calTC(dismat[0][lastid],carroute,cusset, car.carWeight + cur_cw,
car.Velocity)
Tc = Tc + cc
Ts = Ts + sss
# print 'Ts', Ts
cc = Tc / 10
ss = Ts / 10
li.append(cc)
li.append(ss)
return li
#individual.car_route是一個車輛的路徑
#carroute:是一個解里所有車輛的路徑集合
def RSM(self, individual, cusset):
individual.cost = 0
individual.sat = 0
for i in range(len(individual.car_route)):
# print i, len(individual.car_route)
if len(individual.car_route[i].route) > 0:
li = self.CRSM(individual.car_route[i].route, cusset)
cc = li[0]
ss = li[1]
# print 'cc', cc
# print 'ss', ss
individual.car_route[i].cost = cc
individual.car_route[i].sat = ss
individual.cost = individual.cost + cc
individual.sat = individual.sat + ss
return individual
def generateIndividual(self, cusset):
individual = Individual()
ind = Individual()
individual.features = []
# for i in range(self.n):
# individual.features.append(i)
cset = self.initSolusion(cusset)
individual.car_route.extend(cset)
individual.features.extend(cset)
# print('-----------------')
# print('carroute', individual.car_route)
# for i in range(4):
individual = self.local_search(individual, cusset)
ind = self.RSM(individual, cusset)
individual.cost = ind.cost
individual.sat = ind.sat
individual.dominates = functools.partial(self.__dominates, individual1=individual)
self.calculate_objectives(individual)
return individual
def generateCusSet(self, file_path):
cusset = CusSet()
cusset.dismat = []
global cus_list
cus_list = []
with open(file_path, 'r') as f:
global cus_num
# cus_num = int(f.readline().rstrip('\n').rstrip())
cus_num = 120
# cus_num = 20
# for i in range(cus_num):
# dis_line = f.readline()
# dis_list = [float(dis) for dis in dis_line.rstrip('\n').rstrip().split('\t')]
# cusset.dismat.append(dis_list)
# # print('cusset.dismat[0]:',cusset.dismat[1])
lines = f.readlines()
for line in lines:
li = [float(x) for x in line.rstrip('\n').rstrip().split('\t')]
cus_list.append(li)
# print('cus_list:',cus_list)
for i in range(len(cus_list)):
cus = Customer()
cus.id = int(cus_list[i][0])
cus.x = cus_list[i][1]
cus.y = cus_list[i][2]
cus.me = cus_list[i][3]
cus.eH = cus_list[i][4]
cus.eS = cus_list[i][5]
cus.lS = cus_list[i][6]
cus.lH = cus_list[i][7]
cus.st = cus_list[i][8]
cusset.cusset.append(cus)
return cusset
def cmp_cus(self, cusid1, cusid2, cusset, cmp_type):
if cmp_type == 0:
dis1 = math.sqrt(cusset.cusset[cusid1].x ** 2 + cusset.cusset[cusid1].y ** 2)
dis2 = math.sqrt(cusset.cusset[cusid2].x ** 2 + cusset.cusset[cusid2].y ** 2)
if dis1 < dis2:
return 1
elif dis1 == dis2:
return 0
elif dis1 > dis2:
return -1
elif cmp_type == 1:
if cusset.cusset[cusid1].lS < cusset.cusset[cusid2].lS:
return 1
elif cusset.cusset[cusid1].lS == cusset.cusset[cusid2].lS:
return 0
elif cusset.cusset[cusid1].lS > cusset.cusset[cusid2].lS:
return -1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/269537.html
