这篇文章和大家分享下最小树的生成。

假设一些随机放置的节点,我们希望以最少的线将其连接到一起。节点可能代表许多不同的东西,比如:是我们希望连接在一起的互联网设备。

现在一个平面上有15个随机分散的节点。每个节点都用字母a – z标记,它们是不同的颜色。

算法:

其实过程也不难,比较容易理解。

1.找到最接近的两个未连接的节点。

2.用线连接它们,只要保证不会造成形成循环。

3.重复以上两个步骤,知道无法不形成循环时停止。

显然,第二个条件有点麻烦。简单的方法是将每个节点分配给一个组。从彼此可到达的所有节点都属于同一组。

下面开始代码的编写。

新建一个类代表节点:

class MinimumNnode :

def __init__ (self, position, label, group) :

self.label = label

self.group = group

self.position = position

def __str__ (self) :

return "<%s loc %s in group %d>" % (self.label, self.position, self.group)

__repr__ = __str__

它有三个属性:位置、标签、组。通过__str__和__repr__方法,可以生成用于打印的节点的更好描述。

然后是:

class Minspan :

def __init__ (self, pgcon, pix, xNodes) :

self.pgcon = pgcon

letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

self.nodes = [MinimumNnode(randpos(20,pix-20), letters[i], i+1)

for i in range(xNodes)]

self.plinks = []

self.pix = pix

for m in range(xNodes) :

for n in range(m+1,xNodes) :

x = self.nodes[m]

y = self.nodes[n]

dist = euclDist2(x.position,y.position)

self.plinks.append((dist,x,y))

self.plinks.sort()

self.links = []

属性包括到pgcon模块的连接、以像素为单位的正方形窗口大小、生成的节点数量。使用第21行中的列表理解来生成节点,在窗口中随机分配x和y位置,并将标签分配给大写的A、B、C…。

在双循环中构建了一个潜在链接(plinks)列表。每个潜在链接都是一个Tuple,其中包含对两个节点的引用以及它们之间的距离(就是距离的平方)。当使用plinks进行排序时,我们的列表是按照最短到最长的链接排列的。

因为每个节点都可以链接到其他节点我们就有N*(N-1)个潜在的链接。但是,A和B之间的链接与B和A之间的链接是一样的,所以我们需要阻止这种情况的发生,同时也要阻止尝试将节点链接到自身。

列表初始化的时候是空,使用刚才说明的规则开始填充,当第n-1个连接从n*(n-1)/2的plinks中找到时,就有连线产生。

下面是连线的定义:

def linkNodes (self) :

nLinks = 0

while self.plinks :

plink = self.plinks.pop(0)

dst, nodA, nodB = plink

if nodA.group != nodB.group :

self.links.append((nodA,nodB))

mainGroup = nodA.group

slaveGroup = nodB.group

self.display("Will link %s->%s" % (nodA.label, nodB.label))

self.links[-1] = (nodA,nodB)

for node in self.nodes :

if node.group == slaveGroup :

node.group = mainGroup

self.display("Group %s with %s" % (slaveGroup,mainGroup))

nLinks += 1

return nLinks

最后一个方法创建显示的方法:

def display (self, banner) :

pgcon = self.pgcon

pgcon.newScreen()

for a,b in self.links :

if a.group != b.group:

color = WHITE

else:

color = colors[a.group%7]

pgcon.lineDraw(color, a.position, b.position, 1)

for node in self.nodes :

color = colors[node.group%7]

pgcon.textDraw(color, node.position, node.label)

pgcon.camera.armed = 1

pgcon.textDraw(WHITE, (self.pix/2,10), banner)

pgcon.writeScreen(.1000)

对display方法的每次调用都会在动画中创建一个帧。首先,连接是用他们组的颜色绘制的,如果还没有分配的话用白色。然后将节点的标签作为文本绘制在顶部,帧与帧之间有1秒等待。

最后,2个小函数在屏幕上产生随机的x/y位置来放置节点,计算欧氏距离来比较链路长度。实际上,由于这些距离只用于比较,我们不需要取平方根来计算实际的距离。

算法部分编写完毕后,就可以使用主函数来运行测试了:

def main() :

from pgcon import Pgcon

start = sarg.Int("start", 0)

if start :

random.start(start)

else :

start = random.randint(101,758)

print "Start is", start

random.start(start)

pgcon = Pgcon()

pix = sarg.Int("pix",546)

xNodes = sarg.Int("nodes", 20)

ms = Minspan(pgcon, pix, xNodes)

nLinks = ms.linkNodes()

print "links No.", nLinks

pgcon.close()

主要就是从命令行获取参数或提供默认值。创建Minspan实例ms,创建节点,生成图形显示链接。

版权所属,如需转载,请注明出处:搜闲鱼

