这是线性编程问题吗?

时间:2011-07-16 03:58:52

标签: algorithm linear-programming np-hard

我一直在解决一个问题...整体问题很复杂......但是让我尽力解释真正重要的部分......

我有一个图表,其中每条边表示连接的两个节点之间的相关性。每个节点是时间进程(TC)(即,400个时间点),其中事件将在不同的时间点发生。两个节点之间的相关性定义为重叠事件的百分比。为简单起见,我们假设每个节点上发生的事件总数与$ tn $相同。并且如果两个TC(节点)具有$ on $重叠事件(即,在完全相同的时间点发生的事件)。然后,相关性可以简单地定义为$ on $ $ $ $ tn $。

现在,我有一个包含11个节点的网络;我知道每两个节点之间的相关性。如何为满足相关约束的所有11个节点生成TC ???

当您知道两个节点之间的相关性时,很容易对两个节点执行此操作。假设TC_1和TC_2的相关值为0.6,这意味着两个TC中有60%的重叠事件。另外,假设TC_1和TC_2的事件总数与$ tn $相同。将事件放置在两个TC中的简单算法首先随机选取0.6 * $ tn $时间点,并将其视为在两个TC中发生重叠事件的时隙。接下来,在TC_1中随机选择(1-0.6)* $ tn $时间点,以便为TC_1放置其余事件。最后,在TC_2中随机选择(1-0.6)* $ tn $时间点,TC_1中的相应时间点没有发生任何事件。

然而,当你考虑一个3节点网络时,它开始变得更难,生成的三个TC需要满足所有三个相关约束(即3个边缘)......对于11来说,几乎不可能做到这一点 - 节点网络......

这对你有意义吗?如果不是,请告诉我......

我当时认为这只是计算机科学编程问题......但我想的越多,它更像是一个线性编程问题,不是吗?

任何人都有合理的解决方案吗?我在R中这样做,但任何代码都没问题......

3 个答案:

答案 0 :(得分:1)

我认为有一种简单的线性编程方法。将解决方案表示为矩阵,其中每列是节点,每行是一个事件。单元格为0或1,表示事件与给定节点相关或不相关。那么,您的相关约束是一个约束,它固定一对列中的11个数,相对于每个列中的1个数,实际上您已提前修复了这些数据。

在给定此框架的情况下,如果将每个可能的行视为特定项,发生X_i次,那么您将具有形式SUM_i X_i * P_ij = K_j的约束,其中P_ij为0或1取决于可能的行i是否具有由j计数的列对中的11。当然,对于大量节点来说这是一个灾难,但是有11个节点有2048个可能的行,这不是完全无法管理的。 X_i可能不是线性的,但我猜它们应该是理性的,所以如果你准备使用惊人数量的行/事件,你应该没问题。

不幸的是,您可能还需要尝试不同的总列数,因为潜伏着不平等。如果有N行,两列中有m和n 1,则该列对中必须至少有m + n - N 11。实际上你可以在每列中使用1的公共数作为解决方案变量 - 这将为您提供一组新的约束,其中Q_ij为0,一个取决于列行i是否在列中为1学家

可能有一个更好的答案潜伏在那里。特别是,生成正态分布的随机变量到特定的相关性很容易(如果可行的话) - http://en.wikipedia.org/wiki/Cholesky_decomposition#Monte_Carlo_simulation和(根据Google R mvrnorm)。考虑具有2 ^ N行和2 ^ N-1列的矩阵,其填充有+/- 1的条目。使用N位的所有组合标记行,并使用N位的所有非零列标记列。用-1 ^(行标签和列标签的奇偶校验)填充每个单元格。每列具有相同数量的+1和-1条目。如果逐个元素地将多个两列放在一起,则会得到一个不同的列,它具有相同数量的+1和-1条目 - 因此它们是相互不相关的。如果您的Cholesky分解为您提供了元素在[-1,1]范围内的矩阵,您可以使用它来组合列,您可以通过从列中随机选取或根据列中的否定列来组合它们。特别是概率。

这也表明你可能通过原始的线性编程方法,例如15列,从不是所有可能的2 ^ 15个不同的行中选择,但是从具有相同的16个不同的行中选择如上所述,模式为具有2 ^ 4行和2 ^ 4-1列的矩阵。

答案 1 :(得分:0)

如果存在解决方案(你可以解决问题,你可以将其表示为线性方程系统。)

 x1/x2 = b => 
 x1 - b*x2 = 0
 or just
 a*x1 + b*x2 = 0

你应该能够将其转换为求解线性方程组或更精确的线性方程组,因为在Ax = b中的b等于0。

问题是,由于你有n个节点和n *(n-1)/ 2个关系(方程式),你必须有很多关系,而且没有解决方案。

您可能将此问题表示为

最小化Ax,其中x> 0和x.x == konstant

答案 2 :(得分:0)

您可以将其表示为混合整数程序。

假设我们有N个节点,并且每个节点总共有T个时隙。您想要查找这些时间段的事件分配。每个节点都有tn <= T个事件。您的图表中有M个总边。在共享边缘的任何节点对ij之间,您有一个系数

c_ij = overlap_ij/tn

其中overlap_ij是重叠事件的数量。

x[i,t]成为定义为

的二进制变量
 x[i,t] = { 1 if an event occurs at time t in node i
        = { 0 otherwise.

然后tn事件在节点i发生的约束可写为:

sum_{t=1}^T  x[i,t] == tn

e[i,j,t]成为定义为

的二进制变量
 e[i,j,t] = { 1 if node i and node j share an event a time t
          = { 0 otherwise

N(i)表示节点i的邻居。然后我们每次都有t

  sum_{j in N(i)}  e[i,j,t] <= x[i,t]

这表示如果共享事件在时间i的节点t的邻居中发生,则节点i必须在时间t处发生事件。此外,如果节点i有两个邻居uv,我们就无法e[i,u,t] + e[i,v,t] > 1(意味着两个事件将共享相同的时间段),因为所有邻居的总和小于x[i,t] <= 1

我们还知道节点overlap_ij = tn*c_ij和节点i之间必须有j个重叠事件。这意味着我们有

  sum_{t=1}^T e[i,j,t] == overlap_ij

将所有内容放在一起,您将获得以下MIP

  minimize  0 
    e, x
  subject to     sum_{t=1}^T x[i,t] == tn, for all nodes i=1,...,N
                 sum_{j in N(i)} e[i,j,t] <= x[i,t],
                       for all nodes i=1,...,N and all time t=1,...,T
                 sum_{t=1}^T e[i,j,t] == overlap_ij for all edges (i,j) 
                                                      between nodes
                 x[i,t] binary for i=1,...,N and t=1,...,T
                 e[i,j,t] binary for all edges (i,j) and t=1,...,T

这里的目标是零,因为你的模型是一个纯粹的可行性问题。此模型总共有T*N + M*T个变量和N + N*T + M个约束。

Gurobi这样的MIP求解器可以解决上述问题,或证明它是不可行的(即不存在解决方案)。 Gurobi有一个与R的接口。

您可以通过查看解决方案向量i来提取x[i,1], x[i,2], ..., x[i,T]节点的最终时间序列事件。