常用算法——枚举算法

article/2025/8/23 14:34:49

    在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做枚举算法

一、基本概念和算法

    枚举算法简称枚举法,也称为列举法、穷举法,是暴力策略的具体体现,又称为蛮力法。

    枚举法的基本思想是:逐一列举问题所涉及的所有情形,并根据问题提出的条件检验哪些是问题的解,哪些应予排除。

  • 枚举的意义

1) 可以充分利用计算机的速度,解决一些常见问题

2) 如果问题的规模不大,使用枚举,运算速度是可以接收的。

3) 枚举可作为某类问题时间性能的底线,用来引出同样问题的更高效率的算法。

  • 枚举的实施步骤(算法)

1) 根据问题的具体情况确定枚举量(简单变量或数组)

2) 根据问题的具体清空确定枚举范围,设置枚举循环

3) 根据问题的具体要求确定筛选(约束)条件

4) 设计枚举程序并运行、调试,对运行结果进行分析与讨论。

二、判断阿姆斯特朗数

    例1 求三到十位的“阿姆斯特朗数”。

    所谓“阿姆斯特朗数”是指一个三位数及以上的数,其各位数字的位数次方和等于其本身。例如:153是一个阿姆斯特朗数,因为

    153=1^{3}+5^{3}+3^{3}

    472335975是一个阿姆斯特朗数,因为

    472335975=4^{9}+7^{9}+2^{9}+3^{9}+3^{9}+5^{9}+9^{9}+7^{9}+5^{9}

    其中不同位数的阿姆斯特朗数也有别名,如三位的阿姆斯特朗数也叫“水仙花数”,七位的阿姆斯特朗数也叫“北斗七星数”等。

    那么这道题的取值范围即100-10000000000(10^{10},不含),条件限制为各位数字的位数次方和等于其本身。

    如何取各位数字

    可用整除、取余获取各位数字,但位数不定不好处理,故可以转化为字符串,求长度(次方数),取字符串元数(每一位数)。

    数值转为字符串的语法格式为:

str(数值表达式)

    转换后,正数不含符号位,字符串为序列,每个字符为元素。

    f格式化字符串:f-string采用{content:format}设置字符串格式,其中content是替换并填入字符串的内容,可以是变量、表达式或函数等,format是格式描述符。采用默认格式时不必指定 “:format”。其语法格式为:

f'{字符串/变量:格式}'

其中:大括号前、后:可以放任何字符串,它们将直接显示在结果中;大括号内:目标字符串+目标格式;冒号前:需要格式化的原始字符串或变量,冒号后:需要的目标格式(缺省用默认格式)

完整程序如下:

for i in range(100,10**10):  # 不含10**10,终值为9999999999s = 0                # 求和初值取“0”n = len(str(i))      # 获取数值i的位数for j in str(i):     # str(123)='123',则j='1','2','3's += int(j) ** n # 求各位数的n次方和if s == i:           # n位阿姆斯特朗数的判断条件print(f'{n}位阿姆斯特朗数:', i)

执行结果:

    此程序虽然简单,但输出效果不是很理想,同样位数的阿姆斯特朗数没有显示在同一行中。此程序涉及100亿次的10位100亿次方数和运算,所以会耗费数小时(7位前耗时数秒,8位前耗时1~2分,9位前耗时数10~30分)

    下面对程序进行改进,将不同位数的阿姆斯特朗数标上“别名”,并将相同位数的阿姆斯特朗数显示在同一行中,但耗时基本不变。下面的程序中用到了三元表达式。

    三元表达式又称三元运算符,Python中三元表达式的语法格式为:

表达式1 if 条件表达式 else 表达式2

    当“条件表达式”为True时,返回结果为“表达式1”,否则返回结果为“表达式2”。

    获取字典“键”的列表的语法格式为:

list(字典.keys())

    完整程序如下:

ArmstrongNum = {'三':'水仙花','四':'四叶玫瑰','五':'五角星','六':'六合','七':'北斗七星','八':'八仙','九':'九九重阳','十':'十全十美'}
for i in range(2,10):print(f'{list(ArmstrongNum.keys())[i-2]}位的'f'{ArmstrongNum[list(ArmstrongNum.keys())[i-2]]}数:', end='')m = 0for j in range(10**i, 10**(i+1)):	# 1后跟i个0到 i+1个9n = len(str(j))					# n = i + 1,数值j的位数s = 0for k in str(j):				# str(123)='123',k='1','2','3's += int(k) ** n			# 求各位的n次方和if s == j:						# n位阿姆斯特朗数的判断条件print(j if m==0 else f', {j}', end='')m += 1print()

