如何防止遗传算法收敛于局部极小值?

2023-12-21

我正在尝试使用遗传算法构建 4 x 4 数独求解器。我对值收敛到局部最小值有一些问题。我正在使用排名方法并删除排名底部的两个答案可能性,并将它们替换为排名最高的两个答案可能性之间的交叉。为了获得避免局部最小值的额外帮助,我还使用了突变。如果在特定的一代时间内没有确定答案,我的群体将充满全新的随机状态值。然而,我的算法似乎陷入了局部最小值。作为健身功能,我使用:

(空心方块总数 * 7(每个方块可能存在的违规行为;行、列和方框))- 违规总数

人口是一个整数数组的 ArrayList,其中每个数组都是基于输入的数独的可能结束状态。确定群体中每个阵列的适合度。

有人能够帮助我确定为什么我的算法收敛于局部最小值,或者推荐一种用于避免局部最小值的技术。任何帮助是极大的赞赏。

健身功能:

public int[] fitnessFunction(ArrayList<int[]> population)
{
    int emptySpaces = this.blankData.size();
    int maxError = emptySpaces*7;
    int[] fitness = new int[populationSize];

    for(int i=0; i<population.size();i++)
    {
        int[] temp = population.get(i);
        int value = evaluationFunc(temp);

        fitness[i] = maxError - value;
        System.out.println("Fitness(i)" + fitness[i]);
    }

    return fitness;
}

交叉功能:

public void crossover(ArrayList<int[]> population, int indexWeakest, int indexStrong, int indexSecStrong, int indexSecWeak)
{
    int[] tempWeak = new int[16];
    int[] tempStrong = new int[16];
    int[] tempSecStrong = new int[16];
    int[] tempSecWeak = new int[16];

    tempStrong = population.get(indexStrong);
    tempSecStrong = population.get(indexSecStrong);
    tempWeak = population.get(indexWeakest);
    tempSecWeak = population.get(indexSecWeak);
    population.remove(indexWeakest);
    population.remove(indexSecWeak);


    int crossoverSite = random.nextInt(14)+1;

    for(int i=0;i<tempWeak.length;i++)
    {
        if(i<crossoverSite)
        {
            tempWeak[i] = tempStrong[i];
            tempSecWeak[i] = tempSecStrong[i];
        }
        else
        {
            tempWeak[i] = tempSecStrong[i];
            tempSecWeak[i] = tempStrong[i];
        }
    }
    mutation(tempWeak);
    mutation(tempSecWeak);
    population.add(tempWeak);
    population.add(tempSecWeak);

    for(int j=0; j<tempWeak.length;j++)
    {
        System.out.print(tempWeak[j] + ", ");
    }
    for(int j=0; j<tempWeak.length;j++)
    {
        System.out.print(tempSecWeak[j] + ", ");
    }
}

变异函数:

