@@ -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)
0 commit comments