From 35ac27fbc75b0253b970c45da342c028bee55330 Mon Sep 17 00:00:00 2001 From: wangxu <1318272526@qq.com> Date: Mon, 19 Jan 2026 16:35:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=89=B9=E5=AE=9A=E5=80=BC?= =?UTF-8?q?=E4=B8=8B=E8=AE=A1=E7=AE=97=E5=88=86=E6=B5=81=E8=BD=AC=E5=90=91?= =?UTF-8?q?=E6=AF=94=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E5=BC=82=E5=B8=B8bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/eva_common.py | 68 +++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/app/eva_common.py b/app/eva_common.py index 50e3726..635bf70 100644 --- a/app/eva_common.py +++ b/app/eva_common.py @@ -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)