【问题标题】:Efficient algorithm for association Obj1 to Obj2 based on a rule set基于规则集的关联 Obj1 到 Obj2 的高效算法
【发布时间】:2012-01-02 19:50:06
【问题描述】:

我有一个包含数百万条事务记录(Obj1)的表,看起来像这样

TransactionNum  Country   ZipCode State    TransactionAmount
1               USA        94002   CA         1000
2               USA        00023   FL         1000

我有另一个包含销售代表记录 (Obj2) 的表,同样有数十万条记录。

SalesrepId   PersonNumber     Name
Srp001          123           Rohan
Srp002          124           Shetty

我有一些规则集表,基本上规则定义如下

  • 规则名称:规则 1
  • 合格标准:Country = "USA" and (ZipCode = 94002 or State = "FL")
  • 信用接收销售代表:
    • Srp001 获得 70%
    • Srp002 获得 30%

交易的合格标准,这意味着如果交易属性与规则中的标准匹配,那么信用将分配给规则的信用接收者部分中定义的销售代表。

现在,我需要一个算法来填充如下结果表

ResultId TransactionNumber SalesrepId  Credit
1        1                 Srp001        700
2        2                 Srp002        300

执行此操作的有效算法是什么?

【问题讨论】:

  • 你能粗略估计一下交易数量、销售代表和规则吗?对 3 条规则和 100 万笔交易有效的算法对于 1000 条规则和 2000 笔交易可能很糟糕。
  • 交易记录将约为 1500 万。规则将在 ~4000 中。Salesreps 表将包含 ~50000
  • 你的数据格式一点都不清楚。在 Salesreps 记录中,您说 Attribute1 是一个 intValue,但在 Transaction 记录和规则中,Attribute1 显然是一个字符串。另外,有多少属性?您的 transaction 和 salesrep 记录显示两个,但您的示例规则显示三个。此外,示例规则中的“salesrep1”是否与 SalesrepId == 001 相同?从您目前为止告诉我们的情况来看,没有足够的信息和太多的模棱两可,无法为您提供一个好的答案。
  • 每个属性有多少个可能的值?又有多少属性呢?
  • 吉姆,很抱歉造成混淆。我已将问题编辑得更清楚。基本上,规则中的标准仅适用于交易属性。

标签: algorithm rule-engine


【解决方案1】:

因此,您真正的问题是如何快速将交易与潜在规则相匹配。您可以使用倒排索引来执行此操作,该索引说明哪些规则与属性的特定值匹配。例如,假设您有以下三个规则:

Rule 1: if Country = "USA" and State = "FL"
            S1 gets 100%
Rule 2: if Country = "USA" and (State = "CO" or ZIP = 78640)
            S2 gets 60%
            S3 gets 40%
Rule 3: if Country = "UK"
            S3 gets 70%
            S2 gets 30%

现在,您可以像这样处理规则并创建输出:

Country,USA,Rule1
State,FL,Rule1
Country,USA,Rule2
State,CO,Rule2
ZIP,78640,Rule2
Country,UK,Rule3

然后您处理该输出(或者您可以在处理规则的同时进行)并构建三个表。一种将 Country 值映射到规则,一种将 State 值映射到规则,另一种将 ZIP 值映射到规则。你最终会得到类似的东西:

Countries:
    USA, {Rule1, Rule2}
    UK, {Rule3}
States:
    FL, {Rule1}
    CO, {Rule2}
    "*", {Rule3}
ZIP:
    78640, {Rule2}
    "*", {Rule1, Rule3}

“*”值是“不关心”,它将匹配所有未明确提及该字段的规则。这是否需要取决于您如何构建规则。

只要您的规则发生变化,就会构建上述索引。使用 4000 条规则,根本不需要任何时间,列表大小也不会很大。

现在,给定一笔 Country 值为“USA”的交易,您可以在 Country 表中查找所有提及该国家/地区的规则。调用该列表Country_Rules。对州和邮政编码执行相同的操作。

然后你可以做一个列表交集。也就是说,构建另一个名为Country_And_State_Rules 的列表,其中仅包含Country_RulesState_Rules 列表中存在的规则。这通常是一小组可能的规则。然后,您可以根据需要逐一检查国家、州和邮政编码。

您正在构建的本质上是一个规则搜索引擎。它应该可以让您快速将候选人从 4,000 人缩小到少数人。

您必须解决一些问题。有条件逻辑(“OR”)会使事情变得有点复杂,但它并不难处理。此外,您必须确定如何处理歧义(如果两个规则匹配怎么办?)。或者,如果没有规则匹配特定的国家和州,那么您必须备份并检查仅匹配国家...或仅匹配州的规则。这就是“不在乎”的来源。

如果您的规则足够明确,那么在绝大多数情况下,您应该能够非常快速地选择相关规则。在少数情况下,您需要为某些交易搜索许多不同的规则。但这些情况应该很少见。如果它们很频繁,那么您需要考虑重新检查您的规则集。

一旦您知道哪个规则适用于特定交易,您就可以轻松查找哪个销售人员获得了多少,因为比例与规则一起存储。

【讨论】:

  • 感谢 Jim 提供的这种方法。歧义问题可以通过将这些规则置于层次结构中并确定相对排名来解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 2019-09-05
  • 2012-12-20
相关资源
最近更新 更多