Unity-ML-Agents-Sampler.cs

使用方法:https://github.com/Unity-Technologies/ml-agents/blob/release_19/docs/Training-ML-Agents.md#environment-parameter-randomization

代码来源:https://github.com/Unity-Technologies/ml-agents/blob/release_19/com.unity.ml-agents/Runtime/Sampler.cs

1.代码

using System;
using System.Collections.Generic;
using Unity.MLAgents.Inference.Utils;
using Random = System.Random;

namespace Unity.MLAgents
{
    /// <summary>
    /// Takes a list of floats that encode a sampling distribution and returns the sampling function.
    /// </summary>
    internal static class SamplerFactory
    {
        /// <summary>
        /// 创建一个产生指定范围内均匀分布随机数的采样函数。
        /// </summary>
        public static Func<float> CreateUniformSampler(float min, float max, int seed)
        {
            Random distr = new Random(seed);
            return () => min + (float)distr.NextDouble() * (max - min);
        }

        /// <summary>
        /// 创建一个产生指定均值和标准差的高斯分布随机数的采样函数。
        /// </summary>
        public static Func<float> CreateGaussianSampler(float mean, float stddev, int seed)
        {
            RandomNormal distr = new RandomNormal(seed, mean, stddev);
            return () => (float)distr.NextDouble();
        }

        /// <summary>
        /// 创建一个从多个区间均匀分布中进行采样的采样函数。
        /// </summary>
        public static Func<float> CreateMultiRangeUniformSampler(IList<float> intervals, int seed)
        {
            // 随机数生成器
            Random distr = new Random(seed);

            // 将要用于归一化区间函数的总和
            float sumIntervalSizes = 0;

            // 区间数量
            int numIntervals = (intervals.Count / 2);

            // 存储区间长度的数组
            float[] intervalSizes = new float[numIntervals];

            // 存储均匀分布函数的列表
            IList<Func<float>> intervalFuncs = new Func<float>[numIntervals];

            // 收集所有区间并将它们存储为均匀分布函数
            // 收集所有区间的长度
            for (int i = 0; i < numIntervals; i++)
            {
                var min = intervals[2 * i];
                var max = intervals[2 * i + 1];
                var intervalSize = max - min;
                sumIntervalSizes += intervalSize;
                intervalSizes[i] = intervalSize;
                intervalFuncs[i] = () => min + (float)distr.NextDouble() * intervalSize;
            }

            // 归一化区间长度
            for (int i = 0; i < numIntervals; i++)
            {
                intervalSizes[i] = intervalSizes[i] / sumIntervalSizes;
            }

            // 为区间构建累积分布函数
            for (int i = 1; i < numIntervals; i++)
            {
                intervalSizes[i] += intervalSizes[i - 1];
            }

            Multinomial intervalDistr = new Multinomial(seed + 1);
            float MultiRange()
            {
                int sampledInterval = intervalDistr.Sample(intervalSizes);
                return intervalFuncs[sampledInterval].Invoke();
            }

            return MultiRange;
        }
    }
}

这段代码定义了一个静态类 SamplerFactory,其中包含了三个静态方法,分别用于生成不同类型的采样函数。具体来说:

①CreateUniformSampler(float min, float max, int seed) 方法用于生成一个均匀分布采样函数,其输入参数为采样区间的下界 min,上界 max,以及随机数生成器的种子 seed。该方法返回一个委托,调用该委托即可获得一个采样值,其值域在区间 [min, max] 内均匀分布。

②CreateGaussianSampler(float mean, float stddev, int seed) 方法用于生成一个正态分布采样函数,其输入参数为正态分布的均值 mean,标准差 stddev,以及随机数生成器的种子 seed。该方法返回一个委托,调用该委托即可获得一个采样值,其值域服从以 mean 为均值、stddev 为标准差的正态分布。

③CreateMultiRangeUniformSampler(IList<float> intervals, int seed) 方法用于生成一个多区间均匀分布采样函数,其输入参数为采样区间的下界和上界组成的列表 intervals,以及随机数生成器的种子 seed。该方法返回一个委托,调用该委托即可获得一个采样值,其值域在多个区间内均匀分布。例如,当 intervals[1,2,4,5] 时,该采样函数会在区间 [1,2][4,5] 之间等概率地采样一个值。

这些采样函数在强化学习等领域中非常常用,用于生成随机的行为或状态,以增加智能体的探索能力。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天寒心亦热

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值