public void mutation(int[] mutate)
{
    if(this.blankData.size() > 2)
    {
        Blank blank = this.blankData.get(0);
        int x = blank.getPosition();

        Blank blank2 = this.blankData.get(1);
        int y = blank2.getPosition();

        Blank blank3 = this.blankData.get(2);
        int z = blank3.getPosition();

        int rando = random.nextInt(4) + 1;

        if(rando == 2)
        {
            int rando2 = random.nextInt(4) + 1;
            mutate[x] = rando2;
        }
        if(rando == 3)
        {
            int rando2 = random.nextInt(4) + 1;
            mutate[y] = rando2;
        }
        if(rando==4)
        {
            int rando3 = random.nextInt(4) + 1;
            mutate[z] = rando3;
        }
    }

您看到快速收敛的原因是您的“交配”方法不是很好。通过得分最高的两个个体的“交配”,您总是会产生两个后代。想象一下,当新的后代之一与您的顶级个体相同时会发生什么(偶然,没有交叉,没有突变,或者至少没有对适应度产生影响)。一旦发生这种情况,前两个个体是相同的,这消除了交叉的有效性。

更典型的方法是更换每一代的每一个人。这里有很多可能的变化,但您可以随机选择两个父母的加权适应度。

关于人口规模:我不知道考虑到您的遗传表征和适应度函数,数独问题有多难,但我建议您考虑数百万个人,而不是数十个人。

如果您正在解决非常困难的问题,当您将种群放在二维网格上并从附近的个体中为网格中的每个点选择“父母”时,遗传算法会更有效。你会得到局部收敛,但每个局部都会收敛于不同的解决方案;你会得到网格局部聚合区域之间边界产生的大量变化。

您可能会想到的另一种技术是多次从随机群体中运行到收敛,并存储每次运行中的顶级个体。在建立了一堆不同的局部最小基因组后,从这些顶级个体中建立一个新的随机群体。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止遗传算法收敛于局部极小值? 的相关文章

  • 使用 Java 的 OpenId 提供者/服务器

    我正在尝试使用 OpenId 服务增强现有的 Java Web 应用程序 以便登录用户可以使用我的 Web 应用程序作为 OpenId 提供程序登录另一个启用 OpenId 的应用程序 My first attempt was to use
  • iText7:如何获取段落的实际宽度

    在添加到文档之前 我需要知道段落的宽度 以磅为单位 我在这里搜索并找到了 Alexey 关于段落高度的答案 所以我用宽度做了它 但它不起作用 无论段落有多长 始终返回矩形的宽度 我尝试了这段代码 private float getRealP
  • 32 位数字中 1 的数量

    我正在寻找一种在 32 位数字中包含 1 数量的方法 之间不使用循环 任何人都可以帮助我并向我提供代码或算法吗 这样做 提前致谢 See Integer bitCount int http java sun com javase 6 doc
  • Encog - 如何加载神经网络的训练数据

    The NeuralDataSet我在实际中看到的对象除了 XOR 之外什么都没有 它只是两个小数据数组 我无法从文档中找出任何内容MLDataSet 似乎所有内容都必须立即加载 但是 我想循环遍历训练数据 直到到达 EOF 然后将其算作
  • 缩短文本并仅保留重要句子

    德国网站 nandoo net 提供了缩短新闻文章的可能性 如果使用滑块更改百分比值 文本会发生变化并且某些句子会被遗漏 您可以在这里看到它的实际效果 http www nandoo net read article 299925 http
  • 如何调试内部错误?

    所以我有课Foo最终应该调整并重新加载类 它也有一个方法 private void redefineClass String classname byte bytecode ClassFileLocator cfl ClassFileLoc
  • javax.el.PropertyNotFoundException:在 java.lang.String 类型上找不到属性“tname”

    我之前使用的是 scriptlet 但现在我改用了 mvc 我无法检索 JSP 页面上的值并收到错误 javax el PropertyNotFoundException Property tname not found on type j
  • 何时使用 clone() 以及 addAll() 和 add() 的实际工作原理

    我正在使用 Java 和 MySQL 我的项目中有大约 60 个交易屏幕 我曾经用过add and addAll 复制的功能ArrayList 例如 List
  • Java ZIP - 如何解压缩文件夹?

    是否有任何示例代码 如何将 ZIP 中的文件夹部分解压到我想要的目录中 我已将文件夹 FOLDER 中的所有文件读取到字节数组中 如何从其文件结构创建 我不确定你所说的部分是什么意思 您的意思是在没有 API 帮助的情况下自己完成吗 如果您
  • 如何查找给定字符串中仅出现一次的第一个字符[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 自动检测log4j静态初始化错误的方法

    请注意 这更像是 Bash 问题 而不是 Java 问题 请参阅下面的注释 在每个类中配置log4j时 我们执行以下操作 public class Example private static final Logger log Logger
  • 测试 Hessian remoting-servlet.xml

    我们使用 Hessian 来实现富客户端和服务器之间的通信 由于移动和重命名 remoting servlet xml 中的条目有时会与实际的类名不匹配 因此 我正在寻找一种简单的方法来测试远程处理 xml 有没有简单的方法可以做到这一点
  • 如何自定义 JFrame 上的标题栏?

    我想在我的 Java Swing 桌面应用程序中拥有一个自定义的标题栏 最好的方法是什么 我可以通过在 JFrame 的构造函数中使用以下代码来使用 Swing 标题栏 this setUndecorated true this getRo
  • 在单独的模块中使用 Spring AOP 方面

    我在一个 Maven 项目模块中有一个方面 com x NiceAspect 在一个单独的 Maven 模块中有一个类 com x NiceClass 这些模块具有相同的 POM 父级 共同创建一个项目 我想要实现的目标是拥有一个通用的方面
  • 使用 https 的 Java Jersey RESTful Web 服务

    我是 Java EE 的新手 正在开发一个 RESTful API 其中每个 API 调用用户都会发送编码的凭据 我的问题是如何通过默认的 http 实现 https 协议并确保我的连接安全 我正在使用 Jersey Restful Web
  • 是否可以从 JBoss 容器中部署的所有 .war 文件中读取属性文件

    我已成功将 war 部署到 Jboss Web 容器 其中包含并读取位于 META INF groupid dir artifactid dir 下的 pom properties 为了访问该文件 我在同一 war 中的 JSP 中使用了以
  • java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException

    我想将 apache cli 添加到我的应用程序中 但我有问题 当我尝试运行它时显示这些错误 Error A JNI error has occurred please check your installation and try aga
  • Guava MultiSet 与 Map?

    我对Multiset的理解是一个带有频率的集合 但是我总是可以使用Map来表示频率 还有其他原因使用Multiset吗 优点Multiset
  • Java并发锁和条件的使用

    我可以用object wait object notify and synchronized blocks解决生产者消费者类型的问题 同时我可以使用locks and conditions from java util concurrent
  • Android,Volley请求,响应阻塞主线程

    使用 Volley 处理较大响应时会发生一些不好的事情 String url AppHelper DOMAIN service pages profile update json this infoTextView setText getS

随机推荐

  • OAuth 测试服务器/应用程序

    我正在考虑在 LabVIEW 中创建一个 OAuth 库 但是为了在开发过程中进行测试 我想使用一些测试服务器 而不会使现有的服务过载real用户 是否有这样的服务器或者是否有一个我可以自己运行的简单服务器应用程序 Linux 或 Wind
  • 如何在 TypeScript 中将类型参数设置为“nothing”?

    在我们的应用程序中 我们有一个数据 包装器 模式 其中我们使用类的单个实例来表示一些可能已加载或尚未加载的数据 像这样的事情 abstract class BaseWrapper
  • eclipse 中的 glassfish 似乎没有看到我的 JDK

    我试图让 glassfish 在 eclipse 中工作 并遇到 JRE vs JDK 错误 GlassFish v3 需要 JDK 1 6 而不是 JRE 请添加 选择 更正服务器属性 运行时环境 部分中的 JDK 我用谷歌搜索了一下 似
  • 有没有办法使 WPF 中的控件对鼠标事件透明?

    有没有办法让鼠标事件传递到后面的控件 当然可以 只需设置IsHitTestVisible False 在控制上 鼠标事件将通过它
  • didMoveToParentViewController 和 willMoveToParentViewController

    Apple 文档UIViewController says 如果您正在实现自己的容器视图控制器 它必须调用willMoveToParentViewController 调用之前子视图控制器的方法removeFromParentViewCon
  • 如何在放置在不同窗格/区域的两个节点之间绘制线

    我正在尝试画一棵家谱树 在我的树中 我存储了有关前伴侣的信息 所以人的面板 区域 应该看起来像这样 Z Z Z X Y 其中Z代表前伴侣 X代表波斯人 Y代表现任妻子 丈夫 现在我想画一条线来连接当前与孩子的关系 以及与孩子的关系 图形上
  • 在数据存储查看器中使用数字 ID 进行 GQL 查询

    我想构建 GQL 查询以使用其数字 ID 获取对象 我在应用程序管理控制台的数据存储查看器中执行此操作 因此无法使用 Model get by id numeric id 就像是 SELECT FROM Model WHERE id
  • 由于缺乏 PCRE 支持,R 源构建失败

    我正在尝试在 Ubuntu 14 04 下编译 R 3 3 1 尽管尝试安装 ubuntu pcre3 软件包以及 稍后 从源代码安装 pcre 8 37 但当我在 R 3 3 1 中运行 configure 时 我仍然收到以下信息 che
  • 从本地 pypi 索引中删除包

    这与此类似question https stackoverflow com questions 20403387 how to remove a package from pypi但有一个例外 我想从本地 pypi 索引中删除该包的一些特定
  • 从 Excel 替换 Word 书签内的图像

    我有一个打开的 Word 文档 其中有一堆书签 每个书签都有一个先前从 Excel 导出的 Excel 表格的内嵌图像 现在 我需要更新 Word 文档中的表格 因为它们在 Excel 中发生了更改 我这样做的方法是将 Excel 中的表名
  • Gradle:如何通过gradle执行git pull?

    我想在编译开始之前从 git repo 中提取更改 我找到了这个Gradle 如何在任务中克隆 git 存储库 https stackoverflow com questions 13719676 gradle how to clone a
  • 在三元运算符中使用 return

    我尝试在三元运算符中使用 return 但收到错误 Parse error syntax error unexpected T RETURN 这是代码 e this gt return errors e return array false
  • 如何在不使用
    的情况下从 css 换行?

    如何在不使用的情况下实现相同的输出 br p hello br How are you p output hello How are you 您可以使用white space pre https developer mozilla org
  • 这个Array slice调用的原型,为什么呢?

    我正在阅读 JS Function 的 MDN 页面论点多变的 https developer mozilla org en JavaScript Reference Functions and function scope argumen
  • 在 PHP 中使用 preg_grep() 查找字符串之前或之后的字符

    我需要使用 PHP 查找单词之前或之后的任何字符preg grep 来自数组 我有一个如下所示的数组 findgroup array aphp phpb dephpfs potatoes 我需要从数组中查找在单词 php 之前或之后 两侧
  • TotalResults 计数与 YouTube v3 搜索 API 返回的实际结果不匹配

    我们正在使用 youtube v3 搜索 API 我们发现 totalResults 计数与response items 字段中返回的项目列表不匹配 我在请求中请求 50 个视频 返回的响应显示 TotalResults 计数为 65 但响
  • 请解释一下 Amazon RDS/Mysql 中的这种内存消耗模式?

    Folks 有人可以解释运行 Mysql 的 Amazon RDS 上的这种内存消耗模式吗 在此图中 我在 03 30 升级到了 db m2 2xlarge 具有 34GB 可用内存 您可以非常清楚地看到切换 当客户端开始连接并访问该实例时
  • 空间数据类型(几何)到 GeoJSON

    我想转换geom geometry 数据类型转换为 GeoJSON 我怎么能这么做呢 例如 WKT 中的几何图形 POLYGON 455216 346127297 4288433 28426224 455203 386722146 4288
  • 在 Groovy 中动态添加元素到 ArrayList

    我是 Groovy 的新手 尽管阅读了很多有关此的文章和问题 但我仍然不清楚发生了什么 据我目前的了解 当您在 Groovy 中创建一个新数组时 底层类型是 Java ArrayList 这意味着它应该是可调整大小的 您应该能够将其初始化为
  • 如何防止遗传算法收敛于局部极小值?

    我正在尝试使用遗传算法构建 4 x 4 数独求解器 我对值收敛到局部最小值有一些问题 我正在使用排名方法并删除排名底部的两个答案可能性 并将它们替换为排名最高的两个答案可能性之间的交叉 为了获得避免局部最小值的额外帮助 我还使用了突变 如果