我有一个图表,其中节点代表城市(城市对象有人口,坐标为字段),边缘代表它们之间的距离。如何计算圆形轮廓的中心,以便它覆盖最多的人口(不是节点数!)? 1)该图用于表示基础设施状态,这与手头的问题无关。 2)圆圈本身受尺寸(半径)约束。基本上,我试图模拟核打击。
是否有开箱即用的算法?
答案 0 :(得分:1)
R
要放置的圆的半径,N
城市的数量,Pi
第i个城市的人口,我们使用这一个关键观察点:< / p>
最佳圆圈总是可以稍微移动,以便它仍覆盖相同的城市但现在接触两个城市。
下图说明了这一点:带有划线的圆圈是最佳的,并且可以稍微移动到一个恰好通过2个点的最佳圆圈
<head>
<title>Untitled Diagram</title>
</head>
<body style="background-color:#ffffff;">
<div class="mxgraph" style="position:relative;overflow:auto;width:100%;">
<div style="width:1px;height:1px;overflow:hidden;">1ZfNjtowEMefhjuJw9expdv2UqkSh7ZHb2ISa50YOWaBffod45kEhyDtIaQLSCj+2x6PfzNjnAlbl8cfhu+KXzoTahJPs+OEfZvE8WKVwK8TTl6YL6ZeyI3MvBS1wka+CRRp2F5mog4GWq2VlbtQTHVVidQGGjdGH8JhW63CVXc8pxVbYZNyda3+kZktvLqM563+U8i8oJWj+cr3PPP0JTd6X+F6k5htzx/fXXKyhRutC57pQyAdp2iUoc0TCQkKO14Fbr5pXQaCEXWDFK1uJfqK7WdtMmG8RJqS1cslOPYEITZaw0z3VB7XQrkwUwj9tO83ehuGRlTB2rcmQJeb8MrVHn1HRvZEcYEJkALQ+HoopBWbHU9dzwGSELTClgpaETyiKWGswJzscafdJOSx0KWw5uQCgO5QMmIOR5TDhzYjohlqxWU2kMgRZt7YbncPDwigHwYbEMZWKrXWSrtwV7pyMzJeF8ItNRQs1oFFDEaBNfsArCr74g4GaKWK17VMQ0awT3P6Cw0oNt/4Rz1HaZsOeCa9B6HIro6VDkDwSe/NOU5tkC03ucBRZ8+vMV9g7KNImhGKW/kaOtFHFlf4rSW410SRdVI+oaiSCe88zros5Y6hxiE0FC87hvyWrwydA91s+0OxxyN58EKBk3t6/g5UIHR6UIGsegqkrz4GKI/FYyBiM6xjShqG7REQLR8ki6iOKIvm4yHCy8ejIYrn4xUa2fj0lUY3vv/BCL399HmUdBgl45VaNORV+I6Mklt/82MwutcNeWBG0VUe3Y0RNNu3NX+Vat/O2dM7</div>
</div>
<script type="text/javascript" src="https://www.draw.io/js/embed-static.min.js"></script>
</body>
所以算法如下:
迭代距离小于R的所有点对。
对于每对,计算通过它们的两个半径为R的圆。
对于每个圈子,通过计算内部包含的城市数来计算总人口。
以下是the two circles of radius R that go through them
所指的圈子:
<html>
<head>
<title>Untitled Diagram</title>
</head>
<body style="background-color:#ffffff;">
<div class="mxgraph" style="position:relative;overflow:auto;width:100%;">
<div style="width:1px;height:1px;overflow:hidden;">1ZXPkuIgEIefJvckzPjnOo67e9mThzljIIGS0CmCm8Snl0iTiKM3Z2pWqyz61zTdfN2FCdnU/W9DG/EXGFdJnrI+Ie9Jni/XL+53FAYvLJapFyojmZeyWdjJE0cxbDtKxttoowVQVjaxWIDWvLCRRo2BLt5WgoqzNrQKGWdhV1D1Wf2QzAqvrvLFrP/hshIhc7ZYe8+eFofKwFFjviQn5eXj3TUNZ+FFW0EZdJHUp96cYAwokHQqS0dlngDqSDC8nZDiIaXEWtHeg2HcYCbUlNSHa3Bk61psAFzkuKr7DVdjm0MLfdivB96pWMN1lPthwKuP+EfVEYtHSHYIjXERbgac8dYJafmuocXo6dwUOk3YWjkrc8tSKrUBBf6KJL18nY4puLEch/VOnfPt3YBzqLk1w9gZxEVCY7AvYbi7eVRC78T1lKBGkXE1nTxDcQvk8oARTuBPZ0TSG0brb2S0eiIjRlvBx4NvgWnQY/gz5inHxyOwSrHeiNVdWM+ghcn/G1oZhgRa4en9ClrOnN+/i+/q/45szw==</div>
</div>
<script type="text/javascript" src="https://www.draw.io/js/embed-static.min.js"></script>
</body>
</html>
一个简单的实现会产生一个O(n^3)
算法(有O(n^2)
个点对,并且通过检查来计算一个圆内的总人口需要时间O(n)
每个城市是否在里面。
如果这种复杂性不够好,你需要尝试更复杂的事情。为改进以前的解决方案而想到的一些事情是:根据x,y,任意方向和/或它们的组合对城市进行排序(您可以使用此方法测试更少的点数,也可以快速限制城市可能包含在您的圈子中),并将城市存储在四叉树中。构建与每个城市周围的绘图圆相对应的组合地图也可以工作(不确定这个的复杂性,并且它非常复杂......)。