点数で選ぶ — 効用ベースAI
行動ごとに点数をつけて、いちばん高いものを選ぶ。空腹なら食べるの点が上がり、疲れたら休むの点が上がる。状況に応じて点が連続的に動くので、はっきりした境目なしに振る舞いが移り変わる。
効用ベースAI(utility AI)は、選べる各行動の望ましさを一つのスカラー(効用)に畳んで、最大の行動を選ぶ意思決定。The Sims(2000)の欲求システムが例で、空腹・社交・娯楽といった複数の欲求をそれぞれ独立に評価して合算する。手を動かすと二点で詰まる。値域の違う要因を 0..1 に正規化してから比べること、生の値を応答曲線(response curve)に通してから効用にすること。線形・S字・指数といった曲線の形が、その要因がどの帯域で効くかを決める。
複数の要因を 0 から 1 に正規化してから比べる。生の値をそのまま点にせず、応答曲線を通す。応答曲線は、欲求の生の値(0..1)を効用へ写す関数。線形ならそのまま、S字なら低いうちは差が出にくく、高くなってから一気に効く。
// 緩いS字。x=0,1 で 0,1、真ん中あたりで立ち上がる const curve = (x) => x * x * (3 - 2 * x)
空腹が 0.5 を超えてから急に効いてくる、という非線形をこの一本で表せる。選び替えにためがついて、切り替わりが境目で神経質に揺れにくくなる。
各欲求を curve に通して、いちばん高いものを選ぶ。argmax。
// 各欲求を曲線に通して、効用が最大の行動を覚える
for (let i = 0; i < needs.length; i++) {
const u = curve(needs[i].v)
if (u > bestU) {
bestU = u
bestI = i
}
}下は三つの欲求(空腹・疲労・退屈)が別の速さで時間ゆらぎし、それぞれの効用をバーで描いて、最大の行動を選び続ける。選ばれたバーだけ濃く塗り、上の丸がそれを指す。
三本のバーが別々の速さで上下して、いちばん高いバーが濃く塗られ、上の丸がそれを指す。境目で二本が拮抗すると、丸がぴくぴく行き来する瞬間がある。応答曲線 curve を線形(x をそのまま返す)に変えると、この行き来が頻繁になって、選び替えが神経質になる。argmax で一番を取るだけで、点のつけ方しだいで振る舞いの性格が変わる。
効用は重み付け確率にもできる。一番を必ず選ぶ代わりに、点数に比例した確率で抽選すれば、たまに二番手も選んで予測しづらくなる。決定論と確率のあいだを点数で連続的に動かせる。