修复特定值下计算分流转向比返回结果顺序出现异常bug
This commit is contained in:
parent
7ea50ca893
commit
35ac27fbc7
|
|
@ -760,6 +760,8 @@ def gen_flow_turn_rate_index(avg_cross_delay_info, roads_dir_dict):
|
||||||
outroadid_list = [roads_dir_dict[k]['out'] for k in roads_dir_dict.keys()]
|
outroadid_list = [roads_dir_dict[k]['out'] for k in roads_dir_dict.keys()]
|
||||||
for dir in roads_dir_dict.keys():
|
for dir in roads_dir_dict.keys():
|
||||||
roadid = roads_dir_dict[dir]['in']
|
roadid = roads_dir_dict[dir]['in']
|
||||||
|
if 'udr_' in roadid:
|
||||||
|
continue
|
||||||
l_rate, s_rate, r_rate = 0, 0, 0
|
l_rate, s_rate, r_rate = 0, 0, 0
|
||||||
out_l_rate, out_s_rate, out_r_rate = 0, 0, 0
|
out_l_rate, out_s_rate, out_r_rate = 0, 0, 0
|
||||||
in_flow_rate, out_flow_rate = 0, 0
|
in_flow_rate, out_flow_rate = 0, 0
|
||||||
|
|
@ -2288,53 +2290,49 @@ def fix_to_100(a, b, c):
|
||||||
if len(valid_idx) == 2:
|
if len(valid_idx) == 2:
|
||||||
i0, i1 = valid_idx
|
i0, i1 = valid_idx
|
||||||
v0, v1 = nums[i0], nums[i1]
|
v0, v1 = nums[i0], nums[i1]
|
||||||
if 100 in (v0, v1) or 0 in (v0, v1):
|
# 只有当两个值恰好是 {0, 100} 时才用特殊处理
|
||||||
|
if {v0, v1} == {0, 100}:
|
||||||
r1 = random.randint(1, 3)
|
r1 = random.randint(1, 3)
|
||||||
r2 = 100 - r1
|
r2 = 100 - r1
|
||||||
# 原100位放较大值,原0位放较小值
|
if v0 == 100:
|
||||||
if v0 == 100 or v1 == 100:
|
nums[i0] = max(r1, r2)
|
||||||
idx_100 = i0 if v0 == 100 else i1
|
nums[i1] = min(r1, r2)
|
||||||
idx_zro = i1 if v0 == 100 else i0
|
|
||||||
nums[idx_100] = max(r1, r2)
|
|
||||||
nums[idx_zro] = min(r1, r2)
|
|
||||||
else:
|
else:
|
||||||
idx_zro = i0 if v0 == 0 else i1
|
nums[i1] = max(r1, r2)
|
||||||
idx_nz = i1 if v0 == 0 else i0
|
nums[i0] = min(r1, r2)
|
||||||
nums[idx_zro] = min(r1, r2)
|
return _to_int_list(nums, mask)
|
||||||
nums[idx_nz] = max(r1, r2)
|
else:
|
||||||
return _to_int_list(nums, mask) # 这里已int,但保险再调一次
|
# 其他情况:正常归一化(包括 100+50, 0+50 等)
|
||||||
# 正常值:等比缩放
|
|
||||||
s = v0 + v1
|
s = v0 + v1
|
||||||
|
if s == 0:
|
||||||
|
nums[i0] = 50
|
||||||
|
nums[i1] = 50
|
||||||
|
else:
|
||||||
nums[i0] = v0 * 100 / s
|
nums[i0] = v0 * 100 / s
|
||||||
nums[i1] = v1 * 100 / s
|
nums[i1] = v1 * 100 / s
|
||||||
return _to_int_list(nums, mask)
|
return _to_int_list(nums, mask)
|
||||||
|
|
||||||
# ----- 3 个有效 -----
|
# ----- 3 个有效 -----
|
||||||
if 100 in nums or 0 in nums:
|
# 特殊处理:仅当存在一个 100 且其余两个为 0 时
|
||||||
if 100 in nums:
|
if 100 in nums:
|
||||||
idx_100 = nums.index(100)
|
|
||||||
zeros = [i for i in range(3) if nums[i] == 0]
|
zeros = [i for i in range(3) if nums[i] == 0]
|
||||||
|
if len(zeros) == 2:
|
||||||
|
# 确认为 [100, 0, 0] 的某种排列
|
||||||
r1 = random.randint(1, 3)
|
r1 = random.randint(1, 3)
|
||||||
r2 = 100 - r1
|
r2 = 100 - r1
|
||||||
nums[zeros[0]] = r1
|
nums[zeros[0]] = r1
|
||||||
nums[zeros[1]] = r2
|
nums[zeros[1]] = r2
|
||||||
nums[idx_100] = 0 # 先清零,再走下面统一处理
|
# 100 位置保持不变
|
||||||
zeros = [i for i in range(3) if nums[i] == 0]
|
|
||||||
if len(zeros) == 1:
|
|
||||||
nums[zeros[0]] = random.randint(1, 3)
|
|
||||||
elif len(zeros) == 2:
|
|
||||||
r1 = random.randint(1, 3)
|
|
||||||
r2 = 100 - r1
|
|
||||||
nums[zeros[0]] = r1
|
|
||||||
nums[zeros[1]] = r2
|
|
||||||
return _to_int_list(nums, mask)
|
return _to_int_list(nums, mask)
|
||||||
|
|
||||||
# 正常缩放
|
# 所有其他情况(包括含 0 但无 100,如 [0, 98, 0])→ 正常归一化
|
||||||
s = sum(nums)
|
s = sum(nums)
|
||||||
if s == 100:
|
if s == 0:
|
||||||
return [int(v) for v in nums]
|
# 全为 0,平均分配(或按需调整)
|
||||||
|
nums = [34, 33, 33]
|
||||||
|
else:
|
||||||
for i in range(3):
|
for i in range(3):
|
||||||
nums[i] = max(1, round(nums[i] * 100 / s))
|
nums[i] = nums[i] * 100 / s
|
||||||
return _to_int_list(nums, mask)
|
return _to_int_list(nums, mask)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue