修复特定值下计算分流转向比返回结果顺序出现异常bug

This commit is contained in:
wangxu 2026-01-19 16:35:47 +08:00
parent 7ea50ca893
commit 35ac27fbc7
1 changed files with 33 additions and 35 deletions

View File

@ -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()]
for dir in roads_dir_dict.keys():
roadid = roads_dir_dict[dir]['in']
if 'udr_' in roadid:
continue
l_rate, s_rate, 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
@ -2288,53 +2290,49 @@ def fix_to_100(a, b, c):
if len(valid_idx) == 2:
i0, i1 = valid_idx
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)
r2 = 100 - r1
# 原100位放较大值原0位放较小值
if v0 == 100 or v1 == 100:
idx_100 = i0 if v0 == 100 else i1
idx_zro = i1 if v0 == 100 else i0
nums[idx_100] = max(r1, r2)
nums[idx_zro] = min(r1, r2)
if v0 == 100:
nums[i0] = max(r1, r2)
nums[i1] = min(r1, r2)
else:
idx_zro = i0 if v0 == 0 else i1
idx_nz = i1 if v0 == 0 else i0
nums[idx_zro] = min(r1, r2)
nums[idx_nz] = max(r1, r2)
return _to_int_list(nums, mask) # 这里已int但保险再调一次
# 正常值:等比缩放
s = v0 + v1
nums[i0] = v0 * 100 / s
nums[i1] = v1 * 100 / s
return _to_int_list(nums, mask)
nums[i1] = max(r1, r2)
nums[i0] = min(r1, r2)
return _to_int_list(nums, mask)
else:
# 其他情况:正常归一化(包括 100+50, 0+50 等)
s = v0 + v1
if s == 0:
nums[i0] = 50
nums[i1] = 50
else:
nums[i0] = v0 * 100 / s
nums[i1] = v1 * 100 / s
return _to_int_list(nums, mask)
# ----- 3 个有效 -----
if 100 in nums or 0 in nums:
if 100 in nums:
idx_100 = nums.index(100)
zeros = [i for i in range(3) if nums[i] == 0]
r1 = random.randint(1, 3)
r2 = 100 - r1
nums[zeros[0]] = r1
nums[zeros[1]] = r2
nums[idx_100] = 0 # 先清零,再走下面统一处理
# 特殊处理:仅当存在一个 100 且其余两个为 0 时
if 100 in nums:
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:
if len(zeros) == 2:
# 确认为 [100, 0, 0] 的某种排列
r1 = random.randint(1, 3)
r2 = 100 - r1
nums[zeros[0]] = r1
nums[zeros[1]] = r2
return _to_int_list(nums, mask)
# 100 位置保持不变
return _to_int_list(nums, mask)
# 正常缩放
# 所有其他情况(包括含 0 但无 100如 [0, 98, 0])→ 正常归一化
s = sum(nums)
if s == 100:
return [int(v) for v in nums]
for i in range(3):
nums[i] = max(1, round(nums[i] * 100 / s))
if s == 0:
# 全为 0平均分配或按需调整
nums = [34, 33, 33]
else:
for i in range(3):
nums[i] = nums[i] * 100 / s
return _to_int_list(nums, mask)