Skip to content

Commit fefb357

Browse files
committed
implement destroy_congested_link to ALNS
1 parent 29c66ee commit fefb357

File tree

3 files changed

+26
-14
lines changed

3 files changed

+26
-14
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ p*_*.py
144144
*.prof
145145
demos_and_examples/uxsim/*
146146
/*.pkl
147+
_bench*
147148

148149
# pre-commit
149150
.pre-commit-config.yaml

uxsim/DTAsolvers/ALNS.py

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -451,22 +451,26 @@ def destroy_congested_link(state: ALNSState, base: Sequence[Any]) -> Tuple[List[
451451
部分解の削除位置はNoneに設定される
452452
"""
453453
n = len(base)
454-
454+
455+
removed = []
456+
455457
#混雑リンクを選択
456458
W = state.additional_info.get("W")
457-
df_l = W.analyzer.links_to_pandas()
458-
delay_threath = 1.5
459-
delay_ranking_ratio = 0.1
460-
link_selected_name = np.random.choice(list(df_l[df_l["delay"]>delay_threath].sort_values(by='delay', ascending=False)[:max([int(len(df_l)*delay_ranking_ratio),5])]["link"]))
461-
link_selected = W.get_link(link_selected_name)
462-
463-
#TODO:つづく
459+
df_l = W.analyzer.link_to_pandas()
460+
461+
delay_ranking_ratio = 0.05
462+
delay_ranking_min_n = 3
464463

465-
w = np.maximum(1/100000, w-0.3)
464+
most_delayed_links = list(df_l.sort_values(by='delay_ratio', ascending=False)[:max([int(len(df_l)*delay_ranking_ratio),delay_ranking_min_n])]["link"])
466465

467466
k = state.rng.randint(state.k_min, min(state.k_max, n))
468-
probs = (w / w.sum())
469-
removed = list(np.random.choice(np.arange(n), size=k, replace=False, p=probs))
467+
for _ in range(k):
468+
link_selected_name = np.random.choice(most_delayed_links)
469+
link_selected = W.get_link(link_selected_name)
470+
471+
veh_selected = np.random.choice(list(link_selected.vehicles_enter_log.values()))
472+
removed.append(veh_selected.id)
473+
470474
xx = _copy_vec(base)
471475
for i in removed:
472476
xx[i] = None
@@ -479,6 +483,7 @@ def destroy_congested_link(state: ALNSState, base: Sequence[Any]) -> Tuple[List[
479483
"segment": destroy_segment,
480484
"early_departure": destroy_early_departure,
481485
"late_departure": destroy_late_departure,
486+
"congested_link": destroy_congested_link,
482487
}
483488

484489
# 破壊オペレータの初期重み(選択確率に比例)
@@ -487,6 +492,7 @@ def destroy_congested_link(state: ALNSState, base: Sequence[Any]) -> Tuple[List[
487492
"segment": 1.0,
488493
"early_departure": 2.0,
489494
"late_departure": 0.5,
495+
"congested_link": 1.0,
490496
}
491497

492498
# -------------------------
@@ -768,7 +774,7 @@ def _eval(xx: Sequence[Any]) -> float:
768774
if not deltas:
769775
deltas = [1.0]
770776
med = sorted(deltas)[len(deltas)//2]
771-
p0 = 0.3 # 初期に悪化を割合p0前後で受理したい:かなりずれる...
777+
p0 = 0.2 # 初期に悪化を割合p0前後で受理したい:かなりずれる...
772778
T0 = max(1e-6, med / max(1e-12, math.log(1.0/p0)))
773779

774780
# 適応初期値(初期重みは定数から取得、定義されていなければ1.0)

uxsim/uxsim.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ def generate(s):
225225
assert veh.leader.lane == veh.lane
226226

227227
outlink.vehicles.append(veh)
228+
outlink.vehicles_enter_log[s.W.T*s.W.DELTAT] = veh
228229

229230
outlink.cum_arrival[-1] += s.W.DELTAN
230231
veh.link_arrival_time = s.W.T*s.W.DELTAT
@@ -295,6 +296,7 @@ def transfer(s):
295296

296297
#リンク間遷移実行
297298
inlink.vehicles.popleft()
299+
outlink.vehicles_enter_log[s.W.T*s.W.DELTAT] = veh
298300
veh.link = outlink
299301
veh.x = 0
300302

@@ -534,6 +536,9 @@ def __init__(s, W, name, start_node, end_node, length, free_flow_speed=20, jam_d
534536
#リンク内車両一覧
535537
s.vehicles = deque()
536538

539+
#流入した車両一覧.t: Vehicle
540+
s.vehicles_enter_log = {}
541+
537542
#旅行時間
538543
s.traveltime_instant = []
539544

@@ -2305,7 +2310,7 @@ def get_node(W, node):
23052310
else:
23062311
if node.name in W.NODES_NAME_DICT:
23072312
return W.NODES_NAME_DICT[node.name]
2308-
elif type(node) is str:
2313+
elif type(node) is str or type(node) is np.str_:
23092314
if node in W.NODES_NAME_DICT:
23102315
return W.NODES_NAME_DICT[node]
23112316
raise Exception(f"'{node}' is not Node in this World")
@@ -2333,7 +2338,7 @@ def get_link(W, link):
23332338
else:
23342339
if link.name in W.LINKS_NAME_DICT:
23352340
return W.LINKS_NAME_DICT[link.name]
2336-
elif type(link) is str:
2341+
elif type(link) is str or type(link) is np.str_:
23372342
if link in W.LINKS_NAME_DICT:
23382343
return W.LINKS_NAME_DICT[link]
23392344
raise Exception(f"'{link}' is not Link in this World")

0 commit comments

Comments
 (0)