Spaces:
Running
on
Zero
Running
on
Zero
Update scoring_calculation_system.py
Browse files- scoring_calculation_system.py +45 -56
scoring_calculation_system.py
CHANGED
@@ -33,7 +33,7 @@ class UserPreferences:
|
|
33 |
|
34 |
def apply_size_filter(breed_score: float, user_preference: str, breed_size: str) -> float:
|
35 |
"""
|
36 |
-
|
37 |
|
38 |
Parameters:
|
39 |
breed_score (float): 原始品種評分
|
@@ -161,14 +161,14 @@ def calculate_breed_bonus(breed_info: dict, user_prefs: 'UserPreferences') -> fl
|
|
161 |
# 6. 適應性評估
|
162 |
adaptability_bonus = 0.0
|
163 |
if breed_info.get('Size') == "Small" and user_prefs.living_space == "apartment":
|
164 |
-
adaptability_bonus += 0.08
|
165 |
|
166 |
# 環境適應性評估
|
167 |
if 'adaptable' in temperament or 'versatile' in temperament:
|
168 |
if user_prefs.living_space == "apartment":
|
169 |
-
adaptability_bonus += 0.10
|
170 |
else:
|
171 |
-
adaptability_bonus += 0.05
|
172 |
|
173 |
# 氣候適應性
|
174 |
description = breed_info.get('Description', '').lower()
|
@@ -633,7 +633,7 @@ def calculate_compatibility_score(breed_info: dict, user_prefs: UserPreferences)
|
|
633 |
|
634 |
def calculate_exercise_score(breed_needs: str, exercise_time: int, exercise_type: str, breed_size: str, living_space: str) -> float:
|
635 |
"""
|
636 |
-
|
637 |
1. 不同品種的運動耐受度差異
|
638 |
2. 運動時間與類型的匹配度
|
639 |
3. 極端運動量的嚴格限制
|
@@ -902,21 +902,21 @@ def calculate_compatibility_score(breed_info: dict, user_prefs: UserPreferences)
|
|
902 |
2. 縮小經驗等級間的差距
|
903 |
3. 保持適度的區分度
|
904 |
"""
|
905 |
-
# 基礎分數矩陣
|
906 |
base_scores = {
|
907 |
"High": {
|
908 |
"beginner": 0.55, # 提高起始分,讓新手也有機會
|
909 |
-
"intermediate": 0.80, #
|
910 |
"advanced": 0.95 # 資深者幾乎完全勝任
|
911 |
},
|
912 |
"Moderate": {
|
913 |
"beginner": 0.65, # 適中難度對新手更友善
|
914 |
-
"intermediate": 0.85, #
|
915 |
"advanced": 0.90 # 資深者完全勝任
|
916 |
},
|
917 |
"Low": {
|
918 |
"beginner": 0.85, # 新手友善品種維持高分
|
919 |
-
"intermediate": 0.90, #
|
920 |
"advanced": 0.90 # 資深者完全勝任
|
921 |
}
|
922 |
}
|
@@ -924,25 +924,25 @@ def calculate_compatibility_score(breed_info: dict, user_prefs: UserPreferences)
|
|
924 |
# 取得基礎分數
|
925 |
score = base_scores.get(care_level, base_scores["Moderate"])[user_experience]
|
926 |
|
927 |
-
#
|
928 |
temperament_lower = temperament.lower()
|
929 |
temperament_adjustments = 0.0
|
930 |
|
931 |
# 根據經驗等級設定不同的特徵評估標準,降低懲罰程度
|
932 |
if user_experience == "beginner":
|
933 |
difficult_traits = {
|
934 |
-
'stubborn': -0.15,
|
935 |
'independent': -0.12,
|
936 |
'dominant': -0.12,
|
937 |
'strong-willed': -0.10,
|
938 |
'protective': -0.10,
|
939 |
'aloof': -0.08,
|
940 |
'energetic': -0.08,
|
941 |
-
'aggressive': -0.20
|
942 |
}
|
943 |
|
944 |
easy_traits = {
|
945 |
-
'gentle': 0.08,
|
946 |
'friendly': 0.08,
|
947 |
'eager to please': 0.10,
|
948 |
'patient': 0.08,
|
@@ -967,7 +967,7 @@ def calculate_compatibility_score(breed_info: dict, user_prefs: UserPreferences)
|
|
967 |
elif 'guard' in temperament_lower:
|
968 |
temperament_adjustments -= 0.12
|
969 |
|
970 |
-
#
|
971 |
elif user_experience == "intermediate":
|
972 |
moderate_traits = {
|
973 |
'stubborn': -0.08,
|
@@ -1237,7 +1237,7 @@ def calculate_compatibility_score(breed_info: dict, user_prefs: UserPreferences)
|
|
1237 |
print(f"品種信息: {breed_info}")
|
1238 |
print(f"使用者偏好: {vars(user_prefs)}")
|
1239 |
|
1240 |
-
#
|
1241 |
scores = {
|
1242 |
'space': calculate_space_score(
|
1243 |
breed_info['Size'],
|
@@ -1348,7 +1348,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
1348 |
"""
|
1349 |
def evaluate_perfect_conditions():
|
1350 |
"""
|
1351 |
-
|
1352 |
1. 運動類型與時間的綜合評估
|
1353 |
2. 專業技能需求評估
|
1354 |
3. 品種特性評估
|
@@ -1358,13 +1358,13 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
1358 |
'exercise_match': 0,
|
1359 |
'experience_match': 0,
|
1360 |
'living_condition_match': 0,
|
1361 |
-
'breed_trait_match': 0
|
1362 |
}
|
1363 |
|
1364 |
# 第一部分:運動需求評估
|
1365 |
def evaluate_exercise_compatibility():
|
1366 |
"""
|
1367 |
-
|
1368 |
1. 時間與強度的合理搭配
|
1369 |
2. 不同品種的運動特性
|
1370 |
3. 運動類型的適配性
|
@@ -1425,7 +1425,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
1425 |
}
|
1426 |
|
1427 |
def determine_breed_type():
|
1428 |
-
"""
|
1429 |
# 優先檢查特殊運動類型的標識符
|
1430 |
for breed_type, pattern in breed_exercise_patterns.items():
|
1431 |
if any(identifier in temperament or identifier in description
|
@@ -1477,7 +1477,6 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
1477 |
def apply_special_adjustments(time_score, type_score, breed_type, pattern):
|
1478 |
"""
|
1479 |
處理特殊情況,確保運動方式真正符合品種需求。
|
1480 |
-
特別加強:
|
1481 |
1. 短跑型犬種的長時間運動懲罰
|
1482 |
2. 耐力型犬種的獎勵機制
|
1483 |
3. 運動類型匹配的重要性
|
@@ -1496,7 +1495,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
1496 |
elif breed_type == 'endurance_type':
|
1497 |
if exercise_time < pattern['time_ranges']['penalty_start']:
|
1498 |
time_score *= 0.5 # 維持運動不足的懲罰
|
1499 |
-
elif exercise_time >= 150:
|
1500 |
if exercise_type in ['active_training', 'moderate_activity']:
|
1501 |
time_bonus = min(0.3, (exercise_time - 150) / 150)
|
1502 |
time_score = min(1.0, time_score * (1 + time_bonus))
|
@@ -1575,7 +1574,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
1575 |
|
1576 |
def evaluate_living_conditions() -> float:
|
1577 |
"""
|
1578 |
-
|
1579 |
1. 降低對大型犬的過度懲罰
|
1580 |
2. 增加品種特性評估
|
1581 |
3. 提升對適應性的重視度
|
@@ -1700,7 +1699,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
1700 |
|
1701 |
def calculate_weights() -> dict:
|
1702 |
"""
|
1703 |
-
|
1704 |
1. 極端情況的權重調整
|
1705 |
2. 使用者條件的協同效應
|
1706 |
3. 品種特性的影響
|
@@ -1739,7 +1738,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
1739 |
|
1740 |
# 空間限制評估 - 更合理的空間評估
|
1741 |
space_extremity = {
|
1742 |
-
'apartment': ('restricted', 0.7),
|
1743 |
'house_small': ('moderate', 0.5),
|
1744 |
'house_large': ('spacious', 0.3)
|
1745 |
}
|
@@ -1876,9 +1875,9 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
1876 |
adjustments['experience'] = 2.5
|
1877 |
elif extremities['experience'][0] == 'high':
|
1878 |
if is_working_dog:
|
1879 |
-
adjustments['experience'] = 2.5
|
1880 |
if extremities['exercise'][0] in ['high', 'extremely_high']:
|
1881 |
-
adjustments['experience'] = 2.8
|
1882 |
else:
|
1883 |
adjustments['experience'] = 1.8
|
1884 |
|
@@ -1890,7 +1889,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
1890 |
adjustments['space'] = adjustments.get('space', 1.0) * 1.3
|
1891 |
adjustments['exercise'] = adjustments.get('exercise', 1.0) * 1.3
|
1892 |
|
1893 |
-
#
|
1894 |
if (extremities['experience'][0] == 'high' and
|
1895 |
extremities['space'][0] == 'spacious' and
|
1896 |
extremities['exercise'][0] in ['high', 'extremely_high'] and
|
@@ -1931,14 +1930,11 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
1931 |
|
1932 |
def apply_special_case_adjustments(score: float) -> float:
|
1933 |
"""
|
1934 |
-
|
1935 |
1. 條件組合的協同效應
|
1936 |
2. 品種特性的獨特需求
|
1937 |
3. 極端情況的合理處理
|
1938 |
-
|
1939 |
-
這個函數就像是一個細心的裁判,會考慮到各種特殊情況,
|
1940 |
-
並根據具體場景做出合理的評分調整。
|
1941 |
-
|
1942 |
Parameters:
|
1943 |
score: 初始評分
|
1944 |
Returns:
|
@@ -1967,16 +1963,16 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
1967 |
# 大型犬的特殊處理
|
1968 |
if breed_info['Size'] in ['Large', 'Giant']:
|
1969 |
if apartment_friendly:
|
1970 |
-
multiplier *= 0.85
|
1971 |
else:
|
1972 |
-
multiplier *= 0.75
|
1973 |
|
1974 |
# 檢查運動需求的匹配度
|
1975 |
exercise_needs = breed_info.get('Exercise Needs', 'MODERATE').upper()
|
1976 |
exercise_time = user_prefs.exercise_time
|
1977 |
|
1978 |
if exercise_needs in ['HIGH', 'VERY HIGH']:
|
1979 |
-
if exercise_time >= 120:
|
1980 |
multiplier *= 1.1
|
1981 |
|
1982 |
return multiplier
|
@@ -1996,17 +1992,17 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
1996 |
if user_prefs.experience_level == 'beginner':
|
1997 |
if care_level == 'HIGH':
|
1998 |
if user_prefs.has_children:
|
1999 |
-
multiplier *= 0.7
|
2000 |
else:
|
2001 |
-
multiplier *= 0.8
|
2002 |
|
2003 |
# 性格特徵影響,降低懲罰程度
|
2004 |
challenging_traits = {
|
2005 |
-
'stubborn': -0.10,
|
2006 |
-
'independent': -0.08,
|
2007 |
-
'dominant': -0.08,
|
2008 |
-
'protective': -0.06,
|
2009 |
-
'aggressive': -0.15
|
2010 |
}
|
2011 |
|
2012 |
for trait, penalty in challenging_traits.items():
|
@@ -2018,9 +2014,6 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
2018 |
def evaluate_breed_specific_requirements() -> float:
|
2019 |
"""
|
2020 |
評估品種特定需求。
|
2021 |
-
|
2022 |
-
這個函數就像是為每個品種量身定制評估標準,
|
2023 |
-
考慮其獨特的特性和需求。
|
2024 |
"""
|
2025 |
multiplier = 1.0
|
2026 |
exercise_time = user_prefs.exercise_time
|
@@ -2034,19 +2027,19 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
2034 |
# 運動需求匹配度評估,更合理的標準
|
2035 |
if exercise_needs == 'LOW':
|
2036 |
if exercise_time > 120:
|
2037 |
-
multiplier *= 0.85
|
2038 |
elif exercise_needs == 'VERY HIGH':
|
2039 |
if exercise_time < 60:
|
2040 |
-
multiplier *= 0.7
|
2041 |
|
2042 |
# 特殊品種類型的考慮
|
2043 |
if 'sprint' in temperament:
|
2044 |
if exercise_time > 120 and exercise_type != 'active_training':
|
2045 |
-
multiplier *= 0.85
|
2046 |
|
2047 |
if any(trait in temperament for trait in ['working', 'herding']):
|
2048 |
if exercise_time < 90 or exercise_type == 'light_walks':
|
2049 |
-
multiplier *= 0.8
|
2050 |
|
2051 |
return multiplier
|
2052 |
|
@@ -2066,9 +2059,8 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
2066 |
|
2067 |
def calculate_base_score(scores: dict, weights: dict) -> float:
|
2068 |
"""
|
2069 |
-
|
2070 |
-
|
2071 |
-
這個函數使用了改進後的評分邏輯,主要關注:
|
2072 |
1. 降低關鍵指標的最低門檻,使系統更包容
|
2073 |
2. 引入非線性評分曲線,讓分數分布更合理
|
2074 |
3. 優化多重條件失敗的處理方式
|
@@ -2288,10 +2280,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
2288 |
|
2289 |
|
2290 |
def amplify_score_extreme(score: float) -> float:
|
2291 |
-
"""
|
2292 |
-
優化分數分布,提供更有意義的評分範圍。
|
2293 |
-
純粹進行數學轉換,不依賴外部資訊。
|
2294 |
-
|
2295 |
Parameters:
|
2296 |
score: 原始評分(0-1之間的浮點數)
|
2297 |
|
|
|
33 |
|
34 |
def apply_size_filter(breed_score: float, user_preference: str, breed_size: str) -> float:
|
35 |
"""
|
36 |
+
基於用戶的體型偏好過濾品種,只要不符合就過濾掉
|
37 |
|
38 |
Parameters:
|
39 |
breed_score (float): 原始品種評分
|
|
|
161 |
# 6. 適應性評估
|
162 |
adaptability_bonus = 0.0
|
163 |
if breed_info.get('Size') == "Small" and user_prefs.living_space == "apartment":
|
164 |
+
adaptability_bonus += 0.08
|
165 |
|
166 |
# 環境適應性評估
|
167 |
if 'adaptable' in temperament or 'versatile' in temperament:
|
168 |
if user_prefs.living_space == "apartment":
|
169 |
+
adaptability_bonus += 0.10
|
170 |
else:
|
171 |
+
adaptability_bonus += 0.05
|
172 |
|
173 |
# 氣候適應性
|
174 |
description = breed_info.get('Description', '').lower()
|
|
|
633 |
|
634 |
def calculate_exercise_score(breed_needs: str, exercise_time: int, exercise_type: str, breed_size: str, living_space: str) -> float:
|
635 |
"""
|
636 |
+
計算品種運動需求與使用者運動條件的匹配度
|
637 |
1. 不同品種的運動耐受度差異
|
638 |
2. 運動時間與類型的匹配度
|
639 |
3. 極端運動量的嚴格限制
|
|
|
902 |
2. 縮小經驗等級間的差距
|
903 |
3. 保持適度的區分度
|
904 |
"""
|
905 |
+
# 基礎分數矩陣
|
906 |
base_scores = {
|
907 |
"High": {
|
908 |
"beginner": 0.55, # 提高起始分,讓新手也有機會
|
909 |
+
"intermediate": 0.80, # 中等經驗用戶可能有不錯的勝任能力
|
910 |
"advanced": 0.95 # 資深者幾乎完全勝任
|
911 |
},
|
912 |
"Moderate": {
|
913 |
"beginner": 0.65, # 適中難度對新手更友善
|
914 |
+
"intermediate": 0.85, # 中等經驗用戶相當適合
|
915 |
"advanced": 0.90 # 資深者完全勝任
|
916 |
},
|
917 |
"Low": {
|
918 |
"beginner": 0.85, # 新手友善品種維持高分
|
919 |
+
"intermediate": 0.90, # 中等經驗用戶幾乎完全勝任
|
920 |
"advanced": 0.90 # 資深者完全勝任
|
921 |
}
|
922 |
}
|
|
|
924 |
# 取得基礎分數
|
925 |
score = base_scores.get(care_level, base_scores["Moderate"])[user_experience]
|
926 |
|
927 |
+
# 性格評估的權重
|
928 |
temperament_lower = temperament.lower()
|
929 |
temperament_adjustments = 0.0
|
930 |
|
931 |
# 根據經驗等級設定不同的特徵評估標準,降低懲罰程度
|
932 |
if user_experience == "beginner":
|
933 |
difficult_traits = {
|
934 |
+
'stubborn': -0.15,
|
935 |
'independent': -0.12,
|
936 |
'dominant': -0.12,
|
937 |
'strong-willed': -0.10,
|
938 |
'protective': -0.10,
|
939 |
'aloof': -0.08,
|
940 |
'energetic': -0.08,
|
941 |
+
'aggressive': -0.20
|
942 |
}
|
943 |
|
944 |
easy_traits = {
|
945 |
+
'gentle': 0.08,
|
946 |
'friendly': 0.08,
|
947 |
'eager to please': 0.10,
|
948 |
'patient': 0.08,
|
|
|
967 |
elif 'guard' in temperament_lower:
|
968 |
temperament_adjustments -= 0.12
|
969 |
|
970 |
+
# 中等經驗用戶
|
971 |
elif user_experience == "intermediate":
|
972 |
moderate_traits = {
|
973 |
'stubborn': -0.08,
|
|
|
1237 |
print(f"品種信息: {breed_info}")
|
1238 |
print(f"使用者偏好: {vars(user_prefs)}")
|
1239 |
|
1240 |
+
# 計算所有基礎分數
|
1241 |
scores = {
|
1242 |
'space': calculate_space_score(
|
1243 |
breed_info['Size'],
|
|
|
1348 |
"""
|
1349 |
def evaluate_perfect_conditions():
|
1350 |
"""
|
1351 |
+
評估條件匹配度:
|
1352 |
1. 運動類型與時間的綜合評估
|
1353 |
2. 專業技能需求評估
|
1354 |
3. 品種特性評估
|
|
|
1358 |
'exercise_match': 0,
|
1359 |
'experience_match': 0,
|
1360 |
'living_condition_match': 0,
|
1361 |
+
'breed_trait_match': 0
|
1362 |
}
|
1363 |
|
1364 |
# 第一部分:運動需求評估
|
1365 |
def evaluate_exercise_compatibility():
|
1366 |
"""
|
1367 |
+
評估運動需求的匹配度:
|
1368 |
1. 時間與強度的合理搭配
|
1369 |
2. 不同品種的運動特性
|
1370 |
3. 運動類型的適配性
|
|
|
1425 |
}
|
1426 |
|
1427 |
def determine_breed_type():
|
1428 |
+
"""改進品種運動類型的判斷,識別工作犬"""
|
1429 |
# 優先檢查特殊運動類型的標識符
|
1430 |
for breed_type, pattern in breed_exercise_patterns.items():
|
1431 |
if any(identifier in temperament or identifier in description
|
|
|
1477 |
def apply_special_adjustments(time_score, type_score, breed_type, pattern):
|
1478 |
"""
|
1479 |
處理特殊情況,確保運動方式真正符合品種需求。
|
|
|
1480 |
1. 短跑型犬種的長時間運動懲罰
|
1481 |
2. 耐力型犬種的獎勵機制
|
1482 |
3. 運動類型匹配的重要性
|
|
|
1495 |
elif breed_type == 'endurance_type':
|
1496 |
if exercise_time < pattern['time_ranges']['penalty_start']:
|
1497 |
time_score *= 0.5 # 維持運動不足的懲罰
|
1498 |
+
elif exercise_time >= 150:
|
1499 |
if exercise_type in ['active_training', 'moderate_activity']:
|
1500 |
time_bonus = min(0.3, (exercise_time - 150) / 150)
|
1501 |
time_score = min(1.0, time_score * (1 + time_bonus))
|
|
|
1574 |
|
1575 |
def evaluate_living_conditions() -> float:
|
1576 |
"""
|
1577 |
+
評估生活環境適配性:
|
1578 |
1. 降低對大型犬的過度懲罰
|
1579 |
2. 增加品種特性評估
|
1580 |
3. 提升對適應性的重視度
|
|
|
1699 |
|
1700 |
def calculate_weights() -> dict:
|
1701 |
"""
|
1702 |
+
動態計算評分權重:
|
1703 |
1. 極端情況的權重調整
|
1704 |
2. 使用者條件的協同效應
|
1705 |
3. 品種特性的影響
|
|
|
1738 |
|
1739 |
# 空間限制評估 - 更合理的空間評估
|
1740 |
space_extremity = {
|
1741 |
+
'apartment': ('restricted', 0.7),
|
1742 |
'house_small': ('moderate', 0.5),
|
1743 |
'house_large': ('spacious', 0.3)
|
1744 |
}
|
|
|
1875 |
adjustments['experience'] = 2.5
|
1876 |
elif extremities['experience'][0] == 'high':
|
1877 |
if is_working_dog:
|
1878 |
+
adjustments['experience'] = 2.5
|
1879 |
if extremities['exercise'][0] in ['high', 'extremely_high']:
|
1880 |
+
adjustments['experience'] = 2.8
|
1881 |
else:
|
1882 |
adjustments['experience'] = 1.8
|
1883 |
|
|
|
1889 |
adjustments['space'] = adjustments.get('space', 1.0) * 1.3
|
1890 |
adjustments['exercise'] = adjustments.get('exercise', 1.0) * 1.3
|
1891 |
|
1892 |
+
# 專家 + 大空間 + 高運動量 + 工作犬的組合
|
1893 |
if (extremities['experience'][0] == 'high' and
|
1894 |
extremities['space'][0] == 'spacious' and
|
1895 |
extremities['exercise'][0] in ['high', 'extremely_high'] and
|
|
|
1930 |
|
1931 |
def apply_special_case_adjustments(score: float) -> float:
|
1932 |
"""
|
1933 |
+
處理特殊情況和極端案例的評分調整:
|
1934 |
1. 條件組合的協同效應
|
1935 |
2. 品種特性的獨特需求
|
1936 |
3. 極端情況的合理處理
|
1937 |
+
|
|
|
|
|
|
|
1938 |
Parameters:
|
1939 |
score: 初始評分
|
1940 |
Returns:
|
|
|
1963 |
# 大型犬的特殊處理
|
1964 |
if breed_info['Size'] in ['Large', 'Giant']:
|
1965 |
if apartment_friendly:
|
1966 |
+
multiplier *= 0.85
|
1967 |
else:
|
1968 |
+
multiplier *= 0.75
|
1969 |
|
1970 |
# 檢查運動需求的匹配度
|
1971 |
exercise_needs = breed_info.get('Exercise Needs', 'MODERATE').upper()
|
1972 |
exercise_time = user_prefs.exercise_time
|
1973 |
|
1974 |
if exercise_needs in ['HIGH', 'VERY HIGH']:
|
1975 |
+
if exercise_time >= 120:
|
1976 |
multiplier *= 1.1
|
1977 |
|
1978 |
return multiplier
|
|
|
1992 |
if user_prefs.experience_level == 'beginner':
|
1993 |
if care_level == 'HIGH':
|
1994 |
if user_prefs.has_children:
|
1995 |
+
multiplier *= 0.7
|
1996 |
else:
|
1997 |
+
multiplier *= 0.8
|
1998 |
|
1999 |
# 性格特徵影響,降低懲罰程度
|
2000 |
challenging_traits = {
|
2001 |
+
'stubborn': -0.10,
|
2002 |
+
'independent': -0.08,
|
2003 |
+
'dominant': -0.08,
|
2004 |
+
'protective': -0.06,
|
2005 |
+
'aggressive': -0.15
|
2006 |
}
|
2007 |
|
2008 |
for trait, penalty in challenging_traits.items():
|
|
|
2014 |
def evaluate_breed_specific_requirements() -> float:
|
2015 |
"""
|
2016 |
評估品種特定需求。
|
|
|
|
|
|
|
2017 |
"""
|
2018 |
multiplier = 1.0
|
2019 |
exercise_time = user_prefs.exercise_time
|
|
|
2027 |
# 運動需求匹配度評估,更合理的標準
|
2028 |
if exercise_needs == 'LOW':
|
2029 |
if exercise_time > 120:
|
2030 |
+
multiplier *= 0.85
|
2031 |
elif exercise_needs == 'VERY HIGH':
|
2032 |
if exercise_time < 60:
|
2033 |
+
multiplier *= 0.7
|
2034 |
|
2035 |
# 特殊品種類型的考慮
|
2036 |
if 'sprint' in temperament:
|
2037 |
if exercise_time > 120 and exercise_type != 'active_training':
|
2038 |
+
multiplier *= 0.85
|
2039 |
|
2040 |
if any(trait in temperament for trait in ['working', 'herding']):
|
2041 |
if exercise_time < 90 or exercise_type == 'light_walks':
|
2042 |
+
multiplier *= 0.8
|
2043 |
|
2044 |
return multiplier
|
2045 |
|
|
|
2059 |
|
2060 |
def calculate_base_score(scores: dict, weights: dict) -> float:
|
2061 |
"""
|
2062 |
+
計算基礎評分分數
|
2063 |
+
這個函數使用了改進後的評分邏輯:
|
|
|
2064 |
1. 降低關鍵指標的最低門檻,使系統更包容
|
2065 |
2. 引入非線性評分曲線,讓分數分布更合理
|
2066 |
3. 優化多重條件失敗的處理方式
|
|
|
2280 |
|
2281 |
|
2282 |
def amplify_score_extreme(score: float) -> float:
|
2283 |
+
"""
|
|
|
|
|
|
|
2284 |
Parameters:
|
2285 |
score: 原始評分(0-1之間的浮點數)
|
2286 |
|