DawnC commited on
Commit
94d53d5
1 Parent(s): 5f3de8c

Update scoring_calculation_system.py

Browse files
Files changed (1) hide show
  1. scoring_calculation_system.py +122 -56
scoring_calculation_system.py CHANGED
@@ -1642,101 +1642,167 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
1642
 
1643
  # 第一部分:運動需求評估
1644
  def evaluate_exercise_compatibility():
 
 
 
 
 
 
 
 
 
1645
  exercise_needs = breed_info.get('Exercise Needs', 'MODERATE').upper()
1646
  exercise_time = user_prefs.exercise_time
1647
  exercise_type = user_prefs.exercise_type
1648
  temperament = breed_info.get('Temperament', '').lower()
1649
  description = breed_info.get('Description', '').lower()
1650
-
1651
- # 定義更細緻的品種運動特性
1652
  breed_exercise_patterns = {
1653
- 'sprint_type': { # Whippet, Saluki
1654
- 'identifiers': ['fast', 'speed', 'sprint', 'racing', 'coursing'],
1655
  'ideal_exercise': {
1656
- 'active_training': 1.0, # 適合高強度訓練
1657
- 'moderate_activity': 0.6, # 不太適合持續運動
1658
- 'light_walks': 0.4 # 不適合純散步
1659
  },
1660
  'time_ranges': {
1661
- 'ideal': (30, 90), # 理想運動時間
1662
- 'acceptable': (20, 120) # 可接受範圍
1663
- }
 
 
1664
  },
1665
- 'endurance_type': { # Border Collie, German Shepherd
1666
- 'identifiers': ['herding', 'working', 'tireless', 'energetic', 'stamina'],
1667
  'ideal_exercise': {
1668
- 'active_training': 0.9, # 適合高強度訓練
1669
- 'moderate_activity': 1.0, # 最適合持續運動
1670
- 'light_walks': 0.5 # 不適合純散步
1671
  },
1672
  'time_ranges': {
1673
- 'ideal': (90, 180), # 理想運動時間
1674
- 'acceptable': (60, 240) # 可接受範圍
1675
- }
 
 
1676
  },
1677
- 'moderate_type': { # Labrador, Golden Retriever
1678
- 'identifiers': ['friendly', 'playful', 'adaptable', 'versatile'],
1679
  'ideal_exercise': {
1680
  'active_training': 0.8,
1681
  'moderate_activity': 1.0,
1682
- 'light_walks': 0.7
1683
  },
1684
  'time_ranges': {
1685
  'ideal': (60, 120),
1686
- 'acceptable': (45, 180)
1687
- }
 
 
1688
  }
1689
  }
1690
-
1691
- # 判斷品種的運動類型
1692
  def determine_breed_type():
 
 
 
 
 
1693
  for breed_type, pattern in breed_exercise_patterns.items():
1694
  if any(identifier in temperament or identifier in description
1695
  for identifier in pattern['identifiers']):
1696
  return breed_type
1697
- return 'moderate_type' # 預設類型
1698
-
1699
- breed_type = determine_breed_type()
1700
- pattern = breed_exercise_patterns[breed_type]
1701
-
1702
- # 計算時間匹配度
1703
- def calculate_time_match():
 
 
 
 
 
 
 
1704
  ideal_min, ideal_max = pattern['time_ranges']['ideal']
1705
  accept_min, accept_max = pattern['time_ranges']['acceptable']
 
1706
 
 
1707
  if ideal_min <= exercise_time <= ideal_max:
1708
  return 1.0
 
 
1709
  elif exercise_time < accept_min:
1710
- return max(0.3, 1 - ((accept_min - exercise_time) / accept_min))
 
1711
  elif exercise_time > accept_max:
1712
- return max(0.3, 1 - ((exercise_time - accept_max) / accept_max))
 
 
 
 
1713
  else:
1714
- # 在可接受範圍內,但不在理想範圍
1715
  if exercise_time < ideal_min:
1716
- return 0.7 + (0.3 * (exercise_time - accept_min) / (ideal_min - accept_min))
 
1717
  else:
1718
- return 0.7 + (0.3 * (accept_max - exercise_time) / (accept_max - ideal_max))
1719
-
1720
- # 計算運動類型匹配度
1721
- type_score = pattern['ideal_exercise'].get(exercise_type, 0.5)
1722
-
1723
- # 特殊情況處理
1724
- def apply_special_adjustments(time_score, type_score):
 
 
1725
  if breed_type == 'sprint_type':
