我正在用Java编写辅助学习算法.
我遇到了一个我可以解决的数学问题,但由于处理过程很重,我需要一个最佳解决方案.
话虽这么说,如果有人知道一个非常棒的优化库,但语言是Java所以需要考虑.
这个想法很简单:
对象将存储变量的组合,例如ABDC,ACDE,DE,AE.
组合的最大数量将取决于我可以在不减慢程序速度的情况下运行的数量,因此理论上可以说100.
决策过程将每次迭代生成一个随机变量.如果生成的变量是其中一个组合的一部分,例如.'A'是ABDC和ACDE的一部分,而不是C和B(或存储的组合中的任何后续字母)的倾向将增加.
为了使事情更加清晰,我们假设'A','B','C','D'和'E'是唯一可能的变量.事实是,会有更多像12或14,但这个最大值还取决于我可以处理多少没有滞后.
由于有五个可能的变量,它将为第一次迭代生成加权1/5随机滚动.如果该滚动结果为'A',则在下一次迭代中'B'和'C'现在将具有2/5倾向而不是1/5.
如果下一次迭代产生'B','D'倾向将增加到3/5.注意:关系是指数关系; 实际上,它不会是1/5,而是像10%那样略微提升,如果它达到序列中的第4个变量,它将滚雪球说50%.
现在,在Java中,我可以通过跟踪每个对象的所有存储组合来实现此功能.我在想通过在每次迭代中以小步骤分配跟踪过程,它不应该太慢.
另一种解决方案是绘制所有可能的组合及其潜在的倾向.这当然只需要一个搜索功能,但也会在计算所有可能性和存储在某个地方时出现问题,可能在文件中.
有人建议我应该使用Markov模型和/或库,尽管我对这种类型的数学并不太熟悉.
如何在Java中快速计算此过程?
.
示例>>>
只有一个序列ABC.
对于三个数字,机会开始相等所以它看起来像兰特(1,3)
如果A是结果,我们增加B的可能性,因为它是序列中的下一个字母.让我们说它加倍.
所以现在机会是:A = 1/4,C = 1/4,B = 2/4
该函数现在看起来像rand(1,4),其中3和4的结果都代表选项B.
如果下一个结果是B,我们希望增加C的可能性,因为它是序列中的下一个字符,但是它是上次增加的两倍(指数)
机会现在类似于:A = 1/6,C = 1/6,B = 4/6
该函数现在为rand(1/6),其中值3,4,5,6表示C.