我需要按距离将蓝色对象映射到红色对象。每个对象的中心都是已知的。黄色和绿色的对象(如果显示)是提示。它们有助于确定哪个红色物体更重要。
例如,在下图所示的情况下:
我有一个幼稚的解决方案,但我不太确定该怎么做而不是“ ????”在
您有什么建议吗?
我朴素的伪代码解决方案:
for each BLUE:
find group P=(YELLOW_BLUE, GREEN_BLUE and RED_BLUE) when each object in P is the closest to BLUE
vector<RED> redCandidates
for each O in P:
if O is YELLOW OR O is GREEN
find closest RED to O
insert RED to redCandidates
if size of redCandidates is 0 -> return RED_BLUE
else if size of redCandidates is 1 -> return redCandidates[0] since hint has more weight to the decision
else if size of redCandidates is > 1 -> ????
答案 0 :(得分:0)
您的问题似乎尚未完全形成,您正在寻找一种用语言表达的事物的表象。
以下是一些建议:
最小化应将一个蓝色框分配给一个红色框(根据您告诉我的内容。)绿色和黄色框是提示,不包含在此约束中,它们仅用于修改哪个红色框优先于红色框其他。为使您用语言描述的内容形式化,我们有一组红色框R
和一组蓝色框B
。有m
个红色框和n
个蓝色框。
m >= n
与红框i
的每对配对都有一个偏好设置j
(此偏好设置是对提示框以及空间接近度进行预先计算的。)
我们希望计算:
w_{ij}
仅当将蓝色框 max \sum_{i<j} w_{ij}x_{ij}
such that
\sum_{k} x_{ik} = 1, \sum_{l} x_{lj} = 1, x_{ik} \in {0,1}
分配给红色框x_{ij}
时,变量i
才为1,否则为0。
这个问题(是Totally Unimodular),可以在多项式时间内解决。实际上,它可以作为公共Minimum Cost Flow problem的实例来解决。为此,请在图中为每个蓝色框j
定义一个节点,并在图中为每个红色框i
定义一个节点。将每个蓝色节点与权重为j
且容量为1的每个红色节点(指向蓝色->红色)相连。将每个蓝色节点与边缘为容量为1的源(指向源->蓝色)相连。权重为0。将每个红色节点的容量为1,权重为0,将每个红色节点连接到接收器(指向红色->接收器)。给源提供-w_{ij}
,给接收器提供n
。在此图上计算“最小成本流”(例如,参见lemon),结果流将产生最大解(或者最小流)。
已经对此进行了详细描述,我认为这已经是解决确切问题的通用方法[1]。 Here是一种实现。
YMMV取决于您的举重水平。您可能想尝试一种机器学习方法,使用地面事实数据集和迭代细化方法确定最佳权重。可以通过优化权重n
直到固定的一组蓝色和红色地面真值框来计算细化,直到除地面真相以外的所有其他可能赋值的优化分数都比地面真相低。可以使用任何最大利润率学习框架或技术,结合上述我的方法(显然在[1]中进行了描述),来迭代完成此操作。
[1] Zhang,Li,Nevatia:使用网络流进行多对象跟踪的全局数据关联,CVPR(2008)。