我一直在解决一个问题...整体问题很复杂......但是让我尽力解释真正重要的部分......
我有一个图表,其中每条边表示连接的两个节点之间的相关性。每个节点是时间进程(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中这样做,但任何代码都没问题......
答案 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
个总边。在共享边缘的任何节点对i
和j
之间,您有一个系数
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
有两个邻居u
和v
,我们就无法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]
节点的最终时间序列事件。