当前位置: 首页 > news >正文

minizinc学习记录

借鉴 minizinc

MiniZinc中,基本的数据类型有6种:

整数(int),浮点数(float),布尔类型(bool),字符串(string),向量(array)和集合(set)

参数用关键词par标识,但是如果给出了数据类型,那么par可以省略,也就是说par int: kint: k是等价的。

变量用关键词var标识,eg:var set of ITEMS: knapsack;生成了一个名为knapsack的变量,其类型为set of ITEMS,也就是ITEMS的一个集合。对于决策变量我们无法预先为它赋值,只有等到求解之后我们才能知道它可以取什么值。但通常对于决策变量,我们需要给定其值域(domain)来帮助求解器进行搜索,这里我们给出的domain是set of ITEMS也就是ITEMS中任意选取的一个集合。

参数和变量的声明和赋值可以放在一起,也可以分开,例如var int: x = y + 10;var int: x; x = y + 10;是等价的。注意:对每个参数/变量只能赋值一次,多次赋值会引起错误。

变量名称可以由大小写字母和下划线组合而成,其他字符和miniZinc的保留关键字、操作符不能作为变量名(和C/C++类似)。

约束constraint关键词标识。约束中给定的是一系列的布尔类型表达式(Boolean expression),来对模型中变量的取值进行限制。

MiniZinc支持的关系操作符有:

  • 等于:=或者==
  • 不等:!=
  • 小于和小于等于:<<=
  • 大于和大于等于:>>=

当然MiniZinc也支持一系列的逻辑关系,例如蕴含(->)、合取(/\)、析取(\/)等

逻辑联结词(Logical Connectives)

在数理逻辑中,常用的联结词有5个,下面一一介绍在MiniZinc中的对应形式

  • 合取(Conjunction):MiniZinc中用/\表示,a /\ b用自然语言描述就是 a and b
  • 析取(Disjunction):MiniZinc中用\/表示,a \/ b用自然语言描述就是a or b
  • 等价(Biconditional):MiniZinc中用<->表示,a <-> b 用自然语言表示就是a if and only if b
  • 蕴含(Material implication):MiniZinc中用->表示,a -> b用自然语言表示就是if a then b
  • 否定(Negation):MiniZinc中用not表示,not a意义就等同于自然语言表示了

注意:MiniZinc中并不支持连续不等式,所以0<=a<=2是不合法的,而应该写成0<=a /\ a<=2

%--------------------------
% 结果输出
output ["Picked Items: \(knapsack)\nTotal weight: \(total_wt)\nTotal value: \(total_val)\n"];

----------表示上面给出的解是问题的一个可行解。

==========表示上面的解是最优解。

默认情况下,minizinc在求解优化问题时只会输出最优解。如果加上参数-a,则表示输出所有可行解。如果使用IDE,可以在configuration editor中进行设置。

数组的声明

数组可以是一维或者多维的,在声明时使用如下格式:

array[index_set1, index_set2,...] of <type>

数组下标的集合可以是枚举类型或者是某个集合表达式。

数组内的元素可以是除了数组以外的任何内置类型,也就是说MiniZinc不支持数组嵌套。

数组的初始化

一维数组

对于一维数组,我们可以用列表的方式进行初始化,这和大多数其他语言一样,比如下面这些例子:

profit = [100, 200, 300];
cost = [0.2, 0.3, 0.5];

二维数组

MiniZinc中二维数组的初始化有特定的语法:

  • 起始于符号[|
  • |来分割行
  • 结束于符号|]

一个例子就是我们上面定义的二维数组:

consumption = [|2.5, 0.5, 1.0, 3.7|0.4, 4.2, 5.1, 1.2|3.5, 4.5, 7.0, 2.7|];

特别需要注意结尾,不要忘记|符号。

内置函数初始化任意维度数组

对于任何维度k不大于6的数组,我们都可以用内置函数arraykd来进行初始化,例如:

profit = array1d(1..3, [100, 200, 300]);
consumption = array2d(1..3, 1..4,[2.5, 0.5, 1.0, 3.7,0.4, 4.2, 5.1, 1.2,3.5, 4.5, 7.0, 2.7]);

分别等价于我们上面的一维和二维数组初始化方式。

http://www.dtcms.com/a/288584.html

相关文章:

  • 如何优雅解决缓存与数据库的数据一致性问题?
  • Docker实践:使用Docker部署WhoDB开源轻量级数据库管理工具
  • 飞船躲避陨石小游戏流量主微信抖音小程序开源
  • 【ESP32设备通信】-使用Modbus RTU读取传感器数据
  • 嵌入式硬件篇---按键
  • 嵌入式硬件篇---机械臂运动学解算(3自由度)
  • CentOS 服务器docker pull 拉取失败
  • 在vue中遇到Uncaught TypeError: Assignment to constant variable(常亮无法修改)
  • 后台管理系统登录模块(双token的实现思路)
  • 音视频学习(四十一):H264帧内压缩技术
  • 通俗易懂神经网络:从基础到实现
  • 【JavaFX国产化适配】快捷键注册(检测快捷键冲突、注册事件)
  • Syncthing实时共享同步数据 服务器数据备份软件(linux、windows)
  • 全面解析MySQL(2)——CRUD基础
  • 从零到精通:用DataBinding解锁MVVM的开发魔法
  • 第十四讲 | AVL树实现
  • Dify工作流实战
  • 安装minerU的API服务
  • 如何避免广度优先搜索(BFS)在有环图中陷入无限循环
  • ADC和DMA简述
  • 第四次作业
  • linux + 宝塔面板 部署 django网站 启动方式:uwsgi 和gunicorn如何选择 ?
  • 用 Jetpack Compose 写 Android 的 “Hello World”
  • windows + phpstorm 2024 + phpstudy 8 + php7.3 + thinkphp6 配置xdebug调试
  • YOLOv8目标检测项目代码详解与习题
  • C++ 桶排序、基数排序、堆排序
  • C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(一)
  • Spring之事务使用指南
  • spring-ai-alibaba如何上传文件并解析
  • 前端环境搭建---基于SpringBoot+MySQL+Vue+ElementUI+Mybatis前后端分离面向小白管理系统搭建