MindOpt APL建模语言自定小义函数的重要性和示例

在编程和建模语言中,函数是一段独立的、可重复使用的代码块,用于执行特定任务。在MindOpt APL中,自定义函数的使用非常重要,因为它们提高了建模过程的效率、可读性和灵活性。

为何使用def自定义函数:

  1. 可重用性:定义函数允许我们在模型中的多个位置重复使用相同的逻辑或计算,既减少了重复代码的编写工作量,还确保了逻辑的一致性。
  2. 维护:随着模型变得更加复杂,维护起来可能会很困难。自定义函数使得逻辑变得模块化,可以单独测试和修改函数,而不必担心影响模型的其他部分。
  3. 清晰的逻辑片段:自定义函数创建了清晰定义的逻辑片段,这些片段可以在理解和调试模型时轻松定位和识别。
  4. 提高模型的模块化:通过def关键字定义的函数促进了模型的模块化,使得模型更容易管理和扩展,同时也便于适应不断变化的业务需求。
  5. 优化特定计算:def关键字定义的函数可以包含复杂的计算逻辑,使得这些逻辑从模型的主体中分离出来,有利于优化和改进特定计算。

MindOpt APL中的def自定义函数示例:

  1. 定义一个返回数值的小函数
def f(x) = if x>10 then x-1 else x+1 end;
check f(1) == 2;
check f(11) == 10;def g(x) = x*x;
check g(2) == 4;
  • 小函数 f,它接受一个参数 x。如果 x 大于 10,函数返回 x-1;否则返回 x+1。
  • 小函数 g,它计算参数 x 的平方。

  1. 定义一个返回真假的小函数
  • 例子1:
clear model; # 清空MAPL工作空间的模型set I:= {1,2,3,4,5,6};
def f(x) :=  x in I;check f(1);
check f(2);
check not f(10);
  • 小函数f,它接受一个参数x,并判断x是否属于集合I。然后我们使用check语句进行验证和测试,确保f函数的功能正常。在这个例子中,我们分别检查了f(1)、f(2)和f(10)的结果,验证了f函数的正确性。
  • 例子2:
clear model; # 清空MAPL工作空间的模型param flow = (1,2) 1, (2,2) 2;
set edge = {(1,2), (2,2)};
def f(x) = sum{(o,x) in edge} : flow[o,x];
check f(2) == 3;
  • 小函数f,它接受一个参数x,并计算指定节点和其他节点之间的流量总和。
  • 例子3:
clear model; # 清空MAPL工作空间的模型set I := 1 .. 5;
set J := 1 .. 3;
var x[I*J] >= 0;
def dist(a,b) := a*a + b*b;
subto c2: sum {(i,j) in I*J }  dist(i,j) * x[i,j] >= 0;
  • 小函数dist,它接受两个参数a和b,并计算它们的平方和。

  1. 定义部分目标
clear model; # 清空MAPL工作空间的模型param a := 5;
var b >= 0 <= 1;
def sum1(x) := sum{i in 1..x} i;
minimize obj: (sum1(a)) * b ;
  • 小函数sum1,接受一个参数x。函数的作用是计算从1到x所有整数的累加和

  1. 定义动态集合
clear model; # 清空MAPL工作空间的模型set K = 3 .. 7;
var y[K] >= 0;def goodone(a,b) := a > b;
def bigger(i) := {j in K with goodone(j,i)};
subto c3: sum {i in bigger(5)} : y[i] >= 0;
  • 小函数goodone,接受两个参数 a 和 b,判断 a 是否大于 b,并返回一个布尔值。
  • 小函数 bigger,接受一个参数 i,返回集合 K 中满足 goodone(j, i) 条件的元素 j 的子集。
  • 约束条件 c3,要求在集合 K 中满足 bigger(5) 的元素 i,对应的变量 y[i] 的和大于等于 0。

  1. 定义递归函数
