向量和算子组合算法

时间:2015-04-18 00:29:11

标签: algorithm math

我正在尝试找到一种算法,该算法将使用给定矢量集上的给定运算符集的任意组合来到达目标向量。不惜一切代价,我想避免使用蛮力,我相信这个问题有一个优雅的解决方案。

示例问题:
给出向量V1 = [0, -1]; V2 = [2, 1]; V3 = [-1, 0];
以及运营商L1L2。谁的行为像L1[V1, V2] = V1 + V2; L2[V1, V2] = V1/V2
尝试达到目标向量T = [-0.5, 0]

解决方案:
L1[V1, V2] = [0, -1] + [2, 1] = [2, 0]
L2[V3, L1[V1, V2]] = [-1, 0] / [2, 0] = [-0.5, 0](向我指出了0/0分区,这是一个错误;但我认为解决方案试图实现的目标仍然有意义)

我尝试过的事情:
我曾尝试将此问题视为vector combination problem,但我还没想出如何引入运算符列表。如果我的术语不正确或令人困惑,请告诉我;任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

两步算法怎么样?

  1. 使用给定的向量集V1, V2, V3 ...尝试求解线性方程:a1 * V1 + a2 * V2 + ... = T其中系数是整数(丢番图方程)。此外,所有向量都可以按比例放大到整数。此步骤对应于操作L1
  2. 使用操作L2展开向量集并转到步骤1.

答案 1 :(得分:0)

这在算法上并不优雅,但是一旦有人发布了一个好的算法答案,可能有助于加快实现:

由于每个向量(例如,大小为n)总是作为整体处理,因此可以将向量运算的数量减少因子n/s。要做到这一点,只能在每个原始矢量的子矢量(例如,第一个s元素)上执行(最终使用的算法)。

如果您的计算机体系结构无法整体处理向量,这将至少节省计算工作以处理向量的所有组件。

由于您忽略了某些变量,因此可能会产生误报。因此,您需要验证找到的解决方案。误报的概率可以通过s的大小和您使用的子集来调整。

应用于您的示例:

V1 = [0, -1]; V2 = [2, 1]; V3 = [-1, 0];
L1[V1, V2] = V1 + V2;
L2[V1, V2] = V1/V2

仅使用s=1

V1' = [0]; V2' = [2]; V3 = [-1];
L1'[V1',V2'] = V1' + V2';
L2'[V1',V2'] = V1' / V2';

T = [-0.5]

答案 2 :(得分:-1)

假设你有m个向量和n个运算符,并假设每个运算符都将两个向量作为操作数并生成一个向量作为输出。

我提出了一个在O(mn + mlog(m))时间运行的贪婪算法,但 确保找到最佳解决方案。它如下:

  1. 根据矢量集与目标矢量的(平方)距离对矢量集进行排序。这在O(mlog(m))时间内运行,只需要进行一次。

  2. 从距离目标最近的矢量集中选择两个矢量,并从矢量集中删除它们。这将在O(1)时间内运行,因为您要从数组的末尾删除2个项目(已排序的向量数组)。

  3. 将每个运算符应用于这两个向量,并跟踪哪个运算符导致与目标向量最接近的向量。这在O(n)时间内运行。如果与目标矢量最接近的矢量与目标矢量完全匹配,则打破算法。

  4. 确定最接近的结果后,将该向量插入到适当位置的向量集中,以便向量集保持排序。这可以在log(m)时间内完成。

  5. 回到2。

  6. 由于在步骤4结束时,向量集中的向量数量与步骤2中的向量数量相比减少了1,因此该过程必然会终止。

    整体运行时间是什么?

    步骤2到4的总运行时间为O(1)+ O(n)+ O(log(m))= O(n + log(m))以及这些步骤必须的次数执行是O(m)所以包括步骤1在内的总数是

    O(mn + mlog(m))

    当然,在此过程中,您需要存储有关操作符及其操作数的足够信息,这些信息将导致与目标最接近的向量,以便您可以构建表示运算符的树以及它们需要的顺序应用

    该算法的运行时间与尝试运算符和操作数的每个组合的强力算法的运行时间相比非常有利,因为这对于向量集的大小来说是明显的指数。