我在动态编程中有一个问题,如果我有一组覆盖目标的传感器(目标可能被多个传感器覆盖),我如何才能找到传感器的最低成本子集,知道每个传感器都有自己的成本? 我对此有很多想法,但我无法通过递归论坛来编写我的程序?贪心算法有时给我错误的最小成本子集,我的问题是传感器在覆盖目标时重叠,有什么帮助?
例如: 我有一组成本/重量= {s1:1,s2:2.5,s3:2}的传感器,我有三个目标= {t1,t2,t3}。传感器覆盖范围如下:= {s1:t1 t2,s2:t1 t2 t3,s3:t2 t3}我需要通过动态编程获得最小成本子集,对于上面的例子,如果我使用贪心算法,我会得到s1,s3但正确答案是s2
答案 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没有任何变化,因为s1
和s2
也涵盖了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]值并在需要时使用以避免重复。希望这可以帮助。可能有更好的方法。