强化学习玩21点

强化学习案例_强化学习系列案例 | 蒙特卡洛方法实现21点游戏策略 查看本案例完整的数据、代码和报告请登录数据酷客(cookdata.cn)案例板块。快速获取案例方式:数据酷客公众号内发送“强化学习”。蒙特卡洛方法(Monte Carlo method)是20世纪40年代中期提出的一种以概率统计为指导的重要数值计算方法。其名字来源于摩洛哥的赌城蒙特卡洛,象征着概率。蒙特卡洛方法在金融工程学,宏观经济学,计算物理学等领域应用广泛。本案例将介绍基于蒙特卡洛的... 阅读详情

sutton RL an introduction 2nd CH5例子
ref:
https://github.com/ShangtongZhang/reinforcement-learning-an-introduction/edit/master/chapter05/blackjack.py
本文解读整理上述示例代码

规则

21点(blackjack)是经典赌场游戏,玩的是在牌面和不超过21点的情况下尽可能大。牌面规定:Ace可以是1 或 11, J,Q,K均为10,无大小王。具体规则有很多种,书中规定如下:

The object of the popular casino card game of blackjack is to obtain cards the sum of whose numerical values is as great as possible without exceeding 21. All face cards count as 10, and an ace can count either as 1 or as 11. We consider the version in which each player competes independently against the dealer. The game begins with two cards dealt to both dealer and player. One of the dealer’s cards is face up and the other is face down. If the player has 21 immediately (an ace and a 10-card), it is called a natural. He then wins unless the dealer also has a natural, in which case the game is a draw. If the player does not have a natural, then he can request additional cards, one by one (hits), until he either stops (sticks) or exceeds 21 (goes bust ). If he goes bust, he loses; if he sticks, then it becomes the dealer’s turn. The dealer hits or sticks according to a fixed strategy without choice: he sticks on any sum of 17 or greater, and hits otherwise. If the dealer goes bust, then the player wins; otherwise, the outcome—win, lose, or draw—is determined by whose final sum is closer to 21.

首先是21点游戏逻辑的定义和一些预设policy。
作为玩家,只有hit 和 stand两种action
其进行决策只需考虑如下三点:

  1. usable_ace手头是否有ace牌,且能叫为11点而不爆牌
  2. 手头牌面值和(12-21)0-11不需考虑,因为无论抽到什么牌怎么都不可能爆牌,故一定是hit
  3. 庄家的明牌。(1,…10)(J Q K都是10)
    所以共有2*10*10 200个state,故policy表和value表就是2*10*10的
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import seaborn as sns
from tqdm import tqdm

# actions: hit or stand
ACTION_HIT = 0
ACTION_STAND = 1  #  "strike" in the book
ACTIONS = [ACTION_HIT, ACTION_STAND]

# policy for player
# 这是书中规定的一个policy,用于演示MC policy evaluation,
# 其很朴素,只在自己牌面和为 20 or 21 时stand,其余一律hit,不考虑其他因素
POLICY_PLAYER = np.zeros(22, dtype=np.int)
for i in range(12, 20):
    POLICY_PLAYER[i] = ACTION_HIT
POLICY_PLAYER[20] = ACTION_STAND
POLICY_PLAYER[21] = ACTION_STAND

###########这俩policy是为off-policy算法准备 
# function form of target policy of player
def target_policy_player(usable_ace_player, player_sum, dealer_card):
    return POLICY_PLAYER[player_sum]

# function form of behavior policy of player
def behavior_policy_player(usable_ace_player, player_sum, dealer_card):
    if np.random.binomial(1, 0.5) == 1:
        return ACTION_STAND
    return ACTION_HIT
###########
# policy for dealer
# 21点游戏规则规定的庄家policy,即持续hit直至>=17
POLICY_DEALER = np.zeros(22)
for i in range(12, 17):
    POLICY_DEALER[i] = ACTION_HIT
for i in range(17, 22):
    POLICY_DEALER[i] = ACTION_STAND

