迭代计算

蚁群算法求解TSP问题

假如想象 提交于 2019-12-03 14:40:40
一、蚁群算法简介 蚁群算法是对自然界蚂蚁的寻径方式进行模似而得出的一种仿生算法:蚂蚁在运动过程中,能够在它所经过的路径上留下信息素(pheromone)的物质进行信息传递,而且蚂蚁在运动过程中能够感知这种物质,并以此指导自己的运动方向。由大量蚂蚁组成的蚁群集体行为便表现出一种信息正反馈现象:某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大。蚁群算法具有分布计算、信息正反馈和启发式搜索的特征,本质上是进化算法中的一种启发式全局优化算法。 二、TSP问题(旅行商问题) T S P 问 题 可 以 用 一 个 带 权 完 全 图G=(N,A)来表示,其中N是带有n=|N|点(城市)的集合,A是完全连接这些点的边的集合。每一条边(i,j)属于A都带有一个权值,它代表城市i与城市j之间的距离。TSP问题就是要找到图中的最短哈密尔顿回路。 1、构建图:构建图与问题描述图是一致的,成份的集合C对应着点的集合(即:C=N),连接对应着边的集合(即L=A),且每一条边都带有一个权值,代表点i和j之间的距离。 2、约束条件:所有城市都要被访问且每个城市最多只能被访问一次。 3、信息素和启发式信息:TSP 问题中的信息素表示在访问城市i后直接访问城市j的期望度。启发式信息值一般与城市i和城市j的距离成反比。 4、解的构建:每只蚂蚁最初都从随机选择出来的城市出发

高级特性:切片迭代列表生成,生成器迭代器

蓝咒 提交于 2019-12-03 14:17:26
切片 取一个list或tuple的部分元素 L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素 只写[:]就可以原样复制一个list 字符串'xxx'也可以看成是一种list,每个元素就是一个字符 'xxx'[:3] 迭代,就是循环 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration) 迭代dict >>> d = {'a': 1, 'b': 2, 'c': 3} >>> for key in d: ... print(key) ... a c b 默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items() 字符串迭代 >>> for ch in 'ABC': ... print(ch) ... A B C 如何判断一个对象是可迭代对象 >>> from collections import Iterable >>> isinstance('abc', Iterable) # str是否可迭代 True >>>

go map数据结构和源码详解

白昼怎懂夜的黑 提交于 2019-12-03 10:26:23
目录 1. 前言 2. go map的数据结构 2.1 核心结体体 2.2 数据结构图 3. go map的常用操作 3.1 创建 3.2 插入或更新 3.3 删除 3.4 查找 3.5 range迭代 3.5.1 初始化迭代器mapiterinit() 3.5.2 迭代过程mapiternext() 4. go map的扩容缩容 4.1 扩容缩容的基本原理 4.2 为什么叫“伪缩容”?如何实现“真缩容”? 5 Q&A关键知识点 5.1 基本原理 5.2 时间复杂度和空间复杂度分析 1. 前言 本文以go1.12.5版本分析,map相关的源码在runtime包的map开头的几个文件中,主要为map.go。 go的map底层实现方式是hash表(C++的map是红黑树实现,而C++ 11新增的unordered_map则与go的map类似,都是hash实现)。go map的数据被置入一个由桶组成的有序数组中,每个桶最多可以存放8个key/value对。key的hash值(32位)的低阶位用于在该数组中定位到桶,而高8位则用于在桶中区分key/value对。 go map的hash表中的基本单位是桶,每个桶最多存8个键值对,超了,则会链接到额外的溢出桶。所以go map是基本数据结构是hash数组+桶内的key-value数组+溢出的桶链表 当hash表超过阈值需要扩容增长时

go map数据结构和源码详解

