-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathMyProblem.py
143 lines (135 loc) · 7.24 KB
/
MyProblem.py
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# -*- coding: utf-8 -*-
import numpy as np
import geatpy as ea
import xlrd
import win32com.client as com # VISSIM COM
import time
"""
"""
class MyProblem(ea.Problem): # 继承Problem父类
flag = False
def __init__(self):
name = 'MyProblem' # 初始化name(函数名称,可以随意设置)
M = 1 # 初始化M(目标维数)
maxormins = [1] # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)
Dim = 3 # 初始化Dim(决策变量维数)
varTypes = [0] * Dim # 初始化varTypes(决策变量的类型,元素为0表示对应的变量是连续的;1表示是离散的)
lb = [1.2, 0.9, 2] # 决策变量下界 CC0推荐:1.2-1.7 cc1推荐:0.9-3.0 CC2推荐:2-7
ub = [1.7, 3.0, 7] # 决策变量上界
lbin = [1, 1, 1] # 决策变量下边界
ubin = [1, 1, 1] # 决策变量上边界
# 调用父类构造方法完成实例化
ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)
def aimFunc(self, pop): # 目标函数
x = pop.Phen # 得到决策变量矩阵 x=30
x0 = x[:, [0]]
x1 = x[:, [1]]
x2 = x[:, [2]]
# x1 = x[:, 1]
# x2 = x[:, 2]
# print(x)
if self.flag == False:
self.Data = xlrd.open_workbook('resultToCali2.xlsx')
self.Table = self.Data.sheet_by_name(u'Sheet1')
self.flag = True
self.V1 = self.Table.col_values(0) # spd for segment 1
self.V2 = self.Table.col_values(1) # spd for segment 2
self.V3 = self.Table.col_values(2) # spd for segment 2
self.V4 = self.Table.col_values(3) # spd for segment 2
self.V5 = self.Table.col_values(6) # spd for segment 2
self.V6 = self.Table.col_values(7) # spd for segment 2
self.V7 = self.Table.col_values(8) # spd for segment 2
self.V8 = self.Table.col_values(9) # spd for segment 2
self.relativeFlow = self.Table.col_values(4) # relative flow
self.volume = self.Table.col_values(5) # 流量
totalResult = []
for k in range(30):
# # =================================================================================
# # VISSIM Configurations
# # Load VISSIM Network
self.Vissim = com.Dispatch("Vissim.Vissim");
dir = "E:\\PycharmProjects\\GA-calibration\\test.inp"
self.Vissim.LoadNet(dir)
# Define Simulation Configurations
graphics = self.Vissim.Graphics
graphics.SetAttValue("VISUALIZATION", False) ## 设为 不可见 提高效率
self.Sim = self.Vissim.Simulation
self.Net = self.Vissim.Net
# G = self.Vissim.Graphics
dbpss = self.Net.DrivingBehaviorParSets # Driving behavior module
dbps = dbpss(3)
# # Set Simulation Parameters
TotalPeriod = 55802 # Define total simulation period
WarmPeriod = 900 # Define warm period 10 minutes
Random_Seed = k # Define random seed
step_time = 1 # Define Step Time
self.Sim.Period = TotalPeriod
self.Sim.RandomSeed = 42
# self.Sim.RunIndex= 1
self.Sim.Resolution = step_time
# Each scenario run 5 times
# =================================================================================
# Data Collection Variables
t1 = []
t2 = []
t3 = []
t4 = []
t5 = []
t6 = []
t7 = []
t8 = []
nVeh = []
dbps.SetAttValue('CC0', x0[k][0]) ## 天坑! 不能写x0[k]!!!!!!
dbps.SetAttValue('CC1', x1[k][0])
dbps.SetAttValue('CC2', x2[k][0])
print("第", k, "组参数: CC0=", x0[k][0], ",CC1=", x1[k][0], ",CC2=", x2[k][0])
eval = self.Vissim.Evaluation
eval.SetAttValue("TRAVELTIME", True)
eval.SetAttValue("DATACOLLECTION", True)
TT1 = self.Net.TravelTimes(1)
TT2 = self.Net.TravelTimes(2)
dataCollections = self.Vissim.Net.DataCollections
dt1 = dataCollections(1)
dt2 = dataCollections(2)
dt3 = dataCollections(3)
dt4 = dataCollections(4)
dt5 = dataCollections(5)
dt6 = dataCollections(6)
dt7 = dataCollections(7)
dt8 = dataCollections(8)
composition = self.Net.TrafficCompositions(1)
vehicleInput = self.Net.VehicleInputs(1)
# self.Sim.RunContinuous()
for j in range(1, TotalPeriod):
if (j % 900 == 0) and (j >= 1801):
composition.SetAttValue1("RELATIVEFLOW", 100, 1 - self.relativeFlow[int(j / 900 - 3)])
composition.SetAttValue1("RELATIVEFLOW", 200, self.relativeFlow[int(j / 900 - 3)])
vehicleInput.SetAttValue("VOLUME", self.volume[int(j / 900 - 3)])
t1.append(dt1.GetResult("speed", "mean", 0)) # 车道1
t2.append(dt2.GetResult("speed", "mean", 0)) # 车道2
t3.append(dt3.GetResult("speed", "mean", 0)) # 车道3
t4.append(dt4.GetResult("speed", "mean", 0)) # 车道4
t5.append(dt5.GetResult("speed", "mean", 0)) # 车道1
t6.append(dt6.GetResult("speed", "mean", 0)) # 车道2
t7.append(dt7.GetResult("speed", "mean", 0)) # 车道3
t8.append(dt8.GetResult("speed", "mean", 0)) # 车道4
nVeh.append(4 * (dt1.GetResult("NVEHICLES", "sum", 0)
+ dt2.GetResult("NVEHICLES", "sum", 0)
+ dt3.GetResult("NVEHICLES", "sum", 0)
+ dt4.GetResult("NVEHICLES", "sum", 0)))
self.Sim.RunSingleStep()
spdTotal = np.array(0.125 * sum(abs(np.array(t1) - np.array(self.V1)) / np.array(self.V1)
+ abs(np.array(t2) - np.array(self.V2)) / np.array(self.V2)
+ abs(np.array(t3) - np.array(self.V3)) / np.array(self.V3)
+ abs(np.array(t4) - np.array(self.V4)) / np.array(self.V4)
+ abs(np.array(t5) - np.array(self.V5)) / np.array(self.V5)
+ abs(np.array(t6) - np.array(self.V6)) / np.array(self.V6)
+ abs(np.array(t7) - np.array(self.V7)) / np.array(self.V7)
+ abs(np.array(t8) - np.array(self.V8)) / np.array(self.V8)))
# NVehTotal = np.array(sum(abs(np.array(nVeh) - np.array(self.volume)) / np.array(self.volume))) ##
totalResult.append(spdTotal) # +NVehTotal)
# print("spd误差:", spdTotal)
# print("NVeh误差:", NVehTotal)
print("误差为:", totalResult[k])
self.Sim.Stop()
pop.ObjV = np.vstack(totalResult) # 计算目标函数值,赋值给pop种群对象的ObjV属性