# get a new card
def get_card():
    card = np.random.randint(1, 14)# [1,14)
    card = min(card, 10)#(J Q K都是10)
    return card

# get the value of a card (11 for ace).
def card_value(card_id):
    return 11 if card_id == 1 else card_id

# play a game 环境交互核心函数,返回:
#(state, reward, player_trajectory)
# 其中state = [usable_ace_player, player_sum, dealer_card1]
#     reward 是+1 或-1或0
#     player_trajectory [(usable_ace_player, player_sum, dealer_card1), action])的
#     序列

# @policy_player: specify policy for player
# @initial_state: [whether player has a usable Ace, sum of player's cards, one card of dealer]
# @initial_action: the initial action
def play(policy_player, initial_state=None, initial_action=None):
    # player status

    # sum of player
    player_sum = 0

    # trajectory of player
    player_trajectory = []

    # whether player uses Ace as 11
    usable_ace_player = False

    # dealer status
    dealer_card1 = 0
    dealer_card2 = 0
    usable_ace_dealer = False

    if initial_state is None:
        # generate a random initial state

        while player_sum < 12:
            # if sum of player is less than 12, always hit
            card = get_card()
            player_sum += card_value(card)

            # If the player's sum is larger than 21, he may hold one or two aces.
            if player_sum > 21:
                assert player_sum == 22
                # last card must be ace
                player_sum -= 10
            else:
                usable_ace_player |= (1 == card)

        # initialize cards of dealer, suppose dealer will show the first card he gets
        dealer_card1 = get_card()
        dealer_card2 = get_card()

    else:
        # use specified initial state
        usable_ace_player, player_sum, dealer_card1 = initial_state
        dealer_card2 = get_card()

    # initial state of the game
    state = [usable_ace_player, player_sum, dealer_card1]

    # initialize dealer's sum
    dealer_sum = card_value(dealer_card1) + card_value(dealer_card2)
    usable_ace_dealer = 1 in (dealer_card1, dealer_card2)
    # if the dealer's sum is larger than 21, he must hold two aces.
    if dealer_sum > 21:
        assert dealer_sum == 22
        # use one Ace as 1 rather than 11
        dealer_sum -= 10
    assert dealer_sum <= 21
    assert player_sum <= 21

    # game starts!

    # player's turn
    while True:
        if initial_action is not None:
            action = initial_action
            initial_action = None
        else:
            # get action based on current sum
            action = policy_player(usable_ace_player, player_sum, dealer_card1)

        # track player's trajectory for importance sampling
        player_trajectory.append([(usable_ace_player, player_sum, dealer_card1), action])

        if action == ACTION_STAND:
            break
        # if hit, get new card
        card = get_card()
        # Keep track of the ace count. the usable_ace_player flag is insufficient alone as it cannot
        # distinguish between having one ace or two.
        ace_count = int(usable_ace_player)
        if card == 1:
            ace_count += 1
        player_sum += card_value(card)
        # If the player has a usable ace, use it as 1 to avoid busting and continue.
        while player_sum > 21 and ace_count:
            player_sum -= 10
            ace_count -= 1
        # player busts
        if player_sum > 21:
            return state, -1, player_trajectory
        assert player_sum <= 21
        usable_ace_player = (ace_count == 1)

    # dealer's turn
    while True:
        # get action based on current sum
        action = POLICY_DEALER[dealer_sum]
        if action == ACTION_STAND:
            break
        # if hit, get a new card
        new_card = get_card()
        ace_count = int(usable_ace_dealer)
        if new_card == 1:
            ace_count += 1
        dealer_sum += card_value(new_card)
        # If the dealer has a usable ace, use it as 1 to avoid busting and continue.
        while dealer_sum > 21 and ace_count:
            dealer_sum -= 10
            ace_count -= 1
        # dealer busts
        if dealer_sum > 21:
            return state, 1, player_trajectory
        usable_ace_dealer = (ace_count == 1)

    # compare the sum between player and dealer
    assert player_sum <= 21 and dealer_sum <= 21
    if player_sum > dealer_sum:
        return state, 1, player_trajectory
    elif player_sum == dealer_sum:
        return state, 0, player_trajectory
    else:
        return state, -1, player_trajectory

