回溯 皇后 算法笔记_游戏的选项如何选择?算法可以帮你这个忙

算法是程序的支柱,继上一篇的穷举法贪婪法之后,我们来继续来了解和学习新的算法。

分治法

在一些实际场景当中,经常会出现一些复杂算式,它是由多个简单问题合成而来的,计算机并不能直接得出确定的答案,分治法非常适合于这类问题。

举个例子,想造一辆汽车,汽车由一个个零件组成,想要造出一辆汽车必须将其组成的各个部分全部装好,然后才能造出一辆汽车。

1b92bb56daa8bf764077c8f154571c59.png

分治法的原理就是把一个难题分解为一个个计算机可以直接解答的问题,然后把子问题的解代回原式,最后得出答案

下面就是一个使用分治法进行运算的代码,这个代码实现的功能是将一组数字当中,选定任意数字,以其为基准,左边都是比它小的。右边都是比它大的。

代码如下:

def quick_sort(origin_items, comp=lambda x, y: x <= y):

items = origin_items[:]

_quick_sort(items, 0, len(items) - 1, comp)

return items

def _quick_sort(items, start, end, comp):

if start < end:

pos = _partition(items, start, end, comp)

_quick_sort(items, start, pos - 1, comp)

_quick_sort(items, pos + 1, end, comp)

def _partition(items, start, end, comp):

pivot = items[end]

i = start - 1

for j in range(start, end):

if comp(items[j], pivot):

i += 1

items[i], items[j] = items[j], items[i]

items[i + 1], items[end] = items[end], items[i + 1]

return i + 1

回溯法

回溯法的原理可以这样理解,在一些游戏关卡当中会出现选项分支,选择当中提供了两个或者多个选项,当玩家选择了其中一个选项之后,发现这个选项带来的游戏体验并不好。

ca8bf4e191c0a81d5d884f1c22b66db4.png

于是,玩家退回了选择界面选择其他选项。若是其他选项带来的游戏体验也不好,那么就在这些选项当中选择游戏体验相对体验较好的选项,继续进行游戏进程。

回溯法就是这样的一个操作原理,在诸多选择分支当中,选择任一选项进行运算,若是得出的答案不够好,则退回分支选项重新选择,直到得出最好的答案。

关于回溯算法,有一个非常有意思的问题:

八皇后问题。

adc5e63980f61e938c96d875e8b8c2c5.png

八皇后问题,是一个著名的问题,是回溯算法的典型案例。该问题是西洋棋棋手马克斯·贝瑟尔1848年提出:在8×8格的西洋象棋上摆放八个皇后,使其之间不能直接互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

5188903b2bac4ca27b71fe2b28414a31.png

这个问题就应用了回溯算法,具体实现代码如下:

def queen(A, cur=0):

if cur == len(A):

print(A)

return 0

for col in range(len(A)):

A[cur], flag = col, True

for row in range(cur):

if A[row] == col or abs(col - A[row]) == cur - row:

flag = False

break

if flag:

queen(A, cur+1)

queen([None]*8)

实际上,上面所说的两种算法都涉及到一个思想:动态规划

动态规划的基本思想就是将待求解问题分解为若干个子问题,先将子问题的答案求出保存,然后再进行其他子问题的运算,有效的规避了重复计算的出现。

在实际的开发场景中,动态规划是解决问题的一个优良思想。如果在开发当中并未应用动态规划思想,结果可能会产生大量无用的重复运算,浪费了计算机的算能力。

在这方面可以用很简单的例子来说明,就比如上述的两个算法当中,如果代码并未采用动态规划思想,可见的代码量增加,BUG出现几率直线上升,实际上线后,程序员的工作量一半就要在找BUG修复BUG当中度过了。

算法方面的学习就此告一段落了。

在这里还是想说一句,学习新知识,尤其像编程这种实践性非常强的知识,大量的实践是必不可少的,想要在今后的职场中获得一份不错的报酬,扎实的基本功是必不可少的。

毕竟,纸上得来终觉浅得知此事要躬行

如果想学习更多科技知识,可以点击关注

如果对文章中的内容有什么困惑的地方,可以在评论区提出自己的问题,学记同大家一起交流,解决各种问题,一起进步。

青年学记 陪伴着各位青年

cf1df36b6887e0d9aca2849c59477c50.png

作者:青年学记 一名不断进步的程序

一起学习 一起进步

走向自立

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值