覆盖目标的传感器的最低成本子集

时间:2012-11-22 18:35:46

标签: algorithm dynamic-programming

我在动态编程中有一个问题,如果我有一组覆盖目标的传感器(目标可能被多个传感器覆盖),我如何才能找到传感器的最低成本子集,知道每个传感器都有自己的成本? 我对此有很多想法,但我无法通过递归论坛来编写我的程序?贪心算法有时给我错误的最小成本子集,我的问题是传感器在覆盖目标时重叠,有什么帮助?

例如: 我有一组成本/重量= {s1:1,s2:2.5,s3:2}的传感器,我有三个目标= {t1,t2,t3}。传感器覆盖范围如下:= {s1:t1 t2,s2:t1 t2 t3,s3:t2 t3}我需要通过动态编程获得最小成本子集,对于上面的例子,如果我使用贪心算法,我会得到s1,s3但正确答案是s2

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

我想到了一些事情,但我对此并不是百分之百的信心,这就是:

S = {s1 : 1, s2 : 2.5, s3 : 2}
M = {s1 : t1t2, s2 : t1t2t3, s3 : t2t3}

现在,我们构建一个表示target x sensor地图的矩阵:

[1, 1, 0]
[1, 1, 1]
[0, 1, 1]

所以行是目标(t1 -> R0, t2 -> R1 etc.),列代表哪些传感器覆盖它们。

接下来,我们逐行处理,同时收集将覆盖当前目标集的传感器列表。举个例子:

Row - 0:
{t1} -> [s1 : 1], [s2 : 2.5]

请注意,我们正在构建一个答案列表。然后我们前进到下一行,我们需要将t2添加到我们的目标集中,同时计算这样做所需的最小传感器权重。

Row - 1:
{t1, t2} -> [s1 : 1], [s2 : 2.5]

请注意,RHS没有任何变化,因为s1s2也涵盖了t2。接下来是最后一行:

Row - 2:
{t1, t2, t3} -> [s1, s3 : 3], [s2 : 2.5]

请注意,我必须在第一个答案中添加s3,因为它的最小权重覆盖t3

最后通过答案列表会发现[s2 : 2.5]是最佳候选人。

现在,我对动态编程并不那么自信,所以不确定我在这里做的是否正确。如果有人可以确认/纠正我在这里所做的事情,那将会很棒。

编辑:根据传感器的重量对列进行排序可能是有意义的。因此,选择覆盖给定目标的最低重量的传感器变得容易。

答案 2 :(得分:0)

这是我的建议,它不是一个动态的编程,但是我能想出的最好的,问题很有趣,值得讨论。


将“部分解决方案”定义为元组(T,S,P,C),其中涵盖T 目标,S包含传感器,P是一组待定目标,C是 费用。

W是当前工作的部分解决方案集,其中 最初仅包含({}, {}, X, 0),即成本为零,非空是仅包含待定目标的集合。 W可以作为堆维护。

W = { ({}, {}, X, 0) }
repeat
  p = select and remove from W the partial solution with the minimum cost
  if p.P is empty
     return p
  t = select from p.P the target, covered by the minimum number of sensors
  for each sensor s, covering t, which is not in p'.S
     p' = new partial solution, copy of p;
     p'.S += {s};
     p'.C += cost(s);
     for each target t' covered by s
       p'.T += {t};
       p'.P -= {t};
     end for
     W += {p'}
  end for
end repeat

答案 3 :(得分:0)

这是我对这个问题的算法。它是解决问题的递归方法。

伪代码:

MinimizeCost(int cost , List targetsReached, List sensorsUsed, int current_sensor) {

if(targetsReached.count == no_of_targets ) {
    if(cost < mincost ) {
          mincost = cost;
          minList = sensorsUsed;
            }       
    return;
    }

   if(current_sensor > maxsensors)
         return;
   else {
         // Current Sensor is to be ignored 
     MinimizeCost(cost , targetsReached, sensorsUsed, current_sensor +1 );

         // Current Sensor is Considered 
     int newcost = cost + sensor_cost[current_sensor];  
     sensorsUsed.Add(current_sensor);
     AddIfNotExists(targetsReached, targets[current_sensor]);
     MinimizeCost(newcost, targetsReached, sensorsUsed, current_sensor+1);
  }
}

如果不需要这些详细信息,则可以避免使用Sensors_Used List。

如果TargetsReached List可以映射到int,则可以引入进一步的Memoization。然后可以保存[Current_Sensor,TargetsReached]值并在需要时使用以避免重复。希望这可以帮助。可能有更好的方法。