别说谁变了你拦得住时间么 提交于 2019-12-03 07:58:52
目录 1. 前言 2. go map的数据结构 2.1 核心结体体 2.2 数据结构图 3. go map的常用操作 3.1 创建 3.2 插入或更新 3.3 删除 3.4 查找 3.5 range迭代 3.5.1 初始化迭代器mapiterinit() 3.5.2 迭代过程mapiternext() 4. go map的扩容缩容 4.1 扩容缩容的基本原理 4.2 为什么叫“伪缩容”?如何实现“真缩容”? 5 Q&A关键知识点 5.1 基本原理 5.2 时间复杂度和空间复杂度分析 1. 前言 本文以go1.12.5版本分析,map相关的源码在runtime包的map开头的几个文件中,主要为map.go。 go的map底层实现方式是hash表(C++的map是红黑树实现,而C++ 11新增的unordered_map则与go的map类似,都是hash实现)。go map的数据被置入一个由桶组成的有序数组中,每个桶最多可以存放8个key/value对。key的hash值(32位)的低阶位用于在该数组中定位到桶,而高8位则用于在桶中区分key/value对。 go map的hash表中的基本单位是桶,每个桶最多存8个键值对,超了,则会链接到额外的溢出桶。所以go map是基本数据结构是hash数组+桶内的key-value数组+溢出的桶链表 当hash表超过阈值需要扩容增长时

Python【day 13】内置函数02

巧了我就是萌 提交于 2019-12-03 06:09:23
一、作用域相关-2个 1、locals() 参数是空 返回当前位置作用域的所有变量,返回的是字典 当前位置:函数内,返回局部变量 当前位置:函数外,返回全局变量 2、globals() 参数是空 返回全局变量,返回的是字典二、迭代器-生成器相关--3个 1、range() 生成数字数据,例如:等差数列 参数是数字 2、next() 参数是迭代器-Iterator,返回的是迭代器的一个取值,只能向下取值,不能后退 和迭代器.__next__()等效--内部原理 3、iter() 用于把Iterable转换成迭代器 参数是Iterable,返回的是迭代器,内部调用的是Iterable.__iter__() 可迭代类型的(可迭代的):Iterable 包括:str list tuple dict set range() open() 迭代器:Iterator Iterator = iter(Iterable) 或者 Iterator = Iterable.__iter__() 注意:列表是Iterable,而不是Iterator三、其他-12个 1、字符串类型代码的执行--3个 1、eval() 作用:用于实现计算器,字符串表达式的执行 参数:字符串表达式 比如:'1+3' 返回:int--计算结果 应用场景:有返回值的字符串形式的代码- 比如:计算器、'[1,2]'或者"{'name'

Python 迭代器

醉酒当歌 提交于 2019-12-03 05:18:17
Python 迭代器 来自 https://www.runoob.com/python3/python3-iterator-generator.html 来自 https://www.liaoxuefeng.com/wiki/1016959663602400/1017323698112640 迭代器的特性: 迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法: iter() 和 next() 。 迭代器是惰性的,只有在需要返回下一个数据时它才会计算。当数据流很大时,使用迭代器十分有利。 字符串,列表或元组对象都可用于创建迭代器 L = [1, 2, 3, 4] it = iter(L) print(it) # 输出:<list_iterator object at 0x00000000024B9198> print(type(it)) # 输出:<class 'list_iterator'> print(next(it)) # 输出:1 print(next(it)) # 输出:2 T = (5, 6, 7, 8) it_1 = iter(T) print(it_1) # 输出:<tuple_iterator

STL源码剖析——序列式容器#3 Deque

孤人 提交于 2019-12-03 04:37:19
  Deque是一种双向开口的连续线性空间。所谓的双向开口,就是能在头尾两端分别做元素的插入和删除,而且是在常数的时间内完成。虽然Vector也可以在首端进行元素的插入和删除(利用insert和erase),但效率奇差(涉及到整个数组的移动),无法被接受。   另外,Deque与Vector间最大的差别就是Deque没有类似于Vector中的容量的概念,因为Deque是以分段连续空间组合而成的,至于什么是分段连续空间,等会会详细讨论。所以Deque不会有像Vector那样“因旧空间不足而重新配置一块更大的空间,然后复制元素,再释放旧空间”这样的操作。   也因为其独特的数据结构,所以对Deque自身进行排序效率不是很高,至少对比于Vector而言确实如此。如果为了最高效率,建议可将Deque先完整复制到一个Vector身上,将Vector排序后(STL Sort算法),再复制回Deque。    Deque的中控器   deque是连续空间?不,这只是假象,是设计者故意设计成其看上去是连续的。其实内部只是局部连续,deque本身由一段一段的定量连续空间构成。一旦有必要在deque的前端或后端增加新空间,便配置一段定量连续空间,串接在整个deque的头端或尾端。deque的最大任务, 便是在这些分段的定量连续空间上,维护其整体连续的假象,并提供随机存取的接口。

