启发式算法中的合法解与可行解

参考文献:

[1] Cheng R , Gen M , Tsujimura Y . A tutorial survey of job-shop scheduling problems using genetic algorithms—I. representation[J]. Computers and Industrial Engineering, 1996, 30(4):983-997.

最近在看一些启发式算法求解经典问题的论文,发现几篇比较新的文献中对于合法解和可行解的定义有一些区别,想起来之前研究JSP时在文献[1]中看到了对于这两个名词的详细解释,又回头去翻了一遍。以免自己忘记,把自己的一些理解写下来,由于刚开始这一方面的学习,理解不一定准确。

文中对合法解与可行解的定义是围绕GA进行的,但我认为这一定义适用于所有启发式算法求解优化问题,因为在计算机实现算法的过程中,对于所有问题,都需要考虑解的编码与解码。编码指的是将问题中的解表现为一个数据结构(或者一个类),解码是指将前面那个数据结构(类)中保存的相关信息还原为一个解。因此对于解组成的解空间,会有一个对应的,由解空间中每个解的编码组成的编码空间。

放一张论文中的图,论文中的原话大概是“遗传算法的一个基本特征是它交替作用于编码空间和解空间:进化作用于编码空间(染色体),而评价作用于解空间,自然选择则联系了染色体与其解码解的性能” 。将这一思想从GA扩展到启发式算法,我的理解是:各类启发式算法(如局部搜索,禁忌,模拟退火,群体算法)在生成初始解,对初始解改进的过程中就是在编码空间中操作,具体这一改进好不好,则要转回解空间中进行评价,因此启发式算法也是交替作用于编码空间和解空间的。

论文中接着提到GA的一个关键问题是如何将解编码成染色体,这涉及到染色体的可行性,染色体的合法性,映射的唯一性。此处我们不考虑映射的唯一性,前两条对应到启发式算法中就是:编码的可行性,以及编码的合法性。

可行性是指这段编码所解码出的解是否位于给定问题的可行域。合法性是指一个编码是否代表一个给定问题的解决方案。这两句话比较抽象,根据论文中的一些描述我的理解如下。

以这篇论文中探讨的JSP的解为例:

编码的不可行性来源于约束优化问题的性质。比如对于一个有3道工序,按顺序在机器1,2,3上执行的工件来说,产生的编码给它安排为3,2,1的顺序,此时得到的解不满足约束,但通过修改约束中工件的加工顺序(由原来的1,2,3改为3,2,1)可以解决不满足约束的问题,此时编码的冲突来源于约束优化问题的性质,是不可行的。

编码的非法性来源于编码技术的本质,非法编码无法解码为解。比如一个3工件,3机器,3工序的问题,在对解采取基于工序的编码方式时,每个工件的3道工序分别依次在3台机器上进行,此时启发式算法在搜索过程中(不论是GA的杂交变异或LS算法),如果产生一个编码形如1,2,3,2,2,2,3,1,1,工件2出现4道工序,则这个编码无法解码为一个合理的策略,此时认为这个编码是非法的。

根据论文中的观点,下图中展示了它们的关系。

可以看到,编码空间中的编码,包含非法,不可行与可行三种情况。非法编码根本无法解码为一个解,因此它解码后的内容不包含在解空间中。解空间中包含不可行解和可行解,它们的区别主要是不可行解在一定程度上不满足问题的约束条件,而可行解一定是满足约束条件的。

以上是我自己对于合法解与可行解这两个概念的理解,不一定对。

原文地址:https://www.cnblogs.com/llee-123/p/11219143.html

时间: 2024-08-01 11:59:02

启发式算法中的合法解与可行解的相关文章

Android中Context详解 ---- 你所不知道的Context

转载至 :http://blog.csdn.net/qinjuning 前言:本文是我读<Android内核剖析>第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书. 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法 : 说它陌生,完全是 因为我们真正的不懂Context

Android中Context详解 ---- 你所不知道的Context (转载)

Android中Context详解 ---- 你所不知道的Context (转载) http://blog.csdn.net/qinjuning 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法 : 说它陌生,完全是 因为我们真正的不懂Context的原理.类结构关系.一个简单的问题是,一个应用

MySQL中EXPLAIN详解

MySQL中EXPLAIN详解 explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如:explain select username,first_name form hx,itlearner where a.id=b.id EXPLAIN列的解释: id:本次 select 的标识符.在查询中每个 select都有一个顺序的数值. select_type :查询类

Python中dict详解

yangyzh Python中dict详解 python3.0以上,print函数应为print(),不存在dict.iteritems()这个函数. 在python中写中文注释会报错,这时只要在头部加上# coding=gbk即可 #字典的添加.删除.修改操作dict = {"a" : "apple", "b" : "banana", "g" : "grape", "o&qu

winxp计算机管理中服务详解

winxp计算机管理中服务详解01 http://blog.sina.com.cn/s/blog_60f923b50100efy9.html http://blog.sina.com.cn/s/blog_b08c76100102vijm.html winxp计算机管理中服务详解02 http://blog.sina.com.cn/s/blog_60f923b50100efz3.html http://blog.sina.com.cn/s/blog_b08c76100102vijn.html

【转】 java中HashMap详解

原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接口的常用实现类,HashSet 是 Set 接口的常用实现类.虽然 HashMap 和 HashSet 实现的接口规范不同,但它们底层的 Hash 存储机制完全一样,甚至 HashSet 本身就采用 H

转:iOS中socket详解

一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要解决数据如何在网络

Linux系统中目录详解

1.Linux文件系统的层次结构 在Linux或Unix操作系统中,所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构. 文件系统的最顶层是由根目录开始的,系统使用"/"来表示根目录.在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含子目录文件.如此反复就可以构成一个庞大的文件系统. 在Linux文件系统中有两个特殊的目录,一个用户所在的工作目录,也叫当前目录,可以使用一个点"."来表示:另一个是当前目录的上一级目录,也叫父目录,可以使用两个

【转】declare-styleable的使用(自定义控件) 以及declare-styleable中format详解

原文网址:http://www.cnblogs.com/622698abc/p/3348692.html declare-styleable是给自定义控件添加自定义属性用的 1.首先,先写attrs.xml <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="TestAttr"> <attr name=&q