DawnC commited on
Commit
fc530c9
1 Parent(s): 29c25d0

Update scoring_calculation_system.py

Browse files
Files changed (1) hide show
  1. scoring_calculation_system.py +28 -105
scoring_calculation_system.py CHANGED
@@ -2322,20 +2322,11 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
2322
 
2323
  return min(max_possible_score, max(min_possible_score, final_score))
2324
 
 
2325
  def amplify_score_extreme(score: float) -> float:
2326
  """
2327
  優化分數分布,提供更有意義的評分範圍。
2328
-
2329
- 這個函數就像是一個分數校準器,它的作用類似於相機的色彩校準,
2330
- 讓原始的分數分布能更好地反映實際的匹配程度。比如,一個90分的匹配
2331
- 應該確實代表一個非常好的搭配,而不是一個僅僅"還可以"的選擇。
2332
-
2333
- 我們使用分段函數和平滑曲線來實現這個目標:
2334
- - 90-100分代表極佳匹配(映射到96-100)
2335
- - 80-90分代表優秀匹配(映射到90-96)
2336
- - 70-80分代表良好匹配(映射到82-90)
2337
- - 50-70分代表可接受匹配(映射到75-82)
2338
- - 50分以下代表較差匹配(映射到70-75)
2339
 
2340
  Parameters:
2341
  score: 原始評分(0-1之間的浮點數)
@@ -2344,104 +2335,36 @@ def amplify_score_extreme(score: float) -> float:
2344
  float: 調整後的評分(0-1之間的浮點數)
2345
  """
2346
  def smooth_curve(x: float, steepness: float = 12) -> float:
2347
- """
2348
- 創建平滑的S型曲線用於分數轉換。
2349
-
2350
- 這個函數使用sigmoid函數來產生平滑的轉換曲線,避免分數在
2351
- 不同區間之間產生突兀的跳變。就像是在照片編輯中,我們會使用
2352
- 漸變而不是突變來調整色調。
2353
-
2354
- Parameters:
2355
- x: 輸入值(0-1之間)
2356
- steepness: 曲線的陡峭程度,越大曲線越陡
2357
-
2358
- Returns:
2359
- float: 轉換後的值(0-1之間)
2360
- """
2361
  import math
2362
  return 1 / (1 + math.exp(-steepness * (x - 0.5)))
2363
 
2364
- def apply_range_mapping(score: float) -> float:
2365
- """
2366
- 將分數映射到新的範圍,並保持平滑過渡。
2367
-
2368
- 這個函數負責將原始分數轉換到新的分數範圍。就像是將溫度從
2369
- 攝氏度轉換到華氏度,但要保持溫度變化的連續性。
2370
-
2371
- Parameters:
2372
- score: 原始分數
2373
-
2374
- Returns:
2375
- float: 映射後的分數
2376
- """
2377
- # 極佳匹配區間(90-100)
2378
- if score >= 0.90:
2379
- # 計算在當前區間內的相對位置
2380
- position = (score - 0.90) / 0.10
2381
- # 映射到96-100的範圍
2382
- return 0.96 + (position * 0.04)
2383
-
2384
- # 優秀匹配區間(80-90)
2385
- elif score >= 0.80:
2386
- position = (score - 0.80) / 0.10
2387
- # 使用平滑曲線進行轉換
2388
- transition = smooth_curve(position)
2389
- return 0.90 + (transition * 0.06)
2390
-
2391
- # 良好匹配區間(70-80)
2392
- elif score >= 0.70:
2393
- position = (score - 0.70) / 0.10
2394
- # 加入輕微的非線性轉換
2395
- return 0.82 + (math.pow(position, 0.9) * 0.08)
2396
-
2397
- # 可接受匹配區間(50-70)
2398
- elif score >= 0.50:
2399
- position = (score - 0.50) / 0.20
2400
- # 使用更平緩的曲線
2401
- return 0.75 + (smooth_curve(position) * 0.07)
2402
-
2403
- # 較差匹配區間(50以下)
2404
- else:
2405
- position = score / 0.50
2406
- # 確保即使是較低分數也能得到基本分數
2407
- return 0.70 + (smooth_curve(position) * 0.05)
2408
-
2409
- def apply_context_bonus(score: float) -> float:
2410
- """
2411
- 根據具體情況添加額外的分數調整。
2412
-
2413
- 這個函數考慮特定的場景來微調分數,就像是考試時會根據題目
2414
- 的難度來調整給分標準。
2415
-
2416
- Parameters:
2417
- score: 當前分數
2418
-
2419
- Returns:
2420
- float: 調整後的分數
2421
- """
2422
- bonus = 0
2423
-
2424
- # 特殊場景加分
2425
- temperament = breed_info.get('Temperament', '').lower()
2426
- if user_prefs.living_space == 'apartment':
2427
- if 'adaptable' in temperament and score > 0.85:
2428
- bonus += 0.02
2429
-
2430
- # 運動需求匹配度加分
2431
- if breed_info.get('Exercise Needs', 'MODERATE').upper() == 'LOW':
2432
- if user_prefs.exercise_time <= 60 and score > 0.85:
2433
- bonus += 0.01
2434
-
2435
- return min(1.0, score + bonus)
2436
 