1726
- if exercise_time > pattern['time_ranges']['acceptable'][1]:
1727
- return (time_score * 0.5, type_score * 0.6)
1728
-
1729
- if breed_type == 'endurance_type':
1730
- if exercise_time < pattern['time_ranges']['ideal'][0]:
1731
- return (time_score * 0.6, type_score * 0.7)
 
 
 
 
 
 
 
 
1732
 
1733
- return (time_score, type_score)
1734
-
1735
- time_score = calculate_time_match()
1736
- time_score, type_score = apply_special_adjustments(time_score, type_score)
1737
-
1738
- # 最終運動匹配度計算
1739
- return (time_score * 0.6) + (type_score * 0.4)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1740
 
1741
  # 第二部分:專業技能需求評估
1742
  def evaluate_expertise_requirements():
 
1642
 
1643
  # 第一部分:運動需求評估
1644
  def evaluate_exercise_compatibility():
1645
+ """
1646
+ 評估運動需求的匹配度,特別關注:
1647
+ 1. 時間與強度的合理搭配
1648
+ 2. 不同品種的運動特性
1649
+ 3. 運動類型的適配性
1650
+
1651
+ 這個函數就像是一個體育教練,需要根據每個"運動員"(狗品種)的特點,
1652
+ 為他們制定合適的訓練計劃。
1653
+ """
1654
  exercise_needs = breed_info.get('Exercise Needs', 'MODERATE').upper()
1655
  exercise_time = user_prefs.exercise_time
1656
  exercise_type = user_prefs.exercise_type
1657
  temperament = breed_info.get('Temperament', '').lower()
1658
  description = breed_info.get('Description', '').lower()
1659
+
1660
+ # 定義更精確的品種運動特性
1661
  breed_exercise_patterns = {
1662
+ 'sprint_type': { # 短跑型犬種,如 Whippet, Saluki
1663
+ 'identifiers': ['fast', 'speed', 'sprint', 'racing', 'coursing', 'sight hound'],
1664
  'ideal_exercise': {
1665
+ 'active_training': 1.0, # 完美匹配高強度訓練
1666
+ 'moderate_activity': 0.5, # 持續運動不是最佳選擇
1667
+ 'light_walks': 0.3 # 輕度運動效果很差
1668
  },
1669
  'time_ranges': {
1670
+ 'ideal': (30, 60), # 最適合的運動時間範圍
1671
+ 'acceptable': (20, 90), # 可以接受的時間範圍
1672
+ 'penalty_start': 90 # 開始給予懲罰的時間點
1673
+ },
1674
+ 'penalty_rate': 0.8 # 超出範圍時的懲罰係數
1675
  },
1676
+ 'endurance_type': { # 耐力型犬種,如 Border Collie
1677
+ 'identifiers': ['herding', 'working', 'tireless', 'energetic', 'stamina', 'athletic'],
1678
  'ideal_exercise': {
1679
+ 'active_training': 0.9, # 高強度訓練很好
1680
+ 'moderate_activity': 1.0, # 持續運動是最佳選擇
1681
+ 'light_walks': 0.4 # 輕度運動不足
1682
  },
1683
  'time_ranges': {
1684
+ 'ideal': (90, 180), # 需要較長的運動時間
1685
+ 'acceptable': (60, 180),
1686
+ 'penalty_start': 60 # 運動時間過短會受罰
1687
+ },
1688
+ 'penalty_rate': 0.7
1689
  },
1690
+ 'moderate_type': { # 一般活動型犬種,如 Labrador
1691
+ 'identifiers': ['friendly', 'playful', 'adaptable', 'versatile', 'companion'],
1692
  'ideal_exercise': {
1693
  'active_training': 0.8,
1694
  'moderate_activity': 1.0,
1695
+ 'light_walks': 0.6
1696
  },
1697
  'time_ranges': {
1698
  'ideal': (60, 120),
1699
+ 'acceptable': (45, 150),
1700
+ 'penalty_start': 150
1701
+ },
1702
+ 'penalty_rate': 0.6
1703
  }
1704
  }
1705
+
 
1706
  def determine_breed_type():
1707
+ """
1708
+ 根據品種的描述和性格特徵判斷其運動類型。
1709
+ 就像體育教練要��了解運動員的特點才能制定訓練計劃。
1710
+ """
1711
+ # 優先檢查特殊運動類型的標識符
1712
  for breed_type, pattern in breed_exercise_patterns.items():
1713
  if any(identifier in temperament or identifier in description
1714
  for identifier in pattern['identifiers']):
