心情机制


心情机制

本章节将介绍 V4.5.0 中新加入好感系统的心情机制,「心情系统」中引入了「心情」、「心情浮动」和「心情系数」三个变量。

每次校准将对当前校准周期中的活跃用户进行一次心情变动,重新调整上述三个变量的值。

我们将对它们分别进行介绍,并阐述它们内在的算法机理。

适用人群

本章节适合对 V4.5.0 版本前的好感系统有一定了解、且愿意深入理解心情系统运行机制的用户。

迭代中

目前心情机制仍处于迭代中,本章节中的内容会随着版本的更新而发生变化。

心情

顾名思义,它指示了茉莉当前的心情,处于不同心情下的茉莉对我们的反应自然是不同的,这部分不同包括好感的获取量、回复等。

这意味着,在该版本之前,和茉莉互动的效果取决于你当前的好感度、全局校准值和亲和度,而现在,它还取决于茉莉的心情

同时,茉莉在不同的心情下对不同好感等级的用户的回复是不同的

好感等级由低到高可分为 4 个等级,而心情从宏观上来讲分为好、中、坏三个等级,即每一种行为对应 3*4=12 种不同情景下的回复。

目前版本中,茉莉有以下几种心情

  • 平常:平时的正常情绪,没有任何附加效果

  • 开心:随时间流逝的好感度减少,时间流逝的好感度会乘以心情系数

  • 渴望:喂食、赠礼的好感获取量增加,获取的好感将乘以心情系数

  • 振奋:交互的好感获取量增加(除喂食、赠礼),获取的好感将乘以心情系数

  • 好奇:提出一项物品需求,赠送茉莉该物品后有5%概率立刻获得 300 点好感,未完成将有5%概率减少 100 点好感

  • 焦虑:随时间流逝的好感度增加,时间流逝的好感度会乘以心情系数

  • 失望:喂食、赠礼的好感获取量减少,获取的好感将乘以心情系数

  • 枯燥:交互的好感获取量减少(除喂食、赠礼),获取的好感将乘以心情系数

后续心情将在后续版本陆续补充,敬请期待。

心情浮动

考虑这样一个事实:没有人会一直保持好心情或坏心情,为了避免这种情况,我们需要一个变量来对连续的同类心情进行概率修正

当算法抽取到好心情时,心情浮动值将+1,坏心情将-1,平常心情不变。

每一个单位心情浮动值将减少抽取到平常心情与当前心情的概率,同时增加相反心情的概率。

特别地,当心情浮动值绝对值达到 3 时,下一次情绪变动将必定抽取相反的情绪

当抽取到了相反的心情时,心情浮动值将重置为 0。

心情系数

在上述有关心情这一变量的介绍中,我们提到了心情系数,它是心情对好感获取量调整的直接反应。

心情系数的取值范围为[0.5,2],每种不同的心情有不同的计算心情系数的方式,具体计算方法将在下面的心情算法中介绍。

心情算法

我们接下来将对茉莉采用的心情抽取算法进行介绍,如果你准备好了,就让我们开始吧!

首先,需要明确的是,不同于「校准值」这一全局概念,心情是单个用户独立的,在每次校准时对上一校准周期内活跃的用户重新计算。

我们首先将通过 Box-Muller 变换获取一个标准正态分布随机数

local x = math.random()
local y = math.random()
local z = math.sqrt(-2 * math.log(x)) * math.cos(2 * math.pi * y)

可见,z 的取值范围是[-inf,inf],现在我们在原点两边取两个边界点,分别为-0.75 和 0.75。

若 z 的取值在[-0.75,0.75]之间,则认为茉莉处于平常心情,小于-0.75 则认为茉莉处于坏心情,大于 0.75 则认为茉莉处于好心情。

不难得到,茉莉处于平常心情的概率 P=54.68%

上述的方法是在心情浮动值为 0 的情况下的抽取方法,当心情浮动值不为 0 时,我们将在上述的基础上进行修正。

我们假设心情浮动值为 float_value,分两种情况讨论:

  • float_value < 0:两个边界点分别修正为-0.75+float_value*0.1 和 0.75+ float_value*0.2

  • float_value > 0:两个边界点分别修正为-0.75+float_value*0.2 和 0.75+ float_value*0.1

通过上述方法抽得到了心情的三种分类:好、中、坏

接下来,按照均匀分布的方法,在不同的心情分类下抽取一个具体心情,即上述介绍心情时提到的具体心情。

在抽取到具体心情后,我们将根据具体心情计算心情系数 c,具体计算方法如下:

首先,我们将 z 的范围限定在[-1,1]之间,接着计算 y=abs(z) + 1

对于不同的心情:

  • 平常:c = 1

  • 开心:c = 1/y

  • 渴望:c = y

  • 振奋:c = y

  • 好奇:不存在心情系数

  • 焦虑:c = y

  • 失望:c = 1/y

  • 枯燥:c = 1/y

当然,心情抽取结束后我们将对心情浮动值进行调整,调整算法在介绍心情浮动时已阐述过了。

上述算法将在后续版本中进行调整。