python算法

用Python解决TSP问题(1)――贪心算法

匿名 (未验证) 提交于 2019-12-02 22:54:36
文章源码在Github:https://github.com/jinchenghao/TSP 关于TSP问题网上有很多介绍,这里再简单描述一下。旅行商问题(TravelingSalesmanProblem,TSP)一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要遍历所有城市一次且只能一次,回到出发地。应如何选择行进路线,以使总的行程最短。目前解决TSP问题的方法有许多种,比如:贪心算法、动态规划算法、分支限界法;也有智能算法,比如:蚁群算法、遗传算法、A*等。由于网上使用python解决这类问题的比较少,所以我会用python实现这些算法。本文先介绍贪心算法: 数据格式 数据格式如下: 城市 X Y City1 100 200 City2 150 200 City3 345 313 ... 即输入的数据有3列,第一列是城市编号,第二列和第三列是城市坐标(x,y)。 算法简介 贪心算法非常容易理解,是一种解决实际问题中的常用方法,经常用来和其他算法进行比较。所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性

查找Python包的依赖包(语句)

匿名 (未验证) 提交于 2019-12-02 22:54:36
Window 10家庭中文版,Python 3.6.4, 于是,就有了一段200来行的程序和本文了。 功能名称: 查找Python包的依赖包(语句) 功能介绍: 找到Python包(包括子目录)中所有Python语句中的from、import语句,from语句获取import前面的部分,import语句获取整行。 使用方法: 使用 包的绝对路径 建立类 ModuleYilai(模块依赖) 的实例,然后调用实例方法yilais就可以获得Python包的依赖包呢,以列表形式返回。 程序介绍: class ModuleYilai 查找包依赖类; def ispackage(dirpath) 检查文件夹是否是Python包,判断是否含有__init__.py文件; def get_all_dirs(dirpath, level=True) 获取给定dirpath目录及其子目录的绝对路径的列表,level为True时包含目录本身;用到了递归,内部使用时,level为False; def get_all_pyfiles(dirpath) 获取目录下的所有Python文件(*.py); def get_pyfile_yilais(pyfile) 获取Python文件中所有的from子句、import子句; 需要说明的是,在建立正则表达时是,会忽略了from子句、import子句位于文件开头的情况

python五子棋--博弈树

匿名 (未验证) 提交于 2019-12-02 22:54:36
from graphics import * from math import * import numpy as np def ai(): """ AI计算落子位置 """ maxmin(True, DEPTH, -99999999, 99999999) return next_point[0], next_point[1] def maxmin(is_ai, depth, alpha, beta): """ 负值极大算法搜索 alpha + beta剪枝 """ # 游戏是否结束 | | 探索的递归深度是否到边界 if game_win(list1) or game_win(list2) or depth == 0: return evaluation(is_ai) blank_list = list(set(list_all).difference(set(list3))) order(blank_list) # 搜索顺序排序 提高剪枝效率 # 遍历每一个候选步 for next_step in blank_list[0:60]: # 如果要评估的位置没有相邻的子, 则不去评估 减少计算 if not has_neightnor(next_step): continue if is_ai: list1.append(next_step) else: list2.append

社会网络分析与挖掘---Python之networkx介绍

匿名 (未验证) 提交于 2019-12-02 22:54:36
最近学习社会媒体挖掘,需要完成几个实验,Python的第三方模块networkx几乎都囊括了这些实现的接口,Python的好处就是开源,所以它的第三方模块的源码都可以看到,我看了实现的源码做了部分修改,算是完成了实验。下面对这个库做一些介绍。 1. introduction networkX是一款Python的软件包,用于创造、操作复杂网络,以及学习复杂网络的结构、动力学及其功能。 有了networkX你就可以用标准或者不标准的数据格式加载或者存储网络,它可以产生许多种类的随机网络或经典网络,也可以分析网络结构,建立网络模型,设计新的网络算法,绘制网络等等。 2. install 对于已经装了pip的环境,安装第三方模块很简单,只需要pip install networkx即可。没有安装pip环境的机器可以先安装pip,Python3默认都是安装了pip的。 3. tutorial Creating a graph 创建一个空图,不包含任何结点和边。 import networkx as nx G = nx. Graph () 图是顶点集和确定的顶点之间的边集组成。在NetworkX中,顶点可以是任何可以哈希的对象,比如文本,图片,XML对象,其他的图对象,任意定制的节点对象,等等。(Python中的None对象不可以作为结点类型。) Nodes 图的增长有几种方式