2437
- # 應用基本的範圍映射
2438
- adjusted_score = apply_range_mapping(score)
2439
-
2440
- # 應用情境相關的調整
2441
- final_score = apply_context_bonus(adjusted_score)
2442
-
2443
- # 確保分數在有效範圍內
2444
- return round(min(1.0, max(0.0, final_score)), 4)
2445
 
2446
  # def amplify_score_extreme(score: float) -> float:
2447
  # """優化分數分布,提供更高的分數範圍"""
 
2322
 
2323
  return min(max_possible_score, max(min_possible_score, final_score))
2324
 
2325
+
2326
  def amplify_score_extreme(score: float) -> float:
2327
  """
2328
  優化分數分布,提供更有意義的評分範圍。
2329
+ 純粹進行數學轉換,不依賴外部資訊。
 
 
 
 
 
 
 
 
 
 
2330
 
2331
  Parameters:
2332
  score: 原始評分(0-1之間的浮點數)
 
2335
  float: 調整後的評分(0-1之間的浮點數)
2336
  """
2337
  def smooth_curve(x: float, steepness: float = 12) -> float:
2338
+ """創建平滑的S型曲線用於分數轉換"""
 
 
 
 
 
 
 
 
 
 
 
 
 
2339
  import math
2340
  return 1 / (1 + math.exp(-steepness * (x - 0.5)))
2341
 
2342
+ # 90-100分的轉換(極佳匹配)
2343
+ if score >= 0.90:
2344
+ position = (score - 0.90) / 0.10
2345
+ return 0.96 + (position * 0.04)
2346
+
2347
+ # 80-90分的轉換(優秀匹配)
2348
+ elif score >= 0.80:
2349
+ position = (score - 0.80) / 0.10
2350
+ return 0.90 + (position * 0.06)
2351
+
2352
+ # 70-80分的轉換(良好匹配)
2353
+ elif score >= 0.70:
2354
+ position = (score - 0.70) / 0.10
2355
+ return 0.82 + (position * 0.08)
2356
+
2357
+ # 50-70分的轉換(可接受匹配)
2358
+ elif score >= 0.50:
2359
+ position = (score - 0.50) / 0.20
2360
+ return 0.75 + (smooth_curve(position) * 0.07)
2361
+
2362
+ # 50分以下的轉換(較差匹配)
2363
+ else:
2364
+ position = score / 0.50
2365
+ return 0.70 + (smooth_curve(position) * 0.05)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2366
 
2367
+ return round(min(1.0, max(0.0, score)), 4)
 
 
 
 
 
 
 
2368
 
2369
  # def amplify_score_extreme(score: float) -> float:
2370
  # """優化分數分布,提供更高的分數範圍"""