【发布时间】:2014-09-11 16:04:41
【问题描述】:
我有一个 100 × 100 点的二维网格(总计:10000 点)。 X 从 0 到 99 变化,Y 变化 从 0 到 99。我将每个 (x,y) 发送到 BlackBox 模块 并返回 2 个值 p 和 q。黑盒子 本质上是根据 (x,y) 从其可用函数集中选择一个函数并应用它 on (x,y) 然后返回成本和它使用的函数索引。
因此,这个二维空间中的每个点都与 2 个值 (p,q) 相关联。第一个值 'p' 表示 Blackbox 使用哪个函数,第二个值 'q' 是成本。 Blackbox 对每个 (x,y) 使用的函数可能不同,并假设 Blackbox**(V = ~60) 可以使用最多 V 个函数。还假设 **cost 在 X 和 Y 维度上都是单调非递减的。
请注意,我们也可以使用三个参数 (x,y,k) 调用 Blackbox,使其在 (x,y) 上执行函数 k 并返回一些 (k,q)。
我想要实现的是这个。 Blackbox 选择了非常多的功能。 我想通过增加点数成本来减少这种情况。
我想要做的是减少网格中使用的函数数量。假设 Blackbox 在空间中的某些点使用了所有 60 个函数。我想找到一组最小的函数,这些函数在使用时 评估一个点 (x,y) 不会使该点 (x,y) 的成本增加超过一个因子“s”。
例如:假设因子 's' = 20%。假设我从 (99,99) 开始并检查它的 p。说 p = 5(第 5 个函数) 在那一点上,q = 3000。说在点 (99,98), (p,q) = (8, 2600)。我叫黑盒(99,98,5) 这使黑盒在点 (99,98) 执行函数 5 并让我说 (8,2800) 作为返回 价值。虽然 2800 > 2600, 2800 - 2600 在 2600 的 20% 以内,所以我可以使用函数 5 (99,99) at (99,98) 我也可以忽略函数 8 至少对于点 (99,98)。
同样,我想减少空间中使用的功能数量以降低价值,而无需 将任何点的成本增加超过's'。调用 Blackbox 最少次数 的最佳方法是什么?
蛮力方式:选择每个使用的不同函数并在整个空间中对其进行评估,并根据该函数决定覆盖空间中所有点且满足“s”阈值的最小函数集。
我知道这个问题真的很难读懂,但我已尽我所能问我的 准确地问。
【问题讨论】:
-
似乎“成本在两个方向上都是单调非递减的”仅适用于“组合”函数,并且各个函数(例如您的示例中的函数 5)不需要遵守该属性.如果是这样,那么使用少于 10000 次函数评估就不可能完全解决该问题,因为您的封面中至少需要 1 个函数,并且在您不评估它的任何时候它都可能是任意糟糕的。您需要对 60 个单独的 BB 函数进行额外条件才能做得更好。
-
@j_random_hacker:各个函数独立地遵守该属性
-
假设您打算写“我调用 Blackbox (99,98,5),这使 blackbox 在点 (99,98) 执行函数 5 并让我说 (5,3100) 作为返回值。”,这显然不适用于函数 5,因为 3100 > 3000 但 98
-
@j_random_hacker 我的意思是说,如果你在整个空间中评估相同的函数,你将能够看到单调性。我将在我给出的示例中纠正这个错误
-
@j_random_hacker:成本取决于两件事。您使用哪个函数以及在哪个点 (x,y) 使用它。 Blackbox 为成本最低的 (x,y) 选择最佳函数。但我是说我不想在 (x,y) 处对 (x,y) 使用最佳函数。如果我能保证我不会通过空间中的另一个函数将 cost(x,y) 增加超过 's' 以便我用最少数量的唯一函数覆盖整个空间,这对我来说就足够了
标签: c++ c algorithm data-structures