执行结果:

三、解百鸡问题

    我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱百鸡,问鸡翁鸡母鸡雏各几何?

    例2 百鸡问题:(白话文翻译)有一个人有一百个钱,打算买一百只鸡。到市场一看,公鸡五个钱一只,母鸡三个钱一只,小鸡一个钱三只,怎么样买法,才能刚好用一百个钱买一百只鸡?。现在,请你编一程序,帮他计划一下。

    注意:鸡都是整只的,钱总数也是整数。因为买公鸡和母鸡花费的钱为整数,所以买小鸡的钱也必须是整数,因此小鸡数为3的倍数。

    设公鸡数为rooster,母鸡数为hen,则小鸡数为

chicken = 100-rooster-hen

    一百个钱最多买20只公鸡,一百个钱最多买33只母鸡。具体程序代码如下:

for rooster in range(21):			# 公鸡0~20,不包含21for hen in range(34):			# 母鸡0~33,不包含34chicken = 100-rooster-hen	# 求小鸡数if rooster * 5 + hen * 3 + chicken/3 == 100:print(f'公鸡{rooster}只+母鸡{hen}只+小鸡{chicken}只=100只鸡。')

输出结果为:

 

程序优化:

    思路:设公鸡数为x,母鸡数为y,小鸡数为z,则

    

    两方程三变量,不能直接求解,属不定方程

    程序每使用一个for(x)循环,就相当于将一个未知数(x)变成已知数(x), 两个方程两个未知数,方程就具有可解性了,这样就可以, 继续减少一个循环的嵌套。则解方程①②得

    

可用一个循环求解问题。

for x in range(21):							# 0~20,不包含21。公鸡数不会超过20y = int(25-7*x/4) if 25 >= 7*x/4 else 0	# 先求y(母鸡数为整数且大于等于0)z = 100-x-y								# 再求zif x * 5 + y * 3 + z / 3 == 100:print(f'公鸡{x}只+母鸡{y}只+小鸡{z}只=100只鸡。')

输出结果为:


http://chatgpt.dhexx.cn/article/01UHlSLO.shtml

相关文章

枚举算法

一、枚举法的基本思想 枚举法又称穷举法。 基本思想是根据提出的问题枚举所有可能状态,并用问题给定的约束条件检验哪些状态是需要的,哪些状态是不需要的。 能使命题成立的状态,即为其解。 枚举结构:循环判断语句。 二、枚举…

传统人工势场法---经典算法

网上代码很多,这个可以直接使用。 Xo[0 0];%起点位置 k50;%计算引力需要的增益系数 K0;%初始化 m15;%计算斥力的增益系数,都是自己设定的。 Po0.5;%障碍影响距离,当障碍和车的距离大于这个距离时,斥力为0,即不受该障碍…

人工势场法(APF) —— Path Planning

版权声明:本文为博主原创博文,未经允许不得转载,若要转载,请说明出处并给出博文链接 维基百科说:“人工势场法(Artificial Potential Field, APF)是一种将机器人的外形视为势场中的一…

