没有合适的资源?快使用搜索试试~ 我知道了~
1网址:http://www.elsevier.nl/locate/entcs/volume64.htmlJACK:一个Java约束工具包埃克哈德·克尔·斯利姆·阿贝作者:MatthiasSaft,Matthias Schmauss慕尼黑大学计算机科学系http://www.pms.informatik.uni-muenchen.de/software/jack摘要大多数提供约束设施的现有库都嵌入在逻辑编程语言Prolog或面向对象语言C++中。最近,有人提出了一些在Java中集成约束处理的建议。这项工作的目标是为Java提供一个新的约束库,称为JACK。它包括一个高级语言,用于编写约束求解器,一个通用的搜索引擎和一个工具,以可视化的简化和传播的约束。1介绍约束编程技术已经成熟到这样的程度,有可能将一些基本功能分离出来,并将它们作为库或干净地嵌入到通用主机编程语言中。目前,大多数约束系统要么是编程语言(通常是Prolog)的扩展,例如Eclipse,要么是与传统编程语言(通常是C或C++)一起使用的库,例如BLOGSolver。由于Java的日益普及和互联网的可能性,在Java中提供约束处理以实现应用服务器(例如用于计划或调度系统)的兴趣很大。最近,已经提出了一些建议,将约束编程的优点与编程语言Java的优点结合起来。声明式Java(DJ)[18]提供了Java的语法扩展以支持约束编程。DJ是专门设计来简化GUI和Java小程序的过程。JSolver [4]是一个Java库,它提供了构建约束的类和解决这些约束的策略。因此,可以使用整数和布尔类型的变量。c 2002年由Elsevier Science B出版。诉在CC BY-NC-ND许可下开放访问。2Java约束库(JCL)[15]提供了几种算法来解决二进制约束满足问题。在本文中,我们提出了一个新的Java库提供约束编程功能。该库被称为JACK(JAVA约束工具包),由三个部分组成:Java约束处理规则(Java Constraint Handling Rules):一种用于编写应用程序特定约束求解器的高级语言可视化工具:一个可视化JQuery计算的交互式工具JASE(Java Abstract Search Engine):一个用于Java解决约束问题的通用搜索引擎本文的结构如下。在第二节中,我们简要介绍了约束逻辑程序设计的思想。在第3节中,我们介绍了Java的语法和语义。在第4节中,我们介绍了Jobserver 计算的可视化工具。第5节介绍了Java 抽象搜索引擎JASE。最后,我们总结了未来的工作方向2约束(逻辑)编程约束编程是基于这样一种思想,即许多有趣的和困难的问题可以用变量和约束来表达。这些变量的范围是一组(nite)值,通常表示要采取的替代决策。约束表示为变量子集上的关系,并限制变量的容许值组合。约束可以通过列出所有可能的元组来显式地给出,或者通过以某种(比如数学)形式描述关系来隐式地一个解决方案是将变量分配给满足所有约束的值约束规划可以在许多不同的域上表示,如有理数上的线性项,布尔代数,有限/无限集合或区间上的浮点数。非常有趣的发展是可能的大多数这些领域或更一般的领域独立的约束求解器。约束逻辑程序设计(CLP)是约束程序设计范例中发展最快的一种[10,11].在过去的15年里,CLP已经从一个基本的研究思想发展成为一个强大的编程范式。CLP将逻辑程序设计的声明性与约束求解的有效性结合起来。约束求解是控制约束之间相互作用的机制。每个约束都可以在其变量的可变域上推导出必要条件。用于这种约束推理的方法取决于约束,在Nite域情况下,它们的范围从一般的但更确切地说是语法推理规则到算法的复杂组合3用于全局约束。每当约束更新变量时,约束传播将唤醒所有相关约束以检测进一步的结果。最初,约束求解是用一种低级语言编写的内置约束求解器中的“硬连线”,称为“黑盒”方法。虽然这种方法很有效,但它使得在一个新的域上修改求解器或构建求解器变得困难,更不用说对它进行推理和分析了。由于求解器的边界既不能由用户检查,也不能由计算机解释,因此基于约束的程序的调试是困难的此外,从实际应用中得到的一个教训是,约束通常是异构的,并且是特定于应用的。已经提出了几项建议,约束求解器的灵活性和定制性,通常称为“玻璃盒”方法[5,16]。最具深远意义的建议是“无框”方法:约束处理规则(Constraint Handling Rules,缩写为REQ)[7]。3Java约束处理规则约束处理规则(英语:Constraint Handling Rules)[7]是一种高级语言,特别设计用于从头开始编写约束求解器或通过修改前约束求解器来编写约束求解器。XML允许使用规则为用户定义的约束指定和实现传播和简化。使用JavaScript,可以将这些约束引入到给定的宿主语言中大多数的JavaScript 库 都是 用逻 辑 编程 语 言实 现的 , 例 如Eclipse [8] 或 SicstusProlog [9]。在下面,我们将介绍一个Java中的JavaScript实现。我们称这种语言为Java约束处理规则(Java Constraint Handling Rules)。3.1J求解器Java constraint handler(也称为constraint solver)是由关键字handler引入的,后面是handler的名称和写在花括号中的handler代码(从Java中已知的处理程序leq {...}一个Java约束处理程序由三个部分组成:声明、规则和目标(按此顺序)。约束的目标是可选的,而没有声明约束和规则的处理程序没有多大意义。有两种方法可以使用用Java编写的约束处理程序:从Java调用它或使用目标独立运行它前者通常用于全边缘应用程序,而后者有助于测试和不需要搜索的小示例(JASE库,请参见第5节)。当从Java中使用时,约束处理程序的目标将被忽略。出现在约束中的变量称为逻辑变量。逻辑变量和类实例必须在规则部分的开头和4目标部分中每个目标的开头。3.1.1简体中文在声明部分,Java类被导入,约束的签名被声明。在签名和规则或目标的代码中需要Java类。这些约束将在规则部分中实现。在Java中,每个声明都由一个子声明完成。类导入是由关键字class后跟类名定义的,因为它可以在类路径中找到。以下代码中使用的所有类都需要导入,包括约束签名中提到的类。约束是由关键字constraint声明的,后面跟着约束的名称及其参数类型(很像Java方法):处理程序leq {类IntUtil;类IntUtil;constraint leq(java.lang. js,java.lang.js,java.lang.js);3.1.2规则在规则部分,首先声明变量和类实例,然后实现简化约束的规则变量由关键字variable定义,后跟类型和变量名:处理程序leq {规则{变量java.lang. X,Y,Z;...}}这些规则描述了约束的传播和简化。和其他的编译库一样,有三种规则:ifGuard{Head}<=>{Body}Name;传播规则的形式如下:ifGuard{Head}==>{Body}Name;简单规则的形式如下:如果Guard{Head 1\Head 2}<=>{Body}Name;我们区分了用户定义的约束和内置的约束。用户定义的约束是那些由规则定义和实现的约束,内置约束是那些已经由Java库提供的约束。内置的约束是true和false,第一个总是成立,第二个永远不成立。此外,语法相等=是作为内置约束提供的,并且可以应用于常量和逻辑变量,而不管它们的类型,只要两者都5参数具有相同的类型。 如果在等号=的右边调用方法,则返回类型需要等于左边对象的类型。规则有一个可选的名称Name,它是一个Java标识符。除此之外,一条规则还包括一个可选的守卫,一个头部(左手边)和一个身体(右手边)。 这些部分都是使用in x运算符的合取词&&。 头Head是用户定义的约束的连接。警卫是可选的。如果存在的话,该保护是内置约束和Java方法的结合如果守卫不在场,它与守卫真实的含义相同。Body是用户定义的约束、内置约束和Java方法的结合。3.1.3目标通常,如果约束求解器必须独立运行,则存在目标部分. 如果从Java使用处理程序,则忽略目标目标部分由一个或多个目标组成。每个目标都有一个名称,并由关键字goal引入。目标由变量和类实例的声明组成,后面跟着目标本身。Java目标是约束和Java方法的命名连接(类似于规则体)。目标g1 {变量java.lang.integer X,Y,Z;leq(X,Y)leq(Z,X)leq(Y,Z)&&&&}目标g2 {...}3.2语义在当前实现中,使用两种不同类型的存储。一个存储区包含用户定义的约束,另一个存储区包含内置约束。请注意,Java方法是作为内置约束处理的每次用户定义的约束被激活(发布或唤醒)时,它都会检查自己出现的规则的适用性。这样的约束称为(当前)活动约束。约束存储中的所有其他约束都被称为(当前)被动约束。构造标准部件.规则适用性的一个方面是找到规则头部的实例。因此,每个规则的头部都与活动约束相匹配。如果头部由多个约束组成,则在用户定义的约束存储中搜索零件约束,以匹配其他头部。如果匹配成功,即活动约束和最终伙伴约束的合取是规则头部的实例,则执行保护。否则,尝试下一个规则。6警卫警戒是规则适用性的先决条件。 守卫要么成功要么失败。如果守卫的执行成功,则守卫成功。执行一个空的警卫总是成功的。守卫的执行可能不会对头部或主体中使用的变量产生任何影响。如果守卫成功了,规则适用了,我们就遵守它,否则,它失败,并尝试下一个规则。身体 如果环形规则是简化规则,则从用户定义的约束存储中移除匹配的约束。传播规则的所有匹配约束都保存在存储中。一旦传播红色的,它不会再次使用相同的用户定义的约束组合。简单规则是一种混合规则。从存储器中移除与在运算符n之后的简化规则的头约束相匹配的所有约束。与其他头部约束匹配的约束将被保留。在任何情况下,执行环规则的主体,即主体的用户定义的约束存储在用户定义的存储中,并且主体的内置约束存储在内置约束存储中。如果尚未删除当前活动的约束,则尝试下一个规则(重新)暂停。 如果已尝试所有规则,但尚未移除活动约束,则它将挂起(这意味着它将插入用户定义的约束存储中),直到重新激活它。在这种情况下,所有规则都将再次尝试。3.3例如我们将通过下面的示例来说明JPENDIX的语法和语义(参见附录A,了解JPENDIX中的Nite域求解器的实现我们定义了一个用户定义的约束小于或等于,leq/2。假设语法相等=是一个内置约束。{ class IntUtil;constraint leq(java.lang. js,java.lang. js); rules{变量java.lang. X,Y,Z;{ leq(X,X)}<=>{true }自反性;{ leq(X,Y)&&leq(Y,X)}<=>{X=Y}反对称;{ leq(X,Y)leq(Y,Z)}==>{ leq(X,Z)}传递性;&&{ leq(X,Y)&\leq(X,Y)}<=>{ true }恒等式; if(IntUtil.ground(X)IntUtil.ground(Y))&&{ leq(X,Y)}<=>{IntUtil.le(X,Y)}接地;}目标g1 {变量java.lang. X,Y,Z; leq(X,Y)leq(Z,X)leq(Y,Z)&&&&7}}第一行说明这是求解器leq的定义。在声明部分,约束leq由关键字constraint定义。约束leq需要两个类型为java.lang.lang.lang.的参数。在规则部分中,声明了类型为java.lang.java的三个变量X、Y和Z它们仅由规则部分中定义的规则使用。规则部分实现了自存性、反对称性、传递性、幂等性和基本规则。反存在性规则表明leq(X,X)在逻辑上为真。因此,每当我们看到约束leq(X,X)时,我们可以将其简化为真。反对称规则意味着,如果我们在当前存储器中找到leq(X,Y)以及leq(Y,X),我们可以用逻辑等价的X=Y替换它们。传递性规则传播约束。它指出合取词leq(X,Y),leq(Y,Z)蕴涵leq(X,Z)。在操作上,我们添加逻辑结果leq(X,Z)作为冗余约束。等势规则吸收同一约束的多次出现。它可以用一个简单的规则来表示。基本规则规定,如果X和Y的值是已知的,那么约束leq(X,Y)可以由IntUtil类提供的Java方法IntUtil.le(X,Y)替换。在目标部分中,陈述了目标leq(X,Y)、leq(Z,X)、leq(Y,Z)。前两个约束导致传递性规则为re和addleq(Z,Y)。 这个新的约束与leq(Y,Z)一起匹配反对称规则的头部。所以这两个约束被Y=Z代替。内置的等式应用于目标的其余部分,leq(X,Y),leq(Z,X),得到leq(X,Y),leq(Y,X)。 反对称规则适用,导致X=Y。目标不再包含不平等,过程停止,目标的结果是X=Y,Y=Z。3.4JENUS的结构Java原型开发环境由几个组件组成。Java程序由Java编译器翻译成Java代码。它生成的Java代码旨在集成到Java应用程序或小程序中。为了为Java提供JQuery,我们实现了一个评估器,它能够解释用JQuery构建的信息。它被称为JAPAN评估器。用Jobserver编写的约束求解器基于一个通用的约束系统。该系统接收关于所使用的变量、规则和目标的信息。在Java中,它由类ConstraintSystem的实例表示。这个类也是求值器的主要部分4视觉艺术VisualStudio是一个支持用Java语言编写的约束求解器开发的工具。它可用于调试和提高约束求解器的效率。VisualBasic还可以用来理解约束的细节8Fig. 1. 子框视图传播方法和不同约束的相互作用,通过Java实现。因此,它适合不同专业水平的用户。可视化工具提供了丰富的功能来交互地显示、检查、重新排列和操作图形,包括改变图形显示的粒度以及压缩用户当前视图中未包含的内容。关注焦点[1]。约束传播的可视化取决于悬挂物的表示。一方面,约束存储可以由一组子框表示,其中每个子框仅由一个约束组成。我们称这种表示为子盒视图。另一方面,约束存储可以用一个包含其所有约束的框来图形化地表示。我们称这种表示为框视图。4.1子框视图在图1中,目标leq(X,Y)、leq(Z,X)、leq(Y,Z)在子框视图中表示。图中的每个大节点代表一个单独的约束。这些节点称为约束节点。小节点表示规则并包括它们的名称。它们被称为规则节点。单击鼠标可以在规则名称的显示和规则的实际代码的显示规则节点连接在规则的应用中涉及的约束节点:规则所应用的约束导致规则,并且从规则存在到由规则添加的约束的边。如果规则删除了约束,则连接边为蓝色。如果应用了内置约束来环形规则,则边缘为灰色。在图1中,第一行显示了插入到约束存储中的目标约束leq(X,Y)、leq(Z,X)和leq(Y,Z)。在第一步中,将传递性规则应用于约束leq(X,Y)和leq(Y,Z),从而生成新的约束leq(X,Z)。两个约束9图二.进一步评估步骤leq(X,Y)和leq(Y,Z)保留在约束存储中。在第二步中,传递性规则被应用,这一次应用于约束leq(X,Y)和leq(Z,X),它们也保留在存储中。添加新约束leq(Z,Y)。在图2中,第三步显示了应用于约束leq(Z,X)和leq(X,Z)的反对称规则的应用。这两个用户定义的约束由规则应用程序从约束存储中删除添加了新的内置约束Z=X在下一个评估步骤中,将反对称规则应用于两个约束leq(X,Y)和leq(Y,Z)。 这两个约束被规则应用程序删除,并插入内置约束X=Y。 图3显示了最后一个评估步骤的状态。反射性规则被应用于约束leq(Z,Y)。此约束将被移除,并插入内置约束true。 由于Z =X和X=Y,Z=Y成立,因此在此可以应用该规则。 所有用户定义的约束现在都标记为已删除,只有内置约束Z=X、X=Y和true保留。现在不再有适用的规则,评估终止。 解是Z=X,X=Y。4.2箱视图在图4中,目标leq(X,Y)、leq(Z,X)、leq(Y,Z)在框视图中表示。 每个计算步骤后约束存储区的全部内容表示为一个单独的节点,称为存储节点。由于所有的约束在同一时间显示在自己的大节点,该图只是一个链约束存储和规则应用程序。规则的应用在约束存储中的约束之间引入了依赖关系。这种关系可以通过标记一个或多个约束来显示,这些约束会导致规则以不同的颜色显示。 应用了规则的约束以“激发”颜色显示。可视化工具具有其他功能,例如将节点隐藏到ab中。10图三. 最后评估步骤见图4。 箱视图从当前不相关的细节中删除(图4)。4.3执行问题Visual Studio是用Java实现的。实施分为两个部分:布置和绘制图表。这包括对缩放图形的支持,以及对隐藏和取消隐藏节点的支持11用户界面提供菜单、光标控制、状态栏、. . . .用户界面是使用swing类实现的。5Java抽象搜索引擎通常,约束求解不足以解决组合问题。约束求解必须与搜索相结合,搜索通常用于为变量赋值。在每个赋值步骤之后,约束传播限制剩余变量的可能值,删除不一致的值或检测失败。如果检测到失败,搜索返回到先前的决策并选择替代方案。大多数现有的库和语言要么只有深度- RST搜索,例如CHIP[6],或者通过特殊目的的语言结构支持不同搜索算法的编程,例如 Oz [14]或CLAIRE [2]。Figaro[3]提出通过将约束存储表示为数据对象来支持C++库中的可编程搜索算法。我们的工作受到费加罗系统的启发 我们提供了一个抽象的搜索引擎,称为JASE(发音为“chase”,因为它“chases a solution”),它实际上是为Java设计的,但可以用于任何Java约束库。 JASE之所以被称为抽象的,是因为它对可以用它实现的搜索策略没有任何限制{它是一个用于多种可能算法的框架。下面,我们通过一个小例子来描述JASE。1有关详细信息,请参阅http://www.pms.informatik.uni-muenchen.de/software/jack。在下文中,我们使用了在Java中实现的nite域求解器(完整代码见附录A有限域用枚举或区间表示在枚举域中,所有值都被列出(X 2 D,其中X是变量,DN是自然数的子集(域))。这样的约束的文本表示被写为fdEnu(X,D)。区间整环指定整环(X2 [Min;Max])的上、下界.这种约束的文本表示形式写为fdInt(X,Min,Max)。在使用Java时,最重要的Java对象是ConstraintSystem,它封装了约束求解器、约束存储和所有规则。它是宿主代码使用的主要对象String s =new String();必须在约束系统中插入规则;这可以通过创建约束处理程序来完成。fdList fdList =new fdList();fd.defineRules(cs);1本例中的所有代码片段都是一个连续的源代码块,它们只是被分开以插入解释文本。地点,在…“,与搜索无关,并且只包含实现细节。12约束变量由Object类型的Java对象表示。 它们与类型和名称相关联。ObjectX = new Object();cs.addVariable(X,“java.lang. xml”,“X”);建 立 约 束 系 统 的 最 后 一 步 是 使 用 ConstraintSystem 的addGoalConstraint方法插入初始约束。这里,创建约束fdEnu(X,[2,3,4,5,6])并将其插入到约束存储中:cs.addGoalConstraint(new FDENUConstraint(X,RISTOList(2,6);目前,搜索引擎正在建设中。在这个特殊的例子中,变量X的值应该简单地枚举。因此,创建了一个包含变量的容器:System. out. println(); System. out. println();下一行创建了一个对象,该对象定义了在搜索过程中遇到的每个解决方案应该发生什么。System. out. println =new System. out. println();收集器将所有解决方案累积到一个容器中供以后使用;它应用于搜索树(\solutions”)的所有成功叶。搜索最重要的部分是在每个节点上做出的选择:SCoicerootChoice=new SFDEnuChoice(vars,collector,.);rootChoice是搜索树的根。它负责创建更多的选择,实际上它在搜索过程中修改和运行约束系统。示例中使用的SFDEnuChoice从左到右枚举变量,没有特定的启发式。现在,探索搜索树的方法被定义了(深度-第一搜索).S勘探勘探=新SDepthFirstExploration(cs,rootChoice);运行搜索,查找所有解决方案。boolean success= SSP.all(exploration);最后,所有的解决方案都可以显示或以其他方式处理。System.out.println(collector.toBeautifulString());6结论与未来工作在本文中,我们描述了一个库,称为JACK,它提供了约束编程的主机语言Java。JACK由一个高级语言JASON来编写约束求解器,一个可视化工具VisualBasic来可视化由JASON求解器定义的约束的传播和简化,以及一个通用的搜索引擎JASE组成13Jesus提供了几个经典的约束求解器,例如nite域,布尔,线性多项式和区间算术。为了评估我们的搜索引擎,我们已经实现了几个需要搜索的例子,例如,具有无攻击约束的N-皇后问题,使用Regin [12]提出的算法的具有全局alldifferent约束的N-皇后问题,来自[17]的Schur引理,这是约束CSPLib问题库的一部分请注意,alldifferent-约束是在独立于Java的Java类中实现的这个例子显示了JPEG2编写的求解器和Java编写的求解器的组合的容易性这些例子和更多可以在http://www.pms.informatik.uni-muenchen.de/software/jack进一步发展的主要领域将是提高性能:虽然评估器的速度已经有了很大的提高,但与用C++实现的约束系统相比, 也许可以调整所采用的数据结构和算法,以更好地利用Java特性(例如,通过抑制频繁创建临时对象,或通过改进克隆操作)。 也许某些关键部分甚至可以(可选地)通过JNI在C++中实现;例如,像ObjectContainer或nl2实用程序类这样的关键结构未来工作的另一个方向是实现搜索树的可视化工具,就像Oz [13]所做的那样。将此工具与VisualStudio结合将是下一个挑战。引用[1] S. Abdennadher和M.安全约束处理规则的可视化工具第十一届逻辑程序设计环境研讨会,WLPE'01,2001。[2] Y. Caseau,F. X. Josset和F.拉博特Claire:结合集合、搜索和规则来更好地表达算法。载于ICLP 99,1999年。[3] T. 咀嚼,M。Henz和K.Ng. 基于约束的推理引擎工具包在声明性语言的实践方面,2000年。[4] A.阿俊Java中的约束编程与JSolver 约束逻辑编程,1999年。[5] P. Codognet和D.迪亚兹使用clp(FD)求解布尔约束在D. Miller,editor,Logic Programming - Proceedings of the 1993 InternationalSymposium,Vancouver,Canada.麻省理工学院出版社。[6] M. Dincbas,P. V. Hentenryck,H. Simonis,A. Aggoun和A.赫罗德CHIP系统:Prolog中的约束处理In M.Stickel,编辑,Proceedings of the十国际 会议 对 第449章.Springer-Verlag,1990.2nl是一个实现嵌套(链接)列表的类。14[7] T. Fruh. 约束处理规则的理论与实践,特别是约束逻辑程序设计的理论与实践. Journal of Logic Programming,37(1-3):95{138,October 1998.[8] T. Fruh和P. 你好。约束处理规则的高级实现。技术报告,欧洲理事会人权中心,1995年。[9] C. Holzbaur和T. Fruh. 一个prolog约束处理规则的编译器和运行时系统. 应用人工智能杂志,第369页,2000年。关于约束处理规则的特殊问题。[10] J.Ja ar和 M. J·马 赫 约 束 逻 辑 程 序 设 计 : 一 个 调 查 。 Journal of LogicProgramming,20,1994。[11] K. Marriott和P. Stuckey。编程与约束:介绍。MIT Press,1998.[12] J. - C.雷金CSP中差异约束的筛选算法。在AAAI-94的Proc.,第362页,第367页,Seattle,WA,1994.[13] C. 舒尔特盎司 探险家: 一 视觉 约束 编程 工具. 在L. Naish , 编 辑 , Proceedings of the Fourteenth International Conference onLogic Programming , 第 286{300} 页 , 比 利 时 鲁 汶 , 1997 年 7 月 。 MITPress,Cambridge,MA,USA.[14] G.斯莫尔卡Oz编程模型计算机科学讲义,1000, 1995。[15] M.托伦斯河Weigl和B.费廷斯Java约束库:使用Java语言将约束技术引入互联网。载于1997年限制因素和代理问题讲习班的工作说明[16] P. van Hentenryck.约束逻辑编程。知识工程评论,1991年6月。[17] T. 沃 尔 什 CSPLIB 问 题 15 : 舒 尔 引 理 。 互 联 网 : http :users.cs.york.ac.uk/~tw/csplib/prob/prob015/index.html。[18] N. Zhou,S. Kaneko和K.山内DJ:基于Java的约束语言和系统。JSSST年度会议,1998年。一有限域求解器在Java中的实现在本节中,我们展示了用Java编写的nite域求解器的一个剪切部分,以及目标X2f 2; 3g ^Y2f 1; 2g ^XY的可视化(图A.1)。处理程序FD{类IntUtil;类IntUtil;15class nl;//链表类NlIntUtil;类FDUtil;类约束系统;constraint fdEnu(java.lang. lane,nl); constraint fdInt(java.lang.lane,java.lang.js,java.lang.js);constraint fdLe ( java.lang. js , java.lang. js ) ;constraint fdLt ( java.lang. js , java.lang. js ) ;constraint fdNe(java.lang. js,java.lang. js);规则{变量java.lang. X,Y,Z;变量java.lang. Min,Max;变量java.lang. MinX,MinX 1,MinY;变量java.lang. MaxY,MaxY 1,MaxX;变量nl L,L1,L2,L3,L4,L5,L 6;变量FDAllDiffAD;//失败if(nl.isEmpty(L)){ fdEnu(X,L)}<=>{ false }失败;//intersection{ fdEnu(X,L1)}&& fdEnu(X,L2)}=>{L =nl.intersection(L1,L2)fdEnu(X,L)} intersection;&&//与interval的交互{ fdEnu(X,L)fdInt(X,Min,Max)}=>{ L1= NlIntUtil.removeLower(Min,L)L2=NlIntUtil.removeHigher(Max,L1)fdEnu(X,L2)}相交2;&&&&//与不等式的交互if ( nl.notEmpty ( L1 ) MinX =NlIntUtil.minList ( L1 )nl.notEmpty ( L2 ) MinY =NlIntUtil.minList ( L2 )IntUtil.gt(MinX,MinY)){ fdLe(X,Y)fdEnu(X,L1)fdEnu(Y,L2)}==>{MinX =NlIntUtil.minList(L1)16&&MaxY =NlIntUtil.maxList(L2)&&17fdInt(Y,MinX,MaxY)} leMin;if ( nl.notEmpty ( L1 ) MaxX =NlIntUtil.maxList ( L1 )nl.notEmpty ( L2 )MaxY =NlIntUtil.maxList ( L2 )IntUtil.gt(MaxX,MaxY)){ fdLe(X,Y)fdEnu(X,L1)fdEnu(Y,L2)}==>{MinX=NlIntUtil.minList ( L1 )&&MaxY=NlIntUtil.maxList(L2)fdInt(X,MinX,MaxY)}leMax;&&if ( nl.notEmpty ( L1 ) MinX =NlIntUtil.minList ( L1 )nl.notEmpty ( L2 ) MinY =NlIntUtil.minList ( L2 )MinX1 =IntUtil.inc(MinX)&&IntUtil.gt(MinX1,MinY)){ fdLt(X,Y)fdEnu(X,L1)fdEnu(Y,L2)}==>{MinX =NlIntUtil.minList(L1)&&MinX1 =IntUtil.inc(MinX)&&MaxY =NlIntUtil.maxList(L2)fdInt(Y,MinX1,MaxY)}ltMin;&&if ( nl.notEmpty ( L1 ) MaxX =NlIntUtil.maxList ( L1 )nl.notEmpty ( L2 )MaxY =NlIntUtil.maxList ( L2 )MaxY1 =IntUtil.dec(MaxY)&&IntUtil.lt(MaxY1,MaxX)){ fdLt(X,Y)fdEnu(X,L1)fdEnu(Y,L2)}==>{MinX =NlIntUtil.minList(L1)&&MaxY =NlIntUtil.maxList(L2)&&MaxY1 =IntUtil.dec(MaxY)fdInt(X,MinX,MaxY1)} ltMax;&&//与fdNe的18if(NlIntUtil.member(X,L)){ fdNe(X,Y)&& fdEnu(Y,L)}=>{ L1= NlIntUtil.remove(L,X)fdEnu(Y,L1)} ne1;&&19if(NlIntUtil.member(X,L)){ fdNe(Y,X)&& fdEnu(Y,L)}=>{ L1= NlIntUtil.remove(L,X)fdEnu(Y,L1)} ne2;&&if(NlIntUtil.notMember(X,L)){ fdEnu(Y,L)&\fdNe(X,Y)}<=>{ true } ne3;if(NlIntUtil.notMember(X,L)){ fdEnu(Y,L)&\fdNe(Y,X)}<=>{ true } ne4;//fdLe,fdLt平凡约束{ fdLe(X,Y)fdLe(Y,X)}<=>{X =Y } leLe;&&{fdLt(X,Y)fdLt(Y,X)}=>{false} ltLt;}目标G1{变量java.lang. xmlx,Y;fdEnu ( X , new nl ( 2 , newnl(3)fdEnu (Y,new nl (1,newnl(2)fdLe(X,Y)&&&&}}图A.1. 目标的可视化
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Java集合ArrayList实现字符串管理及效果展示
- 实现2D3D相机拾取射线的关键技术
- LiveLy-公寓管理门户:创新体验与技术实现
- 易语言打造的快捷禁止程序运行小工具
- Microgateway核心:实现配置和插件的主端口转发
- 掌握Java基本操作:增删查改入门代码详解
- Apache Tomcat 7.0.109 Windows版下载指南
- Qt实现文件系统浏览器界面设计与功能开发
- ReactJS新手实验:搭建与运行教程
- 探索生成艺术:几个月创意Processing实验
- Django框架下Cisco IOx平台实战开发案例源码解析
- 在Linux环境下配置Java版VTK开发环境
- 29街网上城市公司网站系统v1.0:企业建站全面解决方案
- WordPress CMB2插件的Suggest字段类型使用教程
- TCP协议实现的Java桌面聊天客户端应用
- ANR-WatchDog: 检测Android应用无响应并报告异常
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功