python作业之sklearn

匿名 (未验证) 提交于 2019-12-02 22:54:36
题目: 1 Create a classification dataset (n samples 1000, n features 10) 2 Split the dataset using 10-fold cross validation 3 Train the algorithms GaussianNB SVC (possible C values [1e-02, 1e-01, 1e00, 1e01, 1e02], RBF kernel) RandomForestClassifier (possible n estimators values [10, 100, 1000]) 4 Evaluate the cross-validated performance Accuracy F1-score AUC ROC 5 Write a short report summarizing the methodology and the results from sklearn import datasets,cross_validation from sklearn.naive_bayes import GaussianNB from sklearn.svm import SVC from sklearn.ensemble import RandomForestClassifier

Python学习之路25-使用一等函数实现设计模式

匿名 (未验证) 提交于 2019-12-02 22:54:36
《流畅的Python》笔记。 本篇主要讲述Python中使用函数来实现策略模式和命令模式,最后总结出这种做法背后的思想。 策略模式如果用面向对象的思想来简单解释的话,其实就是“多态”。父类指向子类,根据子类对同一方法的不同重写,得到不同结果。 下图是经典的策略模式的UML类图: 《设计模式:可复用面向对象软件的基础》一书这样描述策略模式: 定义一系列算法,把它们封装起来,且使它们能相互替换。本模式使得算法可独立于使用它的客户而变化。 下面以一个电商打折的例子来说明策略模式,打折方案如下: 有1000及以上积分的顾客,每个订单享5%优惠; 同一订单中,每类商品的数量达到20个及以上时,该类商品享10%优惠; 订单中的不同商品达10个及以上时,整个订单享7%优惠。 为此我们需要创建5个类: Order 类:订单类,相当于上述UML图中的 Context 上下文; Promotion 类:折扣类的父类,相当于UML图中的 Strategy 策略类,实现不同策略的共同接口; 具体策略类: FidelityPromo , BulkPromo 和 LargeOrderPromo 依次对应于上述三个打折方案。 以下是经典的策略模式在Python中的实现: from abc import ABC , abstractmethod from collections import namedtuple

Python3.7官方向导翻译之Python类

