1. 学大数据需要什么基础
其实笼统地说大数据原理和基础都在数学这边,当然有很多偏应用和软件使用的技术,例如“深度学习调参”等,这些报个培训速成班就能学会的技术含量不那么高的东西,不在讨论范围内。
深度学习:目前非常火,打败了非常多几十年积累起来的经典方法。
增强学习:也很火,游戏AI、自动驾驶、机器人等等,它都是核心。
概率图模型:深度学习之前非常popular的“学习”方法,有严格的数学模型和优美的算法,虽然目前被前俩者盖过了风头,但是依然有它的立足之处。
再比如有用偏微分方程做图像处理的(比较小众),那么这时候你肯定要去学一下偏微分方程了,大都是以科研为主导的。
2. 启发式算法
什么是算法?从枚举到贪心再到启发式(上)
目标 :要优化的东西
决策 :根据目标做出的决策
约束 :进行决策时必须遵循的条件
算例 :问题参数的具体化
枚举法 :将问题所有的解一一枚举出来,挨个去评价,选出最好的那个
1.枚举法能够找到问题的最优解
2.枚举法求解时间随问题规模增长而呈爆炸式增长
贪心法 :利用“构造”的方式生成解,速度相对而言会非常快,同时不会随着问题规模的增长而大幅度增加,是平缓的线性增长
什么是算法?从枚举到贪心再到启发式(下)
启发式算法 :在一个合理的求解资源范围内(合理的时间,合理的内存开销等)求得一个较为满意的解。目前主要包括邻域搜索和群体仿生两大类。
解空间 :所有该问题的解的集合,包括可行解和不可行解
局部搜索 :不完全遍历解空间,只选择一部分进行遍历,进而大大降低搜索需要的资源。为了提高局部搜索的质量,大部分局部搜索算法都会在搜索的时候不断地抓取多个区域进行搜索,直到满足算法终止条件。
邻域 :在邻域结构定义下的解的集合,它是一个相对的概念,即邻域肯定是基于某个解产生的
邻居解 :邻域内某个解的称呼
邻域结构 :定义了一个解的邻域
邻域结构的设计在启发式算法中非常重要,它直接决定了搜索的范围,对最终的搜索结构有着重要的影响,直接决定了最终结果质量的好坏
搜索过程
不断重复步骤2-步骤5,直到满足终止条件,最后输出全局最优解
所有的启发式找到的都是满意解,不能说是最优解(即便真的是),因为它遍历的是解空间的局部。
一般情况下,启发式算法的时间是随着问题规模增长而呈线性增长的
干货 | 想学习优化算法,不知从何学起?
邻域搜索类
迭代局部搜索算法
模拟退火算法
变邻域搜索算法
禁忌搜索
自适应大邻域搜索
群体仿生类
遗传算法
蚁群算法
粒子群算法
人工鱼群算法
算法应用
禁忌搜索算法求解带时间窗的车辆路径问题
基于树表示法的变邻域搜索算法求解考虑后进先出的取派货旅行商问题
变邻域搜索算法求解Max-Mean dispersion problem
遗传算法求解混合流水车间调度问题
3. python多个起点不交叉最短路径
1 针对给定的多个起点和终点,如果要求起点之间不交叉,那么存在最短运禅路径。
2 因为起点之间不交叉,可以将问题简化为多个单起点单终点的问题,可以使用 Dijkstra 算法或者 A* 算法等察汪求解最短路径的算法。
3 如果需要考虑多个起点之间的交叉情况,可以考虑使用遗传算法等旁没尘启发式算法,不过这样的算法复杂度较高,需要更长的计算时间。
4. 在大学想要学习编程,可以通过哪些途径进行学习
一、先知道编程能帮我们干什么
二、再明确自己要拿编程做什么
编程能做什么,要学到什么程度,其实我在上文说的已经比较明白了。
自学编程大概两个阶段:
打基础,至少学懂一门语言,推荐拿C/C++入门(为了学到一些指针与面向对象的知识),拿Python入门也可,但你会发现面向对象在Python教学中可能不被强调,因为Python自带的工具已经很强大;
不推荐拿java入门,因为Java实在是开发者用的语言,其魅力在于接口、程序设计,想拿Java入门,不如拿C/C++入门;
编程之理,一通百通。第二个阶段,就是多多实践、持续学习,在自己的领域探索下去:
如果你要搞数据科学、打数据比赛,就去多用熟悉python中的pandas、sklearn库等等;
如果想做线性求解,先找几个简单的java+线性求解器例子动手复现下来,读懂每行代码的作用,在过程中积累;
5. python实现M-C问题的A*算法,采用h(n)=m+c-2b(或具有更多启发信息的)作为启发
M-C问题是一个经典的人工智能问题,它描述了一个传教士和食人族的河岸过河问题。A*算法是一种启发式搜索算法,它可以找到从初始状态到目标状态的最优路径。A*算法的核心是使用一个函数f(n)来评估每个状态的优先级,f(n)等于g(n)和h(n)的和,其中g(n)是从初始状态到当前状态的实际代价,h(n)是从当前状态到目标状态的预估代价。h(n)越接近真实代价,A*算法越有效。
为了用Python实现M-C问题的A*算法,我们需要定义以下几个部分:
- 状态:一个状态是一个三元组(m, c, b),型腔表示河的左岸有m个传教士,c个食人族,b为1表示旅唯船在左岸,为0表示船在右岸。
- 初始状态:(3, 3, 1),表示左岸有3个传教士,3个食人族,船在左岸。
- 目标状态:(0, 0, 0),表示左岸没有传教士,没有食人族,船在右岸。
- 操作:一个操作是一个二元组(x, y),表示从当前岸向另一岸运送x个传教士,y个食人族,满足以下条件:
- 0 <= x <= 1,0 <= y <= 2,x + y <= 2,x + y > 0,表示每次最多运送两个人,最少运送一个人,可以是传教士或者食人族。
- 如果b为1,表示船在左岸,那么m >= x,c >= y,表示不能运送超过当前岸的人数。
- 如果b为0,表示船在右岸,那么m <= 3 - x,c <= 3 - y,表示不能运送超过另一岸的人数。
- 在任何一岸,传教士的人数不能少于食人族的人数,除非传教士的人数为0,表示不会被吃掉。
- g(n):从初始状态到当前状态的实际代价,可以简单地定义为已经运送的人数。
- h(n):从当前状态到目标状态的预估代价,可以根据题目给出的公式定义为h(n) = m + c - 2b,或者使用其他更有启发性的公式,例如h(n) = max(m, c) - b,表示至少需要运送的次数。
Python代码实现:
```python
# 定义状态类
class State:
def __init__(self, m, c, b):
self.m = m # 左岸的传教士数
self.c = c # 左岸的食人族数
self.b = b # 船的位置,1为左岸,0为右岸
def __eq__(self, other):
# 判断两个状态是否相等
return self.m == other.m and self.c == other.c and self.b == other.b
def __hash__(self):
# 为了将状态作为字典的键,需要定义哈希函数
return hash((self.m, self.c, self.b))
def __str__(self):
# 为了方便打印状态卜镇衫,需要定义字符串表示
return f"({self.m}, {self.c}, {self.b})"
def is_valid(self):
# 判断一个状态
6. 谁能详细介绍一下启发式算法的原理或者方法
整数规划一般是不容易得到最优解的。启发式算法可以在合理的计算时间内得到较解。局域搜索启发式算法应用广泛。局域搜索的一般步骤如下: 从一个初始可行解出发 找出相邻的可行解 从相邻的可行解中找出更好的可行解 地,局域搜索启发式算法会得到一个局部最优解,而这个局部最优解有时就是全局。算法的好与坏都决定于步骤 3。 1.1 模拟退火方法 相邻元素是随机选择的,选上的概率为pn , pn= 1∑。移动的决策取n∈ N标成本和退火概率: c(y)?c(x)??py(x)?eTc(y)φ c(x) pxy= ? ?py(x)?Ct温度梯度是根据一定的规则选择的,比如T (t) =T t() = Calog t或, a π 1。