蒙特卡洛 policy 评估

在这里插入图片描述
该方法是对无完整过程模型p,无法使用DP,而仅从交互序列中进行值函数v(s)估计的方法。可分为first-visit 和 every-visit两种,其区别在于first-visit仅处理每一个交互序列中某state的第一次出现,而every-visit对每一个交互序列中某state的每次出现一视同仁。
具体做法可由代码进行理解:

# Monte Carlo Sample with On-Policy
def monte_carlo_on_policy(episodes):
    states_usable_ace = np.zeros((10, 10))
    # initialze counts to 1 to avoid 0 being divided
    states_usable_ace_count = np.ones((10, 10))
    states_no_usable_ace = np.zeros((10, 10))
    # initialze counts to 1 to avoid 0 being divided
    states_no_usable_ace_count = np.ones((10, 10))
    for i in tqdm(range(0, episodes)):
        _, reward, player_trajectory = play(target_policy_player)
        for (usable_ace, player_sum, dealer_card), _ in player_trajectory:
            player_sum -= 12 # 因为value表的第一个index是12
            dealer_card -= 1 # 同样是index问题
            if usable_ace:
                states_usable_ace_count[player_sum, dealer_card] += 1
                states_usable_ace[player_sum, dealer_card] += reward
            else:
                states_no_usable_ace_count[player_sum, dealer_card] += 1
                states_no_usable_ace[player_sum, dealer_card] += reward
    return states_usable_ace / states_usable_ace_count, states_no_usable_ace / states_no_usable_ace_count

该函数对前面定义的简单policy进行v(s)评估。将200个state按有无ace分两类分别返回(100+100)。此函数使用every-visit,实践中绝大部分都是every-visit,因为实现更方便,不用验证是不是first-visit。拿到一个交互序列后,遍历其中每一step,将交互序列的reward对应加到各个state上。整个过程重复episodes次,最后对value表用state count求平均。
按此方法即可在未知过程模型的情况下,仅用policy 与 环境的交互结果对policy对应的v(s)进行估计。

Monte Carlo policy iteration with Exploring Starts

上部分主要目的是阐述Monte Carlo 估计RL问题的基本方法。我们要想将Monte Carlo应用到DP中的 policy iteration算法上求optimal policy,需要估计state_action_values 即q(a,s)而非v(s),这是因为没有过程模型p时,仅有v(s)是无法求optimal action的。(DP中可以)。下面的算法采用greedy policy,并用Exploring Starts弥补探索的缺失。所谓Exploring Starts就是随机选取交互的init,这样在当进行的episodes足够多的时候,就可以保证每个state都被探索到了。显然Exploring Starts在很多实际问题中并不现实,因为init态很多时候是定死的,导致Exploring Starts无法进行,之后会讨论其他保证探索的方法。

# Monte Carlo policy iteration with Exploring Starts
def monte_carlo_es(episodes):
    # (playerSum, dealerCard, usableAce, action)
    state_action_values = np.zeros((10, 10, 2, 2))
    # initialze counts to 1 to avoid division by 0
    state_action_pair_count = np.ones((10, 10, 2, 2))

    # behavior policy is greedy
    # 如遇到value的action则随机选取
    def behavior_policy(usable_ace, player_sum, dealer_card):
        usable_ace = int(usable_ace)
        player_sum -= 12
        dealer_card -= 1
        # get argmax of the average returns(s, a)
        values_ = state_action_values[player_sum, dealer_card, usable_ace, :] / \
                  state_action_pair_count[player_sum, dealer_card, usable_ace, :]
        return np.random.choice([action_ for action_, value_ in enumerate(values_) if value_ == np.max(values_)])

    # play for several episodes
    for episode in tqdm(range(episodes)):
        # for each episode, use a randomly initialized state and action
        # 即Exploring Starts
        # x下面更新q(s,a)表
        initial_state = [bool(np.random.choice([0, 1])),
                         np.random.choice(range(12, 22)),
                         np.random.choice(range(1, 11))]
        initial_action = np.random.choice(ACTIONS)
        current_policy = behavior_policy if episode else target_policy_player
        _, reward, trajectory = play(current_policy, initial_state, initial_action)
        for (usable_ace, player_sum, dealer_card), action in trajectory:
            usable_ace = int(usable_ace)
            player_sum -= 12
            dealer_card -= 1
            # update values of state-action pairs
            state_action_values[player_sum, dealer_card, usable_ace, action] += reward
            state_action_pair_count[player_sum, dealer_card, usable_ace, action] += 1

    return state_action_values / state_action_pair_count