基于人工势场法的移动机器人路径规划研究(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 路径规划是移动机器人领域的热点研究方向,人工势场法已在工业机器人路径规划中得到广泛应用,近年来正逐…

11(0)-AirSim+四旋翼仿真-人工势场法避障

1.基本原理 人工势场法的基本原理为,根据地图内障碍物、目标点等的分布,构造一个人工势场,无人机由势能较高的位置向势能较低的位置移动。就好比是一个电场,电场内不同位置的电势能不同,对带电物体产生的力也不同&…

局部路径规划中的人工势场法

人工势场法是局部路径规划的一种比较常用的方法。这种方法假设机器人在一种虚拟力场下运动。 一、简介 如图所示,机器人在一个二维环境下运动,图中指出了机器人,障碍和目标之间的相对位置。 这个图比较清晰的说明了人工势场法的作用&#…

matlab箭头梯度方向场,局部路径规划算法——人工势场法

人工势场法是由Khatib于1986年提出,其方法是将移动机器人所处的环境用势场来定义,通过位置信息来控制机器人的避障行驶,基本思想是构造目标位姿引力场和障碍物周围斥力场共同作用的人工势场,搜索势函数的下降方向来寻找无碰撞路径。人工势场法避障技术使得机器人的移动能很…

基于人工势场法的车辆编队轨迹规划matlab仿真验证

给出了完整的MATLAB代码仿真;基于人工势场法编队的基本原理:通过构建车辆相对目标点的引力势场和斥力势场构建车辆所处地图下的整体势场,设置如图所示的势场图, 图中圆心为我们参考的目标点,其可以提供引力方向&#x…

基于人工势场法的二维平面内无人机的路径规划的matlab仿真,并通过对势场法改进避免了无人机陷入极值的问题

目录 1.算法描述 2.matlab算法仿真效果 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 人工势场法原理是:首先构建一个人工虚拟势场,该势场由两部分组成,一部分是目标点对移动机器人产生的引力场,方向由机器人指向目标点&#xf…

matlab人工势场法三维演示图,运动规划入门 | 5. 白话人工势场法,从原理到Matlab实现...

如何利用人工势场进行运动规划? 1.1 引力势场(Attractive Potential Field) 人工势场这个特殊的势场并不是一个单一的场,其实它是由两个场叠加组合而成的,一个是引力场,一个是斥力场。 顾名思义引力势场是具有吸引的性质,会将机器人从起点处朝着终点处吸引,所以引力场的存…

路径规划算法3 改进的人工势场法(Matlab)

目录 传统人工势场 引力势场 斥力势场 合力势场 传统人工势场法存在的问题 改进的人工势场函数 Matlab代码实现 参考链接: [1]朱伟达. 基于改进型人工势场法的车辆避障路径规划研究[D]. 江苏大学, 2017. 1986年Khatib首先提出人工势场法,并将其应用在…

【控制】人工势场法及人工势场函数

目录 人工势场法-维基百科路径规划-人工势场法(Artifical Potential Field)引力场 (attractive/gravitation field)斥力场 (repulsive field)总场 【机器人路径规划】人工势场法PaperMatlab 代码自己编写的 Matlab1. 仅考虑引力的情况 人工势场法-维基百…

移动机器人路径规划:人工势场法

人工势场法是一种原理比较简单的移动机器人路径规划算法,它将目标点位置视做势能最低点,将地图中的障碍物视为势能高点,计算整个已知地图的势场图,然后理想情况下,机器人就像一个滚落的小球,自动避开各个障…

人工势场法matlab讲解_【机器人路径规划】人工势场法

阅读本文需要的基础知识为: 理解机器人的构型空间。建议阅读:机器人运动规划中的C space怎样理解?为什么不直接在笛卡尔坐标系下运算呢? 本文的实现程序与使用说明见我的学习工具箱:小明工坊:【个人开源】机器人运动规划学习工具箱使用说明 基本原理 1.概述 我们打两个比…

学习笔记:人工势场法

一、算法简介 1986年Khatib首先提出人工势场法,并将其应用在机器人避障领域,而现代汽车可以看作是一个高速行驶的机器人,所以该方法也可应用于汽车的避障路径规划领域。 二、算法思想 1、人工势场法的基本思想是在障碍物周围构建障碍物斥力…

人工势场法matlab讲解,传统人工势场法(matlab)

【实例简介】 人工势场法路径规划是由Khatib提出的一种虚拟力法(Oussama Khatib,Real-Time obstacle Avoidance for Manipulators and Mobile Robots. Proc of The 1994 IEEE.)。它的基本思想是将机器人在周围环境中的运动,设计成一种抽象的人造引力场中的运动,目标点对移动…

路径规划-人工势场法(Artifical Potential Field)

人工势场法是局部路径规划的一种比较常用的方法。这种方法假设机器人在一种虚拟力场下运动。 一、简介 如图所示,机器人在一个二维环境下运动,图中指出了机器人,障碍和目标之间的相对位置。 这个图比较清晰的说明了人工势场法的作用&#…

人工势场法

文章目录 前言一、人工势场法二、简要理解 1.示例2.代码总结 前言 路径规划是移动机器人领域的一个重要组成部分,传统的路径规划代表算法包括 A*算法、Dijkstra 算法、人工势场法以及仿生学的蚁群算法。人工势场法是机器人路径规划算法中一种简单有效的方法。人工势…

路径规划-人工势场法(Artificial Potential Field)

人工势场法是局部路径规划的一种比较常用的方法。这种方法假设机器人在一种虚拟力场下运动。 1. 简介 如图所示,机器人在一个二维环境下运动,图中指出了机器人,障碍和目标之间的相对位置。 这个图比较清晰的说明了人工势场法的作用&#xf…

路径规划算法3.1 人工势场法APF

路径规划算法3.1 人工势场法APF 前言电场与电势场人工势场人工势场的构建梯度下降与局部最小问题后记 前言 人工势场法APF(Artificial Potential Field),是非场经典的寻路方法,常用于移动机器人的局部路径规划,其主要思想是通过目标的引力与…