weighted中文文档|weighted js中文教程|解析

npm npmdoc 2年前 (2021-12-30) 431次浏览

weighted中文文档|weighted js中文教程|解析

安装命令:npm i weighted

加权

一个非常简单的模块,用于从一组项目中挑选一个项目,同时挑选一些比其他的更频繁。每个项目都有一个数字“权重”:每个项目被选中的可能性与其在总权重中的份额成正比。

例如,如果我有两个项目,“apple”和“orange”,“apple”的权重为 1,“orange”的权重为 2,那么“orange”被选中的可能性是“apple ”的两倍“(2/3 对 1/3)。如果我们添加第三个选项“banana”,权重为 2,那么“banana”和“orange”各自被采摘的可能性是另一个,被采摘的可能性是“apple”的两倍(2/ 5 对 1/5)。

安装

npm install weighted

用法

加权返回一个额外可用的函数weighted.select

weighted(set, weights, [options])
weighted(obj, [options])
weighted.select(set, weights, [options])
weighted.select(obj, [options])

可以基于一对数组(一个带有项目,一个带有它们的权重)或单个对象(将项目作为键,它们的权重作为值)进行选择。在以下每个示例中,'Wake Up'被选中的几率为 25%,而被选中的几率为'Snooze Alarm'75%。如果我们添加更多项目,则机会会相应地改变,如上所述。

数组版本

var weighted = require('weighted')

var items = ['Wake Up', 'Snooze Alarm']
  , weights = [0.25, 0.75]

console.log('Decision:', weighted.select(items, weights))

对象版本

var weighted = require('weighted')

var items = {
	  'Wake Up': 0.25,
	  'Snooze Alarm': 0.75
	}

console.log('Decision:', weighted.select(items))

可用选项

第三个参数 ,options塑造了加权执行选择的方式:

名称 描述
兰特 返回一个[0, )用于选择的数字的函数假设(尽管绝不是必需的)均匀分布。请参阅下面的“覆盖兰特”。
普通的 如果为真,则假定所有权重加起来为 1。请参阅下面的“性能预归一化”。

覆盖兰特

默认情况下,加权Math.random()用于选择。这可以通过提供一个函数作为rand选项来覆盖就像Math.random(),它应该不需要参数并返回一个介于 0 和 1 之间的数字。例如,如果您想randmersenne覆盖

var weighted = require('weighted')
  , mersenne = require('mersenne')

var items = ['Wake Up', 'Snooze Alarm']
  , weights = [0.25, 0.75]

function rand() {
  return mersenne.rand() / 32768
}

console.log('Decision:', weighted.select(items, weights, rand))

预归一化

该模块针对同一组项目中的多个选择进行了优化,并将尝试预先加载标准化您分配给它们的任何权重的成本。但是如果项目集或其权重需要不断变化,您可以通过自己标准化或计算这些权重来帮助加权。

如果所有权重加起来为 1(如我们的示例中所示),您可以将一个真值传递给该normal选项,Weighted 将假设相同的值。如果所有权重加起来等于任何其他值,您可以提供一个数字作为total
选项,Weighted 将使用该总数。

从人类的角度来看,标准化您的权重会很方便,因为任何权重乘以 100 都会为您提供该项目被选中的确切百分比可能性。另一方面,如果存在某种影响权重的“投票”机制,例如,简单地使用投票数作为每个项目的权重就足够了。

npm run bench如果您想要不同模式及其性能影响的示例,则可以使用微基准测试

同时选择多个项目

目前,不支持在同一个调用中选择多个项目。如果您想要多个选择(即重复也可以,您只想要多个),那么weighted.select多次调用就足够了。如果您希望在同一个调用中获得多个独特的选择,最好编写一个包装器来满足您的特定用例。问题#2有一种方法。

谢谢

该模块最初是为 构建的bot-factory,如果我不感谢 Red Robot Labs 赞助这项工作,以及 38 Studios 的 AI 团队教我如何“智能”随机活动,我就会失职。

项目贡献人员列表:


极客公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:weighted中文文档|weighted js中文教程|解析
喜欢 (0)
.excerpt .focus {display:none}