On-Policy 和 Off-Policy

为了能不用Exploring Starts并保证探索,可以采用Chapter2中的e-greedy策略,但这种方法最后收敛得到的value* π*是对e-greedy这个policy的,只是近似最优,为了解决此问题,又发展了一类方法叫off-policy。其使用两个policy,一个target_policy作为目标policy作为最终的policy(一般就是按value greedy的),另一个带探索的behavior_policy用于产生交互序列。off-policy名称的含义即指这种用其他policy的交互数据对本policy进行提升和评估的一类方法。与之相对的on-policy就是形如上面Monte Carlo policy iteration with Exploring Starts的一类方法,仅有一个policy自给自足。
off-policy为了能利用behavior_policy的交互数据为target_policy进行action_value表估计,需要引入importance sampling来进行补偿一面产生biased的估计。
某个policy交互出某一action state序列的概率可表示为:
在这里插入图片描述
忽略环境p的部分,可推知其importance-sampling-ratio应该是
在这里插入图片描述
importance-sampling进一步分为ordinary importance sampling在这里插入图片描述
和 weighted importance sampling
在这里插入图片描述
实践上weighted importance sampling更常用。下面的函数同时计算了两类方法。注意importance-sampling-ratio的计算,一旦序列中action出现不同,就会给0,终止计算。(因为错误的action后,p(s|s,a)就会产生出0,既拐不回去了。。)

# Monte Carlo Sample with Off-Policy
def monte_carlo_off_policy(episodes):
    initial_state = [True, 13, 2]

    rhos = []
    returns = []

    for i in range(0, episodes):
        _, reward, player_trajectory = play(behavior_policy_player, initial_state=initial_state)

        # get the importance ratio
        numerator = 1.0
        denominator = 1.0
        for (usable_ace, player_sum, dealer_card), action in player_trajectory:
            if action == target_policy_player(usable_ace, player_sum, dealer_card):
                denominator *= 0.5
            else:
                numerator = 0.0
                break
        rho = numerator / denominator
        rhos.append(rho)
        returns.append(reward)

    rhos = np.asarray(rhos)
    returns = np.asarray(returns)
    weighted_returns = rhos * returns
	# 这里算accumulate是方便后面的误差统计,无关紧要
    weighted_returns = np.add.accumulate(weighted_returns)
    rhos = np.add.accumulate(rhos)

    ordinary_sampling = weighted_returns / np.arange(1, episodes + 1)

    with np.errstate(divide='ignore', invalid='ignore'):
        weighted_sampling = np.where(rhos != 0, weighted_returns / rhos, 0)

    return ordinary_sampling, weighted_sampling
利用蒙特卡洛方法实现21点问题的最优解 想要获取完整代码,请访问面包多进行支持哦,仅需一口奶茶的钱! 一、实验目的 实现基于蒙特卡洛法的21点问题的最优解,了解强化学习的基本原理,理解蒙特卡洛法并编写相应的代码。 二、实验内容 赌场上流行的21点纸牌游戏的目的是获得其数值之和尽可能大而不超过21的牌。所有的人形牌面都算作10,而A可以算作1或11。我们的实验仅考虑每个玩家独立与庄家竞争的版本。游戏开始时,庄家和玩家都有两张牌。庄家的一张牌面朝上,另一张牌面朝下。如果玩家有21张牌(一张A和一张10牌),则称为自然牌。他就赢了,除非庄家也有自然牌, 阅读详情