匿名 (未验证) 提交于 2019-12-02 22:54:36
类提供了将数据和功能捆绑在一起的手段。 创建一个新类创建一个新类型的对象,允许创建该类型的新实例。 每个类实例都可以附加属性以保持其状态。 类实例也可以有方法(由其类定义)来修改其状态。 与其他编程语言相比,Python的类机制为类添加了最少量的新语法和语义。 它是C ++和Modula-3中的类机制的混合体。 Python类提供了面向对象编程的所有标准功能:类继承机制允许多个基类,派生类可以重写其基类或类的任何方法,并且方法可以调用具有相同名称的基类的方法。 对象可以包含任意数量和种类的数据。 与模块一样,类也具有Python的动态特性:它们是在运行时创建的,并且可以在创建后进一步修改。 **在C++术语中,通常类成员(包括数据成员)是公有的(例外见下面的Privat Variables),并且所有的成员函数都是虚的(virtual)。和Modula-3中一样, 没有快捷的办法从对象的方法中来引用对象的成员:方法的第一个显示函数代表了对象本身,对对象本身的调用是隐式的。和Smaltalk中一样,类本身也是对象。 这为导入和重命名提供了语义。不像C++和Modula-3,内置类型可以作为基类来扩展。同样,和C++中的一样,大部分内置操作符有特殊的语法(算术操作符, 下标等),它们可以在类实例中重定义。** (由于缺乏普遍接受的术语来讨论类,我偶尔会使用Smalltalk和C +

七种经典排序算法python实现

匿名 (未验证) 提交于 2019-12-02 22:51:30
最近要考算法设计,所以把排序算法总结一下。经典的排序算法包括:冒泡排序,选择排序,插入排序,快速排序,归并排序,堆排序和希尔排序。全部程序都用python3实现,默认从小到大排序。 参考文章:https://blog.csdn.net/ls5718/article/details/51809866,博主的文章里面有演示动图,不懂的时候可以看下动图。 介绍: 让两数比较大的值一直滚动到最右侧,类似泡泡一直往上飘,每次滚动都要进行比较 思路: 临近的数字两两进行比较,按照从小到大的顺序进行交换,这样一趟过去,最大的数字就被交换到了最后一位, 然后再从头开始两两比较交换,直到导数第二位时结束 步骤: 1、比较相邻的元素,如果前一个比后一个大,就交换它们两个 2、对第0个到第n-1个数据做同样的工作,这时,最小的数就会‘浮’到数组的最左边位置 3、对所以的元素重复上面的步骤,除了单一个 4、持续每次对越来越少的元素重复上面的步骤,知道没有任何一个数字需要比较 时间复杂度: O(n**2) 如果未优化的冒泡排序,最好的情况也是O(n**2),优化后的最好情况是O(n) 具体代码: 介绍: 保持最小元素在最左侧,用最左侧的元素依次和右边的元素比较,谁小谁放在左边。 思路:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子序列前面,直到全部记录排序完毕 步骤:1

Python递归函数的正确理解与使用

匿名 (未验证) 提交于 2019-12-02 22:51:30
先看一个题目: 题面描述 小明很喜欢学数学,并且喜欢做一些奇怪的题,这天他想知道对于给定的 N ,有多少个 M 满足“ M<=N, gcd(N,M)==1, M 是偶数”。请你编写程序帮助小明解决这个问题。 输入数据 输入数据第一行为一个正整数 T ,表示测试数据的组数。 接下来的 T 组测试数据中, 每组测试数据为一行,包含一个整数 N (1≤T≤100, 1≤N≤10000 )。 输出数据 对于每一组输入数据,在单独的一行中输出 ”Case #id: M”, 表示第 id 组数据结果是 M , id 从 1 开始; 样例输入 4 1 2 11 23 样例输出 Case #1: 0 Case #2: 0 Case #3: 5 Case #4: 11 Hint: gcd(a,b)==1 表示 a 与 b 的最大公约数为 1 ,即 a 与 b 互素。 讲讲算法思路 分析输入输出与显示 源代码与递归函数的精华所在 1.两个数互素:最小公约数为1。我们只要把大一点的数%较小的数,上一轮较小的数%这个余数又得到一个余数,每次判断这个余数是0还是1。只要有0出现就不互素。 2.输入用list[]保存。输出的序号可以在循环里面计数。输出赋值:print('Case #%d: %d'%(x,y)) 3. #求法,可能会用到函数,递归函数等 def gcd(x,y):#定义递归函数 if x>=y

python刷leetcode题目(1)

匿名 (未验证) 提交于 2019-12-02 22:51:30
1、从排序数组中删除重复项 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 给定数组 nums = [1,1,2] , 函数应该返回新的长度 2 , 并且原数组 nums 的前两个元素被修改为 1 , 2 。 你不需要考虑数组中超出新长度后面的元素。 给定 nums = [0,0,1,1,1,2,2,3,3,4] , 函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0 , 1 , 2 , 3 , 4 。 你不需要考虑数组中超出新长度后面的元素。 代码如下: class Solution: def removeDuplicates(self, nums): """ :type nums: List[int] :rtype: int """ i = 0 while i < len(nums) -1: if nums[i] == nums[i+1]: nums.remove(nums[i]) else: i += 1 return len(nums) 2、买卖股票的最佳时机 II i i 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意: 你不能同时参与多笔交易