clear model; # 清空MAPL工作空间的模型set M = 1..9;
set N = 1..9;
var x[M*N];def ack(i,j) :=if i == 0 then j + 1else if j == 0 then ack(i - 1, 1)else ack(i - 1, ack(i, j - 1))end
end;subto c0: ack(3,3) * x[ack(1,3),ack(2,2)] >= 0;
  • 小函数 ack ,接受两个参数 i 和 j,使用 Ackermann函数的定义来进行递归计算,并返回结果。

总结:

使用def关键字自定义小函数,可以在模型中重复的使用一些复杂的计算或者逻辑,这样不仅可以有效提高模型构建的效率,还使得模型更易于阅读和维护。通过自定义小函数,模型可以在确保相同逻辑性的同时,变得更加灵活

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3组件数据双向绑定

1.双向绑定传递基本数据类型 父组件 <template><div><test v-model"searchText"/><p>父组件值&#xff1a;{{ searchText }}</p></div> </template><script setup langts> import { ref } from vue import test f…

SSM建材商城网站----计算机毕业设计

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,管理员管理,注册用户管理,新闻公告管理,建材类型管理,配货点管理,建材商品管理,建材订单管理,建材评价管理等功能。 用…

213.【2023年华为OD机试真题(C卷)】智能成绩表(排序题-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-智能成绩表二.解题思路三.题解代码Python题解代…

VCoder:大语言模型的眼睛

简介 VCoder的一个视觉编码器&#xff0c;能够帮助MLLM更好地理解和分析图像内容。提高模型在识别图像中的对象、理解图像场景方面的能力。它可以帮助模型显示图片中不同物体的轮廓或深度图&#xff08;显示物体距离相机的远近&#xff09;。还能更准确的理解图片中的物体是什…

C#如何将本地文件上传至阿里云OSS中

要想将文件上传至OSS&#xff0c;那么阿里云的AccessKeyId和AccessKeySecret必不可少 一.去哪找AccessKeyId和AccessKeySecret 进入阿里云工作台&#xff0c;点击右上角头像&#xff0c;选择AccessKey管理&#xff0c;就能看到ID了 但是Secret目前阿里云不支持查看了&#xf…

labelme读取文件顺序

labelme版本4.5.10 labelme的目录结构 labelme通过在__main__.py中调用app.py&#xff0c;启动程序读取文件列表的部分在app.py的imageList函数中 def imageList(self):lst []for i in range(self.fileListWidget.count()):item self.fileListWidget.item(i)lst.append(ite…

Java学习笔记基础知识

一.数据类型 1.基本数据类型 基本数据类型 大小 范围 byte(字节整型) 1byte(8bit) -128(-2^7)~127(2^7-1) short(短整型) 2byte -2^15~2^15-1 int(整型) 4byte -2^31~2^31-1 long(长整型) 8byte -2^63~2^63-1 float(单精度浮点数) 4byte -3.4E38~3.4E38 double(双精度浮…

lua配置表优化以及元表

table1 {[100] {Hung 0,IDType 7,InitMapID 10000,Name "荣誉阶梯",Timeout 0},[101] {Hung 0,IDType 0,InitMapID 10100,MinLv 50,Name "盘山道",NumEveryDay 1,PworldID 101,Timeout 1200,Type 2} }local __default_values {Cheats …

【SpringCloud】5、Spring Cloud Gateway网关路由规则

Spring Cloud Gateway 创建 Route 对象时, 使用 RoutePredicateFactory 创建 Predicate 对象,Predicate 对象可以赋值给 Route。 Spring Cloud Gateway包含许多内置的Route Predicate Factories。所有这些断言都匹配 HTTP 请求的不同属性。多个 Route Predicate Factories 可…

应用系统如何集成和扩展开源工作流引擎

目前主流的开源流程引擎有activiti、flowable、camunda等&#xff0c;这几个开源流程引擎的版本很多&#xff0c;哪个开源流程引擎哪个版本的功能更多、性能更好&#xff0c;该如何选择请参考&#xff1a;https://lowcode.blog.csdn.net/article/details/116405594 无论您选择…

AR技术改变汽车行业,AR看车、AR车书、AR售后维修震撼登场!

引言&#xff1a; 随着中国汽车市场步入存量发展阶段&#xff0c;车企正迎来新的机遇和挑战。这一发展意味着庞大的汽车后市场需求&#xff0c;同时也要求企业和经销商能够快速响应市场需求&#xff0c;提供高质量的服务。而培养具备全面技能的成熟售后服务人员需要企业投入大…

java基础之---动态代理

1、代理是什么&#xff1f; 在不改变源代码的情况下&#xff0c;对类进行了功能等扩展。在代理类的前后方法添加任何你想要添加的内容。 2、静态代理跟动态代理区别 静态代理是在编译期确定。 动态代理需要在运行期确定的。反射是动态代理的一种。经常被用在框架中&#xff…

HubSpot电子邮件:数字化时代的营销利器

在当今数字化时代&#xff0c;电子邮件仍然是企业与客户之间沟通的重要手段之一。而HubSpot电子邮件作为HubSpot全方位解决方案的一部分&#xff0c;不仅简化了营销流程&#xff0c;更为企业提供了强大的工具&#xff0c;助力建立更紧密的客户关系。本文将深入探讨HubSpot电子邮…

vs2019+qt+opencv+open3d

开发环境 VS 2019, 一开始用这个&#xff0c;后来就一直用了Qt 5.9.9, Qt Creator&#xff0c;有一个项目是用这个版本开发的&#xff0c;所以我后来也沿用这个版本opencv 3.4.5, 有一项功能必须这个版本才能使用open3d 0.15.2&#xff0c; 曾经编译了这个版本&#xff0c;后面…

深度学习在工地安全帽识别技术的应用与展望

当我们谈论“工地安全帽识别”时&#xff0c;实际上我们在探讨的是如何利用深度学习图像识别技术来提高建筑工地的安全性。这一技术的应用可以显著提高工地安全管理的效率和有效性&#xff0c;是现代建筑工程管理中不可或缺的一部分。以测评的北京富维图像的工地安全帽识别为例…

小兔鲜儿 uniapp - SKU 模块

目录 存货单位&#xff08;SKU&#xff09;​ 插件市场​ 下载 SKU 插件​ 使用 SKU 插件​ 插件类型问题​ 核心业务​ 渲染商品规格​ 打开弹窗交互​ 渲染被选中的值​ 存货单位&#xff08;SKU&#xff09;​ SKU 概念 存货单位&#xff08;Stock Keeping Unit&a…

Java之反射

一、反射的概述 是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b; 对于任意一个对象&#xff0c;都能够调用它的任意属性和方法&#xff1b; 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。 通俗的理…

Python使用multiprocessing模块实现多进程并发处理大数据量

使用multiprocessing模块实现多进程并发地遍历arr1中的值&#xff0c;从arr2中查找是否存在的步骤如下&#xff1a; 导入multiprocessing模块&#xff1a;import multiprocessing 创建查找函数&#xff1a;定义一个函数&#xff0c;用于在arr2中查找arr1的值。可以在这个函数中…

【JVM】Java虚拟机JVM堆内存调优

Java虚拟机JVM堆内存调优 一、了解堆内存结构1.1 JDK 1.7堆内存1.2 JDK 1.8堆内存二、设置合理的堆内存大小(-Xms和-Xmx)三、调整新生代与老年代比例(-XX:NewRatio)四、新生代中Eden区与Survivor区比例(-XX:SurvivorRatio)五、启用并调整并行收集器或并发收集器六、设置垃…

基金撰写过程中是否存在哪些问题?技术路线图如何设计才能吸引评阅专家的目光?

随着社会经济发展和科技进步&#xff0c;基金项目对创新性的要求越来越高。申请人需要提出独特且有前瞻性的研究问题&#xff0c;具备突破性的科学思路和方法。因此&#xff0c;基金项目申请往往需要进行跨学科的技术融合。申请人需要与不同领域结合&#xff0c;形成多学科交叉…