相关推荐

强化学习算法复现(三):蒙特卡洛方法_21点游戏

相关知识结构如下: 在本次复现中,使用的gym中的21点游戏模块 part1、环境测试:以随机策略玩n局游戏 import gym env = gym.make('Blackjack-v0') # print(env.observation_space) # print(env.action_space) # 以随机策略玩n局 def random_play(n): for i_episode in range(n): state = env.reset() # 状态随机初始

qq_42138927的博客 1449

深度强化学习极简入门与Pytorch实战

强化学习作为行为主义人工智能学派的典型代表,近几年与深度神经网络相结合形成的深度强化学习(DRL),达到了令人惊叹的智能水平:2015年DQN智能体玩视频游戏超越人类水平,2017年基于PPO算法的Open Five在《Dota》游戏中战胜人类顶尖职业玩家,2019年基于DRL的AlphaStar在《星际争霸II》游戏中战胜人类顶尖职业玩家。深度强化学习为通用人工智能(AGI)带来了新的希望! 然而,深度强化学习理论较为抽象,学习曲线陡峭,需要大量的时间和精力才能入门,很多硕士和博士往往浪费了大量时间在入门阶段,耽误了学习和科研进度。 本门课程的特点之一:精炼而不失重点。本门课程深入浅出,根据多年深度强化学习科研和项目实践经验,选取了强化学习入门所必须掌握的知识点,为学员构建一个最小而必要的强化学习知识体系,为后续的研究和论文专业以及工程实践打下坚实的基础。 本门课程的特点二:强调实战。为每个知识点精心设计设计编程实践练习,让学员在练习中理解和掌握知识点。课程设计了综合实战项目——开发强化学习智能体并参加强化学习比赛,提供竞赛baseline代码。

强化学习(四) - 蒙特卡洛方法(Monte Carlo Methods)及实例

蒙特卡罗方法是我们第一个用于估计价值函数和发现最优策略的学习方法。与之前动态规划不同的是,这里我们不假设对环境的完全了解。蒙特卡洛方法只需要状态、动作和与环境实际或模拟交互的奖励的经验样本序列。从实际经验中学习是引人注目的,因为它不需要事先了解环境的动态,但仍然可以达到最佳行为。从模拟经验中学习也很强大。虽然需要一个模型,但模型只需要生成样本转换,而不是动态规划(DP)所需要的所有可能转换的完整概率分布。在许多情况下,根据所需的概率分布抽样生成经验很容易,但以显式形式获得分布却不可行。

Stan_Fu的博客 1万+

强化学习丨蒙特卡洛方法及关于“二十一点”游戏的编程仿真

一、蒙特卡洛方法简介 在上一篇文章中,笔者介绍了动态规划算法(Dynamic Programming)的概念和实现,不难发现,动态规划是基于贝尔曼方程提出的一种迭代解法,即利用策略评估迭代计算价值,利用策略改进让智能体进行策略学习,但该算法需要完备的环境知识,即动态函数,另一方面,动态规划算法的迭代过程是自举的过程,即当前价值估计需要基于其他价值的估计。 假设智能体处在一个未知的环境中(其实现实生活中这种环境占大多数),环境的动作收益和状态转移都不能提前预知,这时智能体就...

qq_56937808的博客 1万+

用21点游戏实战理解蒙特卡洛方法:从零实现一个强化学习AI

本文通过21点游戏实战,详细解析了蒙特卡洛方法在强化学习中的应用。从零构建AI智能体,涵盖环境交互、策略评估与优化,并对比On-policy与Off-policy学习范式。提供完整Python代码实现,帮助读者直观理解强化学习核心概念,掌握可迁移的序列决策问题解决方法。

weixin_29074295的博客 178