Python的迭代器和生成器详解

こ雲淡風輕ζ 提交于 2019-12-03 03:31:24
我们说Python是一门高效的语言,在于它内置的一些变量访问模式——其中迭代器和生成器,可以算是Python的特色了,功能强大,用起来很爽 迭代器(Iterator) 迭代器简介 迭代器(iterator)也成游标(cursor),是实现了迭代操作的对象,通过迭代器开发人员可以不同知道容器内部的详细情况而在容器(如链表、矩阵)上进行遍历 它是一个带状态的对象;在调用next()函数的时候返回容器的下一个值, 任何实现了__iter()__和__next()__方法的对象都是迭代器 ,__iter()__返回迭代器自身,__next()__返回容器的下一个值,如果容器没有更多的元素,就抛出StopIteration异常——所以说,迭代器是一个实现了工厂模式的对象 迭代器的好处总结起来八个字: 延迟计算,按需调用 Python内置的 iter() 函数用于生成一个迭代器,其中括号内参数可以是字符串、列表、或者元祖(它们都是可迭代对象,即可以用for..in语句进行遍历的对象) i = iter( "Hello" ) 使用 next() 函数对迭代器进行遍历 >>> next (i) H >>> next (i) e itertools模块 Python内指了一个很有意思的支持迭代的工具模块:itertools,该模块提供的全部是处理迭代功能的函数,它们的返回值不是list而是迭代对象

浅析 python 迭代器与生成器

此生再无相见时 提交于 2019-12-03 03:25:14
转载自我自己的 github 博客 ——> 半天钟的博客 要这篇博文有何用? 这篇博文是用于帮助理解 python 可迭代对象、迭代器与生成器的 ,你在阅读后应该能够比较清晰的理解 python 中迭代相关的概念与流程。 这篇博文能够解答: 在 python 中究竟什么是 迭代 ? 什么是 可迭代的对象 ,为什么 python 的序列类型的对象均可迭代? 迭代器 是啥?它和可迭代对象有什么关联? 生成器 又是啥? 生成器和迭代器有什么区别? 迭代的概念简述 循环就是迭代吗? 答:不是,但是迭代与循环有着千丝万缕的联系。 迭代是一个做有限次或者 “无限次” 重复动作的过程 、在这个过程里上一次重复动作的 结束状态 是下一次重复动作的**开始状态。**每一次重复都可以称之为一次迭代。 相比于单纯的循环、迭代有一个 额外的限制条件 —— 必须存在着 记录状态 的记录员,用来保存上一次迭代的结束状态。 下面这个代码说明了循环和迭代的区别,其中模拟的迭代过程中的变量 i 就是记录员: #单纯的循环 while True : print ( 'This is Loop' ) #模拟的迭代过程 i = 0 while True : print ( 'This is iter of No.' + str ( i ) ) i += 1 结果: #单纯的循环 This is Loop This is

Python中生成器和迭代器的区别

我的未来我决定 提交于 2019-12-03 03:24:39
Python中生成器和迭代器的区别(代码在Python3.5下测试): Num01–>迭代器 定义: 对于list、string、tuple、dict等这些容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数。iter()是python内置函数。 iter()函数会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内的元素。next()也是python内置函数。在没有后续元素时,next()会抛出一个StopIteration异常,通知for语句循环结束。 迭代器是用来帮助我们记录每次迭代访问到的位置,当我们对迭代器使用next()函数的时候,迭代器会向我们返回它所记录位置的下一个位置的数据。实际上,在使用next()函数的时候,调用的就是迭代器对象的 _next_ 方法(Python3中是对象的 _next_ 方法,Python2中是对象的next()方法)。所以,我们要想构造一个迭代器,就要实现它的 _next_ 方法。但这还不够,python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现 _iter_ 方法,而 _iter_ 方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的 _iter_ 方法返回自身self即可。 一些术语的解释: 1,迭代器协议:对象需要提供next()方法,它要么返回迭代中的下一项