我在MatLab中创建随机向量V
时遇到了问题,受以下一组约束的约束:(给定参数N
、D
、L
和theta
)
1.向量V
的长度必须为N
个单位
1.元素的平均值必须为theta
1.任何两个连续元素的差值不得超过+/-10
1.D == sum(L*cosd(V-theta))
我对最后一部的问题最多。有什么主意吗?
编辑
其他语言或方程形式的解也同样可接受。MatLab对我来说只是一个方便的原型工具,但最终的算法将在Java中实现。
编辑
从评论和初步答复中,我想补充一些澄清和初步想法。
我并不是在从任何标准的发行版中寻找“真正随机”的解决方案。我想要一个伪随机生成的值序列,满足给定的参数集的约束。
我试图近似的系统是一个由N个链节组成的链条,链节长度为L,其中链条的一端与另一端在θ方向上的距离为D。
我在这里的初步见解是,直到最后都可以不考虑theta,因为(2)本质上是将theta加到0均值向量V的每个元素上(将均值移动到theta),而(4)只是再次去掉那个均值。所以,如果你能找到theta=0的解,那么所有theta的问题都解决了。
按照要求,下面是一个合理的参数范围(不是硬约束,而是典型值):5<N<200
3<D<150
L==1
0 < theta < 360
4条答案
按热度按时间w8f9ii691#
我会从创建一个“有效的”向量开始。这应该是可能的-比方说,计算每个条目具有相同的值。
一旦你得到了那个向量,我会应用一些变换来“洗牌”它。“Rejection sampling”是关键字--如果洗牌会违反你的规则之一,你就不会这么做。
作为我想出的转变:
但也许你能找到更多。
合理地经常这样做,你就会得到一个“有效的”随机向量。从理论上讲,您应该能够获得所有有效的向量--实际上,您可以尝试构造几个“开始”向量,这样就不会花费太长时间。
stszievb2#
这是一种方法。显然,并非所有theta、N、L和D的组合都是有效的。很明显,您正在尝试模拟相当复杂的随机对象。关于这些向量,您可能很难显示出任何有用的东西。
您尝试模拟的系列似乎类似于Wiener process。所以我从这个开始,你可以从任何随机但合理的东西开始。然后,我将其用作尝试满足2、3和4的优化的起点。初始值越接近有效向量(满足所有条件),收敛越好。
你似乎在试图模拟一些非常复杂/奇怪的东西(一条给定曲率的路径?),看看其他评论者的问题。不过,您必须使用您的领域知识将D和L与合理的Mu和Sigma连接起来,以便Wiener充当初始化。
r6vfmomb3#
因此,根据您的新要求,您实际上正在寻找的似乎是一个随机Angular 的有序列表,Angular 的最大变化为10度(我首先将其转换为弧度),以便指定从起点到终点的距离和方向,以及链接长度和链接数量?
模拟最初的猜测。它不能满足D和theta约束(即指定的D和指定的theta)
使用遗传算法(或其他优化)根据以下成本函数调整Angular :
成本现在只是由上面的
D
和theta
给出的向量与由指定的D
和theta
(即输入)给出的向量之间的差值。你仍然必须执行最大变化10度的规则,也许这只会使成本函数变得巨大,如果违反了它?也许有一种更清晰的方法来指定优化算法中的序列约束(我不知道如何指定)。
我觉得如果您能找到具有正确参数的正确优化,这应该能够模拟您的问题。
3df52oht4#
您没有为我们提供太多要处理的细节,因此我将假设以下内容:
[-127+theta +127-theta]
中抽取int8
类型然后,对于前3个要求,您可以使用以下命令:
内联匿名函数以获得更快的速度。
现在,最后一个要求是,
有一点奇怪……
cos(V-theta)
是将数据重新缩放到[-1 +1]
间隔的特定方法,然后与L
相乘将扩展到[-L +L]
。乍一看,你会认为sum
的平均值是0
。然而,当
x
是来自[0 2*pi]
中均匀分布的随机变量时,cos(x)
的期望值是2/pi
(例如,参见here)。暂时忽略我们的限制与[0 2*pi]
不同的事实,sum(L*cos(V-theta))
的期望值将简单地减少到常量2*N*L/pi
。我不明白如何才能“强迫”它等于其他一些常量
D
……你能更详细地解释一下吗?