蒙特卡洛算法_强化学习基础篇(十六)蒙特卡洛预测算法在21点游戏的应用

强化学习基础篇(十六)蒙特卡洛预测算法在21点游戏的应用本节将介绍Monte Carlo prediction算法在Blackjack游戏中的进行预测的过程。主要基于一个最简单的策略进行评估,即“超过18点就不在要牌,低于18点就继续要牌”。我将使用两种类型的算法进行评估,一个是首次访问型蒙特卡洛预测算法(First-visit MC prediction),另一个是每次访问型蒙特卡洛预...

weixin_39624606的博客 1402

蒙特卡洛(MC)强化学习实战:21点游戏 10000局训练,胜率提升 35%

本文通过蒙特卡洛(MC)强化学习在21点游戏中的实战应用,展示了无模型学习方法如何提升胜率。经过10000局训练,智能体胜率显著提升35%,核心在于经验轨迹采样和增量式价值更新。文章详细解析了环境建模、ϵ-贪婪策略实现及训练过程分析,为不完全信息博弈问题提供了有效解决方案。

weixin_29800471的博客 304

RLCard:强化学习在卡牌游戏中的应用

RLCard工具包为研究人员提供了一个丰富多样的卡牌游戏环境,包括经典的扑克游戏、中国传统的斗地主和麻将,以及流行的UNO游戏。这些游戏涵盖了不同类型的信息不完全博弈,为强化学习算法的研究和测试提供了理想的平台。每种游戏都有其独特的状态表示、动作编码和奖励机制,这反映了不同游戏的特点和复杂性。研究人员可以根据具体的研究目标选择合适的游戏环境,或者在多个游戏中测试算法的泛化能力。RLCard的设计理念是提供标准化和易于使用的接口,使研究人员能够快速实现和比较不同的强化学习算法。

步子哥的博客 1495

强化学习:蒙特卡洛方法代码(21点)

21点代码链接:https://pan.baidu.com/s/1T0Ev8KJy2tcGIFiB3ddyyQ 提取码:提取码:6ft9 第0部分:探索BlackEnv import gym env = gym.make('Blackjack-v0') 每个状态都是包含以下三个元素的 3 元组: 玩家的当前点数之和∈{0,1,…,31}∈{0,1,…,31}, 庄家朝上的牌点数之...

qq_36795658的博客 4553

PyTorch手写DQN玩21点:从状态编码到reward设计的强化学习实战

深度Q网络(DQN)是强化学习中解决序列决策问题的核心算法,其关键在于状态表征、动作价值估计与经验稳定更新。本文围绕21点这一经典马尔可夫决策过程,详解如何用PyTorch从零构建DQN智能体——涵盖真实赌场规则下的状态空间建模(如软硬手区分)、防过拟合的三级reward函数设计、以及target network延迟更新机制。技术价值体现在小规模状态(3维)下实现可解释、可调试、可扩展的策略学习,适用于课程设计、毕设开发与Web游戏AI集成等工程场景,是掌握DQN原理与PyTorch工程落地的典型范例。

weixin_42571738的博客 339

Reinforcement-Learning-in-Blackjack:用于玩二十一点变体的几种强化学习算法的实现

强化学习在二十一点 用于玩二十一点变体的几种强化学习算法的实现 为了运行所有算法,只需运行 main.py。 这将执行 test_all_algorithms() 函数,该函数运行 MC、SARSA 和线性函数近似与 SARSA,并带有显示结果的图。 其他模块的详细信息: environment.py - 包含 step() 函数和环境的实现 rl_algorithms - 包含 MC、SARSA 和线性函数逼近 plotting.py - 包含绘制值函数、SARSA 和 LFA 结果的函数 policy.py - 放置策略的地方,目前只包含 epsilon 贪婪策略 Utility.py - 计算均方误差并将状态转换为 LFA 的特征向量

【强化学习】基于蒙特卡洛MC与时序差分TD的简易21点游戏应用

