- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在一个非常小的研究团队中工作,在 Scala 中创建/调整遗传算法库以使用 Scientific Worklow System 进行分布式计算,在我们的案例中,我们使用开源 OpenMole 软件 (http://www.openmole.org/)。
最近,我尝试理解并重新实现在 JMetal Metaheuristics 库 (http://jmetal.sourceforge.net/) 中编写的 SBX 交叉运算符,以使其适应我们的 Scala 库中的功能版本。
我写了一些代码,但我需要我们的建议或您对定义到 java 库中的 SBX 的验证,因为源代码 (src in svn) 似乎不等于此处编写的原始方程式:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.33.7291&rep=rep1&type=pdf第 30 页,附件 A
第一个问题,我不明白 JMetal 的 java 版本,为什么他们使用两个不同的 beta 值?!
Beta 1 和 2 用于计算 alpha 值和两个(所以这里和在 jmetal 中我们也有两个不同的 alpha 值 alpha1 和 2)...
同样的问题/问题,我们在 jmetal 中对 betaq(java 代码)或 Deb 方程进行了两次计算,结果为:
第二个问题,符号是什么意思? SBX 伪算法中(2)和(3)过程中使用的,与简单beta 的区别?特别是当我们想要计算交叉 parent 的 child /后代时,就像这里一样:
更正 no-op if/else block
jmetal 的代码作者给我 Nsga-II 算法原始源代码的链接,他解释说 Deb 对 SBX 的描述与他的实现不同:/
http://www.iitk.ac.in/kangal/codes.shtml
我不明白 jmetal 和原始源代码中的描述和实现之间的区别,你有解释吗?
正确的 if/else 返回 map
class SBXBoundedCrossover[G <: GAGenome, F <: GAGenomeFactory[G]](rate: Random => Double = _.nextDouble) extends CrossOver [G, F] {
def this(rate: Double) = this( _ => rate)
def crossOver (genomes : IndexedSeq [G], factory: F) (implicit aprng : Random) = {
val g1 = genomes.random
val g2 = genomes.random
val crossoverRate = rate(aprng)
val EPS = 1.0e-14
val numberOfVariables = g1.wrappedValues.size
val distributionIndex = 2
val variableToMutate = (0 until g1.wrappedValues.size).map{x => !(aprng.nextDouble < 0.5)}
//crossover probability
val offspring = {
if (aprng.nextDouble < crossoverRate) {
(variableToMutate zip (g1.wrappedValues zip g2.wrappedValues)) map {
case (b, (g1e, g2e)) =>
if(b) {
if (abs(g1e - g2e) > EPS){
val y1 = min(g1e, g2e)
val y2 = max(g2e, g1e)
var yL = 0.0 //g1e.getLowerBound
var yu = 1.0 //g1e.getUpperBound
var rand = aprng.nextDouble // ui
var beta1 = 1.0 + (2.0 * (y1 - yL)/(y2 - y1))
var alpha1 = 2.0 - pow(beta1,-(distributionIndex+1.0))
var betaq1 = computebetaQ(alpha1,distributionIndex,rand)
//calcul offspring 1 en utilisant betaq1, correspond au β barre
var c1 = 0.5 * ((y1 + y2) - betaq1 * (y2 - y1))
// -----------------------------------------------
var beta2 = 1.0 + (2.0 * (yu - y2) / (y2 - y1))
var alpha2 = 2.0 - pow(beta2, -(distributionIndex + 1.0))
var betaq2 = computebetaQ(alpha2,distributionIndex,rand)
//calcul offspring2 en utilisant betaq2
var c2 = 0.5 * ((y1 + y2) + betaq2 * (y2 - y1))
if (c1 < yL) c1 = yL
if (c1 > yu) c1 = yu
if (c2 < yL) c2 = yL
if (c2 > yu) c2 = yu
if (aprng.nextDouble <= 0.5) {
(c2,c1)
} else {
(c1, c2)
}
}else{
(g1e, g2e)
}
}else{
(g2e, g1e)
}
}
}else{
// not so good here ...
(g1.wrappedValues zip g2.wrappedValues)
}
}
(factory.buildGenome(offspring.map{_._1}), factory.buildGenome(offspring.map{_._2}))
}
def computebetaQ(alpha:Double, distributionIndex:Double, rand:Double):Double = {
if (rand <= (1.0/alpha)){
pow ((rand * alpha),(1.0 / (distributionIndex + 1.0)))
} else {
pow ((1.0 / (2.0 - rand * alpha)),(1.0 / (distributionIndex + 1.0)))
}
}
非常感谢您的建议,或者帮助解决这个问题。
回复
最佳答案
Reyman64,你的问题正是我一直在寻找的答案。谢谢。
我拿了你链接的论文和 Deb 的实现代码,并试图理解两者。为此,我几乎对每一行代码都进行了注释。它们仅在 beta 的计算上有所不同。
由于 Deb 在他的 NSGA-II 实现中使用了这个代码,我将坚持使用这个版本的算法。
如果有人和我有同样的情况(不了解如何实现 SBX),我在下面的要点中留下了我的评论,看看。
https://gist.github.com/Tiagoperes/1779d5f1c89bae0cfdb87b1960bba36d
关于java - Scala 遗传算法 (GA) 库中的模拟二进制交叉 (SBX) 交叉运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8918625/
似乎在上周四/周五发生了一些变化,指标如下:ga:adsenseAdsViewed、ga:adsenseAdsClicks、ga:adsenseRevenue、ga:adsenseAdUnitsVie
ga:entranceBounceRate 和 ga:visitBounceRate 有什么区别? 我从谷歌分析中找到了以下定义,比如 ga:visitBounceRate 单页访问的百分比(即访问
我正在使用 GA API 运行超过 1 年数据的两个查询: 查询1: Get apiQuery = analytics.data().ga() .get("ga:" + profileId, "2
我已经尝试了几天,但没有任何效果。无论我做什么,这些事件都不会被捕获。 我在顶部导入ReactGA import ReactGA from "react-ga"; 导入后初始化它 ReactGA.in
如果未声明 ga,以下 javascript 语句将导致错误。 if (ga) { alert(ga); } 错误是: ga is not defined 看起来未声明的变量无法在 bool 表
您好,我正在尝试使用 GA API 获取特定月份的 Google/自然流量。使用this 我尝试将维度设置为 ['month', 'year' ] 和 ['sourceMedium'],使用指标作为
我对谷歌分析的问题已经困扰我一段时间了,如下:自从我在网站中添加了第三方 iframe 后,分析推荐就变得疯狂,首先他们添加了虚假访问,但通过添加过滤器解决了这个问题。但引荐仍然没有像以前那样注册哪个
我的网站使用 Google Tag Manager 跟踪浏览量,并使用 ga('require', 'ec') 在某些页面中加载增强型电子商务插件,但有一个错误: Uncaught Reference
我正在尝试将 React-GA 添加到我的 create-react-app 项目中(它已被弹出),并且出现以下控制台警告。 [react-ga] gaTrackingID is required i
我正在页面的头部运行谷歌分析。为了提高性能,我在正文末尾加载其他代码,例如 facebook 或 jQuery 业务逻辑异步延迟。 如果 ga('set', 'contentGroup1', 'Cat
谁能解释一下: 1. ga、GA 和 Final Hibernate 版本之间的区别? 2.我应该使用 maven 存储库还是 jboss nexus 存储库? 3.为什么最新的兼容性矩阵 (http
这是网站 - http://www.ssangyong-favorit.ru/由于某种原因,此代码给我“GA 未定义”错误: ga.getAll()[0].get('clientId') 该网站通过
我们目前依赖于使用 UTM 参数(utm_source、utm_medium、utm_campaign、utm_term、utm_content)来实现 Universal Analytics 与 G
我正在使用 Google Tag Manager现在在我所有的网站上实现谷歌分析并在 future 证明它们适用于任何其他脚本。 我将 GTM 放在我的样板文件中。 有什么理由这可能不是好的做法吗?
在我的 Maven pom.xml 中,我有以下依赖项: org.hibernate hibernate-entitymanager 3.3.2.GA org.h
我正在优化我的 external Google Analytics script现在我想知道: https://www.google-analytics.com/ga.js 和 https://ssl
我们最近将 GA Premium 连接到 bigQuery,以导出 1 个属性和 1 个 View 中的所有非抽样数据。我们决定在我们的客户单一属性中使用未过滤的 View 来确保我们获得所有数据,但
我想跟踪谷歌分析中的一些更新而不是添加到分析数据中的值。 例如,如果我想跟踪所有用户的平均高分是多少,以便能够微调评分系统。 我可以在每次游戏退出时添加新的高分值,但它会是增量的,来自同一用户的旧数据
我有以下电子商务跟踪代码。我正在使用多个跟踪器。页面浏览量已正确跟踪,但当我查看电子商务报告时,没有数据通过。我错过了什么? (function (i, s, o, g, r, a, m) {
在我的登录页面的ajax调用中,如果它返回一个名为is_first_login = 1的参数,那么我需要调用ga()来发送GA事件。 此后,页面立即重定向到主仪表板页面。但不知道为什么,有时 ga()
我是一名优秀的程序员,十分优秀!