import copy
import random
import sys
import matplotlib.pyplot as plt
import numpy as np
import xlrd
import math
from sympy import Integer
from question2.NSGA2 import NSGA2
pa = None
od = None
"""区间运行时间"""
onR = None
R = None
L = None
se = None
n_max = 24
n_min = 3
It = 108
t_ba = 0.04
C = 1860
c1 = 10
c2 = 20
result = set()
class Gene(object):
def __init__(self, m, K, hs, he, z, h, e):
self.m = m
self.K = K
self.hs = hs
self.he = he
self.z = z
self.h = h
self.e = e
# """lamda"""
# self.lam = np.zeros(K, 31)
# for k in range(1,K+1):
# for i in range(1,31):
# if k % (m+1) == 0 :
# self.lam[k][i] = 1
# elif k % (m+1) != 0 and hs <= i <= he:
# self.lam[k][i] = 1
# else:
# self.lam[k][i] = 0
"""出发时间d"""
self.dt = np.zeros((self.K + 1, 31))
"""到达时间a"""
self.a = np.zeros((self.K + 1, 31))
"""列车K当前容量"""
self.cap = np.zeros(self.K + 1)
for i in range(1, len(self.cap)):
self.cap[i] = C
"""站点人数"""
self.people = self.pro_people()
self.company = None
self.service = None
self.yes = False
def pro_people(self):
people = np.zeros(31)
for i in range(1, 30):
for j in range(i + 1, 31):
people[i] += od[i][j]
return people
def fit(self):
big_length = 0
for i in range(1, 30):
big_length += L[i][i + 1]
# print("biglength:", big_length)
small_len = 0
for i in range(self.hs, self.he):
small_len += L[i][i + 1]
self.company = c1 * self.K \
+ c2 * (big_length * (self.K // (self.m + 1))
+ small_len * (self.K - (self.K // (self.m + 1))))
def constraint(self):
self.yes = self.evolution()
# print(self.yes)
dt = self.dt
a = self.a
hs = self.hs
# print(dt)
# print("................................................")
# print(a)
# print("-------------------------------------------------------")
for k in range(2, self.K + 1):
for i in range(1, len(dt)):
if i != 1 and i != hs and a[k][i] != 0 and dt[k][i] != 0:
if dt[k][i] < a[k][i]:
self.yes = False
print(dt[k][i] - dt[k - 1][i] < 108)
print(111111111111111111)
print(dt[k][i] < a[k][i])
# print(dt[k][i])
# print(a[k][i])
# print(22222222222222222)
break
# print(self.yes)
def evolution(self):
t = Integer(0)
kt = 0
"""服务水平时间"""
serT = 0
""""""
hs = self.hs
people = self.people
h = self.h
m = self.m
cap = self.cap
dt = self.dt
a = self.a
e = self.e
"""站点的组成成分"""
d = np.copy(od)
"""列车k的组成成分"""
value = np.zeros((31, 31))
while True:
print("t:", t)
# print(k)
"""异常检查"""
for val in cap:
if val < 0:
# print(11)
sys.exit(11)
return False
if t == a[self.K][30] and a[self.K][30] != 0:
print(a[self.K][30])
sys.exit()
break
""""""
if t % h == 0 and d.any(): # d不是全0: # 到了发车时间
kt = kt + 1 # 发一列车
# print(kt)
if kt % (m + 1) == 0: # 大交路 站点1发车
dt[kt][1] = t # k车在1站发车时间
a[kt][2] = dt[kt][1] + R[1][2] # k车在下一站到达时间
for j in range(1, 31): # 上车
if d[1][j] <= cap[kt]:
cap[kt] -= d[1][j]
value[1][j] += d[1][j]
d[1][j] = 0
else:
d[1][j] -= cap[kt]
value[1][j] += cap[kt]
cap[kt] = 0
"""ser"""
for zj in range(2, 31):
serT += value[1][zj] * onR[1][zj]
serT += e[zj]
else: # 小交路发车
dt[kt][hs] = t
a[kt][hs + 1] = dt[kt][hs] + R[hs][hs + 1]
for j in range(hs + 1, 31): # 上车
if d[hs][j] <= cap[kt]:
cap[kt] -= d[hs][j]
# print(hs)
# print(j)
# print(value[hs][j])
value[hs][j] += d[hs][j]
d[hs][j] = 0
else:
d[hs][j] -= cap[kt]
value[hs][j] += cap[kt]
cap[kt] = 0
"""ser"""
for zj in range(hs + 1, 31):
serT += value[hs][zj] * onR[hs][zj]
serT += e[zj]
for k in range(1, self.K+1):
ss = -1
if k % (m + 1) == 0:
ss = 2
else:
ss = hs + 1
for i in range(ss, 31):
# print("a[{}][{}]:{}".format(k, i, a[k][i]))
# print("dt[{}][{}]:{}".format(k, i, dt[k][i]))
a[k][i] = dt[k][i - 1] + R[i - 1][i]
dt[k][i] = a[k][i] + e[i]
if t == a[k][i]: # 列车到i站
dt[k][i] = a[k][i] + e[i] # 在i站开车时间
if i != 30:
a[k][i + 1] = dt[k][i] + R[i][i + 1]
# print(R[i][i+1])
# print(k)
# print(i)
# print(dt[k][i])
# print(a[k][i+1])
t_down = 0 # 下车时间计时
for p in range(1, i): # 下车
t_down += t_ba * value[p][i]
# print(value[p][i])
cap[k] += value[p][i]
value[p][i] = 0
if t_down > e[i]: # 人下不来
# print(t_down)
if t_down > 120:
return False
e[i] = random.randint(math.ceil(t_down), 120)
dt[k][i] = a[k][i] + e[i] # 在i站开车时间
if i != 30:
a[k][i + 1] = dt[k][i] + R[i][i + 1]
eta = e[i] - t_down
for j in range(i + 1, 31): # 上车 注意时间约束
if d[i][j] <= cap[k] and eta >= d[i][j] * t_ba:
cap[k] -= d[i][j]
value[i][j] += d[hs][j]
"""剩余时间约束"""
eta -= d[i][j] * t_ba
""""""
d[i][j] = 0
"""ser"""
if d[k][1] == 0:
serT += (a[k][i] - dt[k][hs]) * d[hs][j]
else:
serT += (a[k][i] - dt[k][1]) * d[hs][j]