本次实验所应用的三种策略Q-learning、Sarsa和蒙特卡洛都是解决强化学习问题的算法,它们在学习过程中都通过与环境的交互来优化策略。且都用于值函数估计,这三种算法的目标都是学习状态或状态动作对的值函数,即Q值或V值。更新方式不同:Q-learning: 使用了离线学习的方式,通过选择当前状态下值最大的动作来更新Q值。更新公式中使用了max操作。Sarsa: 使用在线学习的方式,通过选择当前状态下的某个动作来更新Q值。更新公式中使用了当前实际选择的动作。蒙特卡洛: 通过整个回合(

HYY的博客 2413

复旦大学人工智能blackjack答案

The search algorithms explored in the previous assignment work great when you know exactly the results of your actions. Unfortunately, the real world is not so predictable. One of the key aspects of an effective AI is the ability to reason in the face of uncertainty. Markov decision processes (MDPs) can be used to formalize uncertain situations. In this homework, you will implement algorithms to find the optimal policy in these situations. You will then formalize a modified version of Blackjack as an MDP, and apply your algorithm to find the optimal policy.

Sutton 强化学习, 21 点游戏的策略蒙特卡洛值预测

作者|MyEncyclopedia来源 |MyEncyclopedia(ID:MyEncyclopedia)头图 | 优快云下载自东方IC从这期开始我们进入 Sutton 强...

优快云资讯 3438

从零构建:毫米波雷达生命信号检测系统的Matlab仿真全流程解析

本文详细解析了毫米波雷达生命信号检测系统的Matlab仿真全流程,涵盖原理、信号处理链路设计及算法优化策略。通过FMCW雷达技术,实现非接触式呼吸心跳信号检测,结合Matlab代码示例展示距离FFT、相位提取与信号分离等关键步骤,为医疗监护和智能家居应用提供实用指南。

weixin_29303701的博客 352

别再傻傻分不清!5分钟搞懂倾斜摄影里‘地面分辨率’和‘模型精度’到底啥关系

本文深入解析倾斜摄影中‘地面分辨率’与‘模型精度’的关系,帮助读者快速理解两者的本质区别与内在关联。通过实战案例和公式计算,详细说明如何从航飞设计到精度验证全流程控制,避免常见认知误区,并针对不同应用场景提供精度需求建议。

weixin_33700350的博客 476

21点扑克游戏的出牌策略的研究

21点是一个非常流行的扑克游戏,规则很简单,计算手中的牌,如果超过21点则输,不到21点则比谁的牌大。其中JQK都当成10点计算,A可以计算为1点或11点。 在澳门的娱乐场里面,21点的规则如下,庄家先给每位玩家发一张牌以及给自己发一张牌,然后庄家继续给玩家发一张牌。这是玩家手里有两张牌,庄家只有一张牌。玩家需要根据自己的牌以及庄家的牌来作出决策,是继续要牌,还是停牌,如果两张牌一致还可以选择分牌。庄家根据玩家的决策来进行相应的操作,并且计算点数,如果玩家的牌超过21点则算玩家负。等所有玩家的操作都完成后

6万+

从原理图到代码:深入解析SX1278 LoRa模块与STM32的SPI通信驱动(附完整工程)

本文深入解析了SX1278 LoRa模块与STM32的SPI通信驱动实现,从硬件原理图到完整工程代码,详细介绍了LoRa技术的通信原理、寄存器配置、SPI接口设计及低功耗优化策略。适合物联网开发者和嵌入式工程师提升远距离无线通信能力,附完整工程代码助力快速开发。

weixin_42715608的博客 423

点点思考,掌握21点:深度Q学习实战指南

本文以21点游戏为例,介绍了如何使用RLCard工具包和深度Q学习算法训练一个智能体。我们首先创建了游戏环境,然后创建并训练了DQN智能体,最后通过学习曲线评估了智能体的性能。

步子哥的博客 641

单总线CPU设计(变长指令周期3级时序)(HUST)(头歌实验)

利用比较器等功能模块将32位MIPS 指令字译码生成LW、SW、BEQ、SLT、ADDI、OtherInstr信号也就是利用比较器将指令字转换为译码信号,OP与不同信号对应(查询MIPS手册得知) 16 进制 :23 是 2进制: 00100011 ,把获得的OP,Func,和常数比对,相同输出1.按照题目要求填写表格,使用logisim的组合逻辑电路分析功能,当然也可以直接再logisim中写真值表。单总线采用变长指令周期,不同指令周期数不同,节拍数可变化。写的excel表格最终生成电路(当然 需要先把

xuxuaifeifei的博客 1万+

【数据分享】1985-2023年30米CLCD土地覆盖栅格数据分享

总的来说,CLCD 反映了中国快速的城市化进程和一系列生态工程,揭示了气候变化条件下人为对 LC的影响,其在全球变化研究中具有潜在应用价值。最后,通过目视解译的独立样本和第三方测试样本评估CLCD的准确性。特别地,该研究将CLCD产品与目前最先进的30m专题产品包括不透水表面积(ISA)、地表水和森林进行比对,以综合评估CLCD的质量(以下为技术流程图)。数据分类:分为九类用地,该数据包括9种用地类型,分别为:农田、森林、灌木、草原、水域、冰雪、裸地、不透水面、湿地。数据格式:.tif格式。

weixin_61129400的博客 6913

21点游戏AI实战:用蒙特卡洛方法打造你的第一个强化学习智能体(附完整代码)

本文通过21点游戏实战,详细介绍了如何使用蒙特卡洛方法构建你的第一个强化学习智能体。内容涵盖从环境搭建、策略评估到策略控制的完整流程,并提供了可运行的Python代码示例,帮助读者无需复杂数学模型即可理解并实现一个能从经验中自我学习的游戏AI。

gg901的博客 1050

PCB仿真软件:Altium Designer_(6).PCB布线设计:自动布线与手工布线

通过以上步骤,我们完成了一个简单的PCB设计案例。在这个过程中,我们使用了自动布线和手工布线的综合策略,确保布线质量符合设计要求。创建PCB项目:在Altium Designer中创建一个新的PCB项目。导入原理图:将原理图文件导入到PCB项目中。设置布线规则:通过设置必要的布线规则,如线宽、间距等。启动自动布线:使用自动布线器进行初步布线。手工优化布线:通过手工布线工具优化关键信号的布线路径。保存和导出PCB文件:保存PCB文件并导出Gerber文件,用于生产。

kkchenjj的博客 2522

21点代码python_利用蒙特卡洛方法实现21点问题的最优解(内含python源码)

想要获取完整代码,请访问面包多进行支持哦,仅需一口奶茶的钱!一、实验目的实现基于蒙特卡洛法的21点问题的最优解,了解强化学习的基本原理,理解蒙特卡洛法并编写相应的代码。二、实验内容赌场上流行的21点纸牌游戏的目的是获得其数值之和尽可能大而不超过21的牌。所有的人形牌面都算作10,而A可以算作1或11。我们的实验仅考虑每个玩家独立与庄家竞争的版本。游戏开始时,庄家和玩家都有两张牌。庄家的一张牌面朝上...

weixin_35970228的博客 1097

【深度学习新浪潮】如何上手DINO v3:Meta新一代视觉大模型实战指南

自定义数据集类(适配本地/公开数据集)# 去除batch维度# 构建数据加载器# 定义分类模型(冻结预训练层,仅训练分类头)self.classifier = nn.Linear(dino_model.config.hidden_size, num_classes) # 分类头global_feat = outputs.global_attention_pool # 取全局特征# 初始化模型# 冻结预训练层(仅训练分类头)# 定义损失函数和优化器。

专注:太空算力、AI infra、异构调度、大模型成本工程 491

机器人中的数值优化(十三)——QP二次规划

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例

慕羽★的博客 2792
上一篇: 经典Policy Iteration实现
下一篇: python package打包制作
leida_wt
博客等级 码龄10年 420粉丝 77原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值