Files
ST-Bionic-Memory-Ecology/dynamics.js
2026-03-23 03:57:59 +08:00

103 lines
3.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ST-BME: 记忆动力学模块
// 实现访问强化、时间衰减、混合评分 — 来自 PeroCore 的核心创新
/**
* 访问强化:节点被召回/注入时调用
* - accessCount += 1
* - importance += 0.1(上限 10
* - lastAccessTime 更新
*
* @param {object} node
*/
export function reinforceAccess(node) {
node.accessCount = (node.accessCount || 0) + 1;
node.importance = Math.min(10, (node.importance || 5) + 0.1);
node.lastAccessTime = Date.now();
}
/**
* 计算时间衰减因子
* 使用对数衰减PeroCore 方式)而非指数衰减:
* factor = 0.8 + 0.2 / (1 + ln(1 + Δt_days))
*
* 特点:久远但重要的记忆不会快速消失
* - Δt = 0天 → factor = 1.0
* - Δt = 1天 → factor ≈ 0.93
* - Δt = 7天 → factor ≈ 0.89
* - Δt = 30天 → factor ≈ 0.85
* - Δt = 365天 → factor ≈ 0.83
*
* @param {number} createdTime - 创建时间戳(ms)
* @param {number} [now] - 当前时间戳(ms)
* @returns {number} 衰减因子 [0.8, 1.0]
*/
export function timeDecayFactor(createdTime, now = Date.now()) {
const deltaDays = Math.max(0, (now - createdTime) / (1000 * 60 * 60 * 24));
return 0.8 + 0.2 / (1 + Math.log(1 + deltaDays));
}
/**
* 混合评分公式
* FinalScore = (GraphScore×α + VecScore×β + ImportanceNorm×γ) × TimeDecay
*
* 默认权重:α=0.6, β=0.3, γ=0.1
*
* @param {object} params
* @param {number} params.graphScore - 图扩散能量得分 [0, 2]
* @param {number} params.vectorScore - 向量相似度 [0, 1]
* @param {number} params.importance - 节点重要性 [0, 10]
* @param {number} params.createdTime - 节点创建时间
* @param {object} [weights] - 权重配置
* @returns {number} 最终得分
*/
export function hybridScore({
graphScore = 0,
vectorScore = 0,
importance = 5,
createdTime = Date.now(),
}, weights = {}) {
const alpha = weights.graphWeight ?? 0.6;
const beta = weights.vectorWeight ?? 0.3;
const gamma = weights.importanceWeight ?? 0.1;
// 归一化
const normGraph = Math.max(0, Math.min(1, graphScore / 2.0)); // PEDSA 能量范围 [-2, 2] → [0, 1]
const normVec = Math.max(0, Math.min(1, vectorScore));
const normImportance = Math.max(0, Math.min(1, importance / 10.0));
const baseScore = normGraph * alpha + normVec * beta + normImportance * gamma;
const decay = timeDecayFactor(createdTime);
return baseScore * decay;
}
/**
* 边权衰减:长期未被激活的边降低强度
* 只降低到最低 0.1,不会归零
*
* @param {object[]} edges
* @param {Set<string>} activatedEdgeIds - 最近被激活(出现在扩散路径上)的边 ID
* @param {number} [decayRate=0.02] - 每次调用的衰减量
*/
export function decayEdgeWeights(edges, activatedEdgeIds = new Set(), decayRate = 0.02) {
for (const edge of edges) {
if (activatedEdgeIds.has(edge.id)) {
// 被激活的边轻微加强
edge.strength = Math.min(1.0, edge.strength + decayRate * 0.5);
} else {
// 未被激活的边轻微衰减
edge.strength = Math.max(0.1, edge.strength - decayRate);
}
}
}
/**
* 批量对选中节点执行访问强化
* @param {object[]} nodes - 被召回的节点列表
*/
export function reinforceAccessBatch(nodes) {
for (const node of nodes) {
reinforceAccess(node);
}
}