setup.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. class LevelMapper:
  2. """等级映射器:将1-99映射到1-100,前缓后陡"""
  3. def __init__(self, method="power", **params):
  4. """
  5. 初始化映射器
  6. Args:
  7. method: 映射方法
  8. - "power": 幂函数
  9. - "piecewise": 分段函数
  10. - "log_exp": 对数-指数组合
  11. - "exponential": 指数函数
  12. params: 方法参数
  13. """
  14. self.method = method
  15. self.params = params
  16. def map(self, input_value):
  17. """执行映射"""
  18. if input_value < 1 or input_value > 99:
  19. raise ValueError("输入值必须在1-99范围内")
  20. x = (input_value - 1) / 98.0 # 归一化到0-1
  21. if self.method == "power":
  22. # 幂函数
  23. power = self.params.get("power", 3.0)
  24. y = x ** power
  25. elif self.method == "piecewise":
  26. # 分段函数
  27. breakpoint_norm = self.params.get("breakpoint_norm", 0.3)
  28. if x <= breakpoint_norm:
  29. # 前期线性
  30. y = x * 0.3
  31. else:
  32. # 后期指数
  33. fast_x = (x - breakpoint_norm) / (1 - breakpoint_norm)
  34. y = 0.3 + 0.7 * (math.exp(3 * fast_x) - 1) / (math.exp(3) - 1)
  35. elif self.method == "log_exp":
  36. # 对数-指数组合
  37. steepness = self.params.get("steepness", 0.1)
  38. t = (x - 0.5) * steepness * 20
  39. if t < 0:
  40. y = 0.5 + math.log1p(abs(t)) / 20
  41. else:
  42. y = 0.5 + (math.exp(t) - 1) / 20
  43. y = max(0, min(1, y))
  44. elif self.method == "exponential":
  45. # 指数函数
  46. base = self.params.get("base", 4.0)
  47. y = (base ** x - 1) / (base - 1)
  48. else:
  49. raise ValueError(f"不支持的映射方法: {self.method}")
  50. # 映射到1-100
  51. return 1 + y * 99
  52. # 使用示例
  53. if __name__ == "__main__":
  54. print("=== 等级映射器演示 ===\n")
  55. # 创建不同的映射器
  56. mappers = {
  57. "幂函数 (power=2.5)": LevelMapper("power", power=2.5),
  58. "幂函数 (power=3.5)": LevelMapper("power", power=3.5),
  59. "分段函数 (30%前慢)": LevelMapper("piecewise", breakpoint_norm=0.3),
  60. "指数函数 (base=5)": LevelMapper("exponential", base=5),
  61. }
  62. # 测试关键点
  63. test_points = [1, 10, 20, 30, 40, 50, 60, 70, 80, 90, 99]
  64. for mapper_name, mapper in mappers.items():
  65. print(f"\n{mapper_name}:")
  66. for val in test_points:
  67. result = mapper.map(val)
  68. print(f" 输入 {val:2d} -> {result:6.2f}")