闲鱼python_python生成最小树相关推荐

  1. 转转闲鱼后台生成链接源码

    带一款非常简洁好看的后台. 搭建教程:修改数据库账号密码直接使用. 源码下载 网盘下载地址:https://pan.baidu.com/s/19iOsoyK-J-Rhi2dZYqzMMg?pwd=iu ...

  2. 为什么闲鱼不能搜索python_Python 分析后告诉你闲鱼上哪些商品抢手?

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:[Airpython] PS:如有需要Python学习资料的小伙伴可以 ...

  3. 闲鱼代码Java_面向未来的黑科技——UI2CODE闲鱼基于图片生成跨端代码

    作者:闲鱼技术-青页 一直以来, 如何从'视觉稿'精确的还原出 对应的UI侧代码 一直是端侧开发同学工作里消耗比较大的部分,一方面这部分的工作 比较确定缺少技术深度,另一方面视觉设计师也需要投入大量的 ...

  4. 闲鱼同城第三方对接架构设计

    背景 闲鱼同城作为闲鱼本地生活的主战场,维护闲鱼基本盘闲置物品的同时,还针对闲置时间和闲置空间场景进行相关的孵化. 于买家而言:淘到经济实惠的闲置物品(二手数码),打发闲置时间(兼职,服务)去挣钱.于 ...

  5. Python爬虫实战,pyecharts模块,Python数据分析告诉你闲鱼上哪些商品抢手~

    前言 利用利用Python 自动化来获取某类商品中最好卖的商品以供参考.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: pyecharts模块: 以及一些Py ...

  6. CIKM最佳应用论文:11亿节点的大型图,看闲鱼如何用图卷积过滤垃圾评论

    训练并推断 11 亿节点的图,闲鱼垃圾评论过滤系统也用上了最前沿的图卷积神经网络.阿里巴巴的这项研究获得了 ACM CIKM 2019 最佳应用论文奖,这足以说明图卷积在传统任务中的强大潜力. 机器之 ...

  7. 闲鱼把各种玩法做成了一个平台:哆啦A梦

    简介:哆啦A梦的口袋里,都有哪些好玩的? 作者:闲鱼技术-齐悟 玩法平台背景 在闲鱼内我们把供给用户的闲鱼红包.支付宝红包.包邮券.宝卡等统称为用户权益.是闲鱼用户运营的重要策略,在拉新.留存.促活. ...

  8. 从“等等”到“秒开”再到“直开”,是什么让闲鱼社区相见恨晚?

    简介:快让我叉会儿腰- 作者:闲鱼技术-颂晨 背景 闲鱼前端页面的性能常常被人念叨,凡跳转.必跳鱼 的印象深入人心,部分页面甚至需要跳四五下才能打开,最近我们对闲鱼前端页面系统性的做了些优化,由于闲鱼 ...

  9. 闲鱼研发框架应用和探索

    简介:Flutter是开源的UI工具包,其能够帮助开发者通过一套代码库高效构建多平台精美应用,支持移动.Web.桌面和嵌入式平台.在AliFlutter 系列第二场直播中,阿里巴巴闲鱼无线技术专家梁治 ...

最新文章

  1. win10如何查看NVIDIA驱动的版本
  2. 讲解 Zookeeper 的五个核心知识点
  3. R语言ggplot2可视化绘制多条基本线图(Basic line plot)、使用gghighlight包突出高亮其中的某一条线图(highlight line plot)
  4. 2021年10个激动人心的工程里程碑
  5. 【深入浅出Node.js系列十一】Node.js开发框架Express4.x
  6. python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
  7. Sum All Numbers in a Range
  8. Mysql 锁的机制
  9. SpringBoot 上传限制
  10. UVa202Repeating Decimals (循环小数)
  11. Hexo框架+Github Page搭建博客(附下载主题、导出CSDN博客至Hexo博客)
  12. BZOJ2693:JZPTAP——题解
  13. chstr php,PHPWind与Discuz截取字符函数substrs与cutstr性能比较
  14. d1800芯片_基于D1800的收音/对讲机设计制作
  15. VS2012 产品密钥
  16. Js获取屏幕宽度、高度 移动端H5适配
  17. PHP实现图片转字符画
  18. FastReport.Net 常用功能总汇
  19. 开口式霍尔电流传感器如何助力直流配电改造?
  20. 【考试记录】Apsara Clouder基础技能认证:阿里巴巴编码规范(Java)

热门文章

  1. 美国地名索引(在美国的英文名市、中国)
  2. html圆形头像带阴影,iOS-圆形头像+阴影
  3. 关于转发信息系统工程监理资质(南京)
  4. Angular ngModule简介
  5. thinkphp5.1接入paypal支付
  6. 【MM32F5270开发板试用】快速移植STM32应用到MM32F5270(以OLED为例)
  7. 苹果手机信号是哪个服务器,苹果12系列手机基带是哪个?信号怎么样?
  8. 阿贝云”“免费虚拟主机““免费云服务器”“免备案服务“他来了!!!
  9. 《疯狂Java讲义》第2章——理解面向对象
  10. 机器学习数据不均衡处理教程