1715
  return breed_type
1716
+
1717
+ # 如果沒有特殊標識,根據運動需求級別判斷
1718
+ if exercise_needs in ['VERY HIGH', 'HIGH']:
1719
+ return 'endurance_type'
1720
+ elif exercise_needs == 'LOW':
1721
+ return 'moderate_type'
1722
+
1723
+ return 'moderate_type'
1724
+
1725
+ def calculate_time_match(pattern):
1726
+ """
1727
+ 計算運動時間的匹配度。
1728
+ 這就像在判斷運動時間是否符合訓練計劃。
1729
+ """
1730
  ideal_min, ideal_max = pattern['time_ranges']['ideal']
1731
  accept_min, accept_max = pattern['time_ranges']['acceptable']
1732
+ penalty_start = pattern['time_ranges']['penalty_start']
1733
 
1734
+ # 在理想範圍內
1735
  if ideal_min <= exercise_time <= ideal_max:
1736
  return 1.0
1737
+
1738
+ # 超出可接受範圍的嚴格懲罰
1739
  elif exercise_time < accept_min:
1740
+ deficit = accept_min - exercise_time
1741
+ return max(0.2, 1 - (deficit / accept_min) * 1.2)
1742
  elif exercise_time > accept_max:
1743
+ excess = exercise_time - penalty_start
1744
+ penalty = min(0.8, (excess / penalty_start) * pattern['penalty_rate'])
1745
+ return max(0.2, 1 - penalty)
1746
+
1747
+ # 在可接受範圍但不在理想範圍
1748
  else:
 
1749
  if exercise_time < ideal_min:
1750
+ progress = (exercise_time - accept_min) / (ideal_min - accept_min)
1751
+ return 0.6 + (0.4 * progress)
1752
  else:
1753
+ remaining = (accept_max - exercise_time) / (accept_max - ideal_max)
1754
+ return 0.6 + (0.4 * remaining)
1755
+
1756
+ def apply_special_adjustments(time_score, type_score, breed_type, pattern):
1757
+ """
1758
+ 處理特殊情況,確保運動方式真正符合品種需求。
1759
+ 就像確保訓練計劃不會違背運動員的特點。
1760
+ """
1761
+ # 短跑型品種的特殊處理
1762
  if breed_type == 'sprint_type':
1763
+ if exercise_time > pattern['time_ranges']['penalty_start']:
1764
+ # 時間過長的嚴重懲罰
1765
+ time_score *= 0.5
1766
+ # 如果同時運動類型不適合,更嚴重的懲罰
1767
+ if exercise_type != 'active_training':
1768
+ type_score *= 0.4
1769
+
1770
+ # 耐力型品種的特殊處理
1771
+ elif breed_type == 'endurance_type':
1772
+ if exercise_time < pattern['time_ranges']['penalty_start']:
1773
+ time_score *= 0.6
1774
+ # 運動強度不足的懲罰
1775
+ if exercise_type == 'light_walks' and exercise_time > 90:
1776
+ type_score *= 0.5
1777
 
1778
+ return time_score, type_score
1779
+
1780
+ # 執行評估流程
1781
+ breed_type = determine_breed_type()
1782
+ pattern = breed_exercise_patterns[breed_type]
1783
+
1784
+ # 計算基礎分數
1785
+ time_score = calculate_time_match(pattern)
1786
+ type_score = pattern['ideal_exercise'].get(exercise_type, 0.5)
1787
+
1788
+ # 應用特殊調整
1789
+ time_score, type_score = apply_special_adjustments(time_score, type_score, breed_type, pattern)
1790
+
1791
+ # 根據品種類型決定最終權重
1792
+ if breed_type == 'sprint_type':
1793
+ if exercise_time > pattern['time_ranges']['penalty_start']:
1794
+ # 超時時更重視運動類型的匹配度
1795
+ return (time_score * 0.3) + (type_score * 0.7)
1796
+ else:
1797
+ return (time_score * 0.5) + (type_score * 0.5)
1798
+ elif breed_type == 'endurance_type':
1799
+ if exercise_time < pattern['time_ranges']['penalty_start']:
1800
+ # 時間不足時更重視時間因素
1801
+ return (time_score * 0.7) + (type_score * 0.3)
1802
+ else:
1803
+ return (time_score * 0.6) + (type_score * 0.4)
1804
+ else:
1805
+ return (time_score * 0.5) + (type_score * 0.5)
1806
 
1807
  # 第二部分:專業技能需求評估
1808
  def evaluate_expertise_requirements():