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

Gurobi基础语法之字典

Python中的字典:dict

        我们先来介绍一下Python语法中的 dict 类型, 字典中可以通过任意键值对数据进行映射,任何无法修改的python对象都可以当作键值来使用,这些无法修改的Python对象包括:整数(比如:1),浮点数(比如:1.1),字符串(比如:"uyt"),元组。

        下面分别用整数和元组作为键值创建 dict 类型的变量

用整数作为键值创建 dict 类型的变量

int_dict = {1: 'one', 2: 'two', 3: 'three'}
print(int_dict)  # {1: 'one', 2: 'two', 3: 'three'}
print(int_dict[1])  # one

用元组作为键值创建 dict 类型的变量(此tuple_dict 非后面讲的 tupledict

tuple_dict = {('a', 1): 'a_one', ('b', 2): 'b_two', ('c', 3): 'c_three'}
print(tuple_dict)  # {('a', 1): 'a_one', ('b', 2): 'b_two', ('c', 3): 'c_three'}
print(tuple_dict[('b', 2)])  # b_two

值得注意的是:

通过元组访问字典时可以省略圆括号,因此以下语句同样也是同样有效的:
print(tuple_dict['b', 2])  # b_two

        无论是python中的dict, 还是C++中的unordered_map,都是在用键值就能找到value,从功能上来讲,就可以把他们之中的键值当作一个下标来理解

        既然都有了dict,为什么Gurobi之中还创建了很多诸如multidict,  tupledict这样的东西?

Gurobi中的multidict

        首先,multidict 只是一个函数,往这个函数中传入一个 dict 字典,其中的每个键值对由键和一个列表构成,那么经过multidict处理之后将会很方便的得到多个字典,下面举个例子来说明将一个dict 分解成多个新的字典的过程,

keys, dict1, dict2 = gp.multidict( {
'key1': [1, 2],
'key2': [1, 3],
'key3': [1, 4] } )

这就将{ key1': [1, 2], key2': [1, 3], key3': [1, 4] } 这个字典分成了三个部分:

keys: 作为一个gurobi中专有的 tuplelist 类型的变量,实际上是['key1', 'key2', 'key3']

dict1: 作为一个gurobi中专有的 tupledict 类型的变量,实际上是{'key1': 1, 'key2': 1, 'key3': 1}

dict2: 作为一个gurobi中专有的 tupledict 类型的变量,实际上是{'key1': 2, 'key2': 3, 'key3': 4}

 那么multidict这个函数的作用就显而易见了:

在建模过程中,有可能遇到如下场景:有多个决策变量,每个决策变量都有上下界,那么这些决策变量可以用multidict快速的将一个决策变量和上下界都建立字典关系,比如对于上面的dict1 和 dict2来说,key1的上下界是1, 2,key2的上下界是1, 3,key3的上下界是1, 4

Gurobi 中的 tupledict 和 tuplelist

tupledict

对于tupledict来说,实际上这是一个dict容器类的一个子类,在文章一开头就已经用dict定义了一个名为tuple_dict的变量,当时就说 此 tuple_dict 非后面讲的 tupledict,这体现在如下几点:

tupledict 的定义:在gurobi中,用一个  tuple 作为字典中的key,如果字典中有多个键值对,则 这些 key(即元组)的长度都必须相同

tupledict 提供了 sum 和 prod 方法,可以方便地创建线性表达式,这些表达式可以直接用于构建模型的约束和目标函数。

tupledict 这个子类提供的新方法是 sum 和 prod,

gurobi中对tupledict对象调用 sum 方法

以如下代码为例:

m = Model()
x = m.addVars(2, 3) 
expr1 = x.sum()  # 创建一个包含所有变量的和的线性表达式
expr2 = x.sum(1, '*') 
expr3 = x.sum('*', 1)n = Model()
y = n.addVars(10, 10) 
expr4 = y.sum(range(1, 6), 1)

代码运行结果

对上面这段代码的解释:首先 x 调用 gurobi 中的 addVars 这个方法,能够获得一个 tupledict类型的对象,这个对象实际上是一个以两个下标组成的元组作为 tuplelist 的key,此时相当于创建了一个2行3列的变量矩阵,变量的下标从(1,1)到(2,3)

上图表明了x 这个变量矩阵的的是按照 tuplelist 的存储结构进行存储的,调用sum方法就是把这个变量矩阵中的每一个变量都相加,也就是说,创建了一个包含所有变量的和的线性表达式。具体来说,它将所有变量x11, x12, x13, x21, x22, x23相加。用数学公式表示为:

expr1 = x11 ​+ x12 ​+ x13 ​+ x21 ​+ x22​ + x23​

对于expr2 = x.sum(1, '*')   创建了一个包含第一行所有变量的和的线性表达式。具体来说,它将第一行的变量x11, x12, x13相加。用数学公式表示为: expr2 = x11​ + x12 ​+ x13​    

而expr3将第一列的变量x11, x21相加。用数学公式表示为:expr3 = x11 + x21

对于expr4来说,其获得了y这个变量矩阵的第一列的前 5 个变量线性表达式。用数学公式表示为:expr4 = y11 + y21 + y31 + y41 + y51

gurobi中对tupledict对象调用 prod 方法

下面用几个例子来说明这个方法:

例1:tupledict可以和dict类型的变量通过 prod 方法进行相乘

m = gp.Model()
x = m.addVars(2, 2)
coef = { (0, 0) : 0.3, (0, 1) : 0.5, (1, 0) : 0.1, (1, 1) : 0.7 }
# coef = { (0, 0) : 0.3, (0, 1) : 0.5, (1, 0) : 0.1} # 得到 0.3x11 + 0.5x12 + 0.1x21
# coef = { (1, 1) : 0.3, (1, 2) : 0.5, (2, 1) : 0.1} # 得到 0.3x22
expr = x.prod(coef)
print(expr)

值得注意的是,在coef中只有与(0, 0),(0, 1),(1, 0),(1, 1) 这四个元组匹配的键值对才会参与prod,prod之后的结果只有coef的第一个键值对

练习:阿山想要知道应该怎么学习什么技能才能成为一个运筹优化算法的专家,现在已知有三种技能是成为专家的必学技能,分别是python以及gurobi的编程技能,调研建模对象相关背景的能力,算法性能的测试技能,现在阿山要分配合理的时间,在尽可能短的时间内获得更高的技术水平,请你编写一段程序表达这个问题的目标函数

提示:既然 dict 都可以和 tupledict 使用 prod,那么tupledict 是否可以和 tupledict 相乘?

~

~

~

skill, time = multidict({'coding' : 4,'business' : 4,'test' : 1
})m = gp.Model()
x = m.addVars(skill, name = 'x')
expr = x.prod(time)
m.setObjective(expr, GRB.MINIMIZE)

注意:这里添加变量和 相乘都可以用其他的方法替代,具体可以看我的另外一篇博客

tuplelist

tuplelist 的定义:在gurobi中,用一个  tuple 作为列表中的元素,如果列表中有多个元素,则这些 元素(即元组)的长度都必须相同

 tuplelist 提供了select函数,由于 列表中的元组长度一致,所以可以理解成一个矩阵,那么select方法就可以通过指定对应位置处的元素取值,以下面这个例子为例:

Cities= [('A','B','C','D'), ('A','C','D','E'), ('B','C','B','C'),('B','D','B','C'),('C','A','B','C')]
Routes = tuplelist(Cities)
print(Routes.select('A','*'))
print(Routes.select('*','C', 'B'))

 将会打印出,

select方法的返回值会自动打印 tuplelist 的行列数,

相关文章:

Gurobi基础语法之字典

Python中的字典:dict 我们先来介绍一下Python语法中的 dict 类型, 字典中可以通过任意键值来对数据进行映射,任何无法修改的python对象都可以当作键值来使用,这些无法修改的Python对象包括:整数(比如:1),浮…...

ceph新增节点,OSD设备,标签管理(二)

一、访问客户端集群方式 方式一: 使用cephadm shell交互式配置 [rootceph141 ~]# cephadm shell # 注意,此命令会启动一个新的容器,运行玩后会退出! Inferring fsid c153209c-d8a0-11ef-a0ed-bdb84668ed01 Inferring config /var/lib/ce…...

利用metaGPT多智能体框架实现智能体-2

1.一些帮助理解的概念 智能体 在MetaGPT看来,可以将智能体想象成环境中的数字人,其中 智能体 大语言模型(LLM) 观察 思考 行动 记忆 这个公式概括了智能体的功能本质。为了理解每个组成部分,让我们将其与人类进…...

Hadoop 与 Spark:大数据处理的比较

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…...

Django 日志配置实战指南

日志是 Django 项目中不可或缺的一部分,它帮助我们记录应用程序的运行状态、调试信息、错误信息等。通过合理配置日志,我们可以更好地监控和调试应用程序。本文将详细介绍如何在 Django 项目中实现日志文件分割、日志级别控制以及多环境日志配置,并结合最佳实践和代码示例,…...

传输层协议TCP与UDP:深入解析与对比

传输层协议TCP与UDP:深入解析与对比 目录 传输层协议TCP与UDP:深入解析与对比引言1. 传输层协议概述2. TCP协议详解2.1 TCP的特点2.2 TCP的三次握手与四次挥手三次握手四次挥手 2.3 TCP的流量控制与拥塞控制2.4 TCP的可靠性机制 3. UDP协议详解3.1 UDP的…...

doris:JSON导入数据

本文介绍如何在 Doris 中导入 JSON 格式的数据文件。Doris 支持导入标准 JSON 格式数据,通过配置相关参数,可以灵活地处理不同的 JSON 数据结构,并支持从 JSON 数据中抽取字段、处理嵌套结构等场景。 导入方式​ 以下导入方式支持 JSON 格式…...

Ubuntu18.04 搭建DHCP服务器

在Ubuntu系统中,DHCP(动态主机配置协议)服务通常由isc-dhcp-server软件包提供。要配置和使用DHCP服务,你可以按照以下步骤操作: 1. 安装DHCP服务器 首先,你需要安装isc-dhcp-server。打开终端并输入以下命…...

Spring Boot 邂逅Netty:构建高性能网络应用的奇妙之旅

一、引言 在当今数字化时代,构建高效、可靠的网络应用是开发者面临的重要挑战。Spring Boot 作为一款强大的 Java 开发框架,以其快速开发、简洁配置和丰富的生态支持,深受广大开发者喜爱。而 Netty 作为高性能、异步的网络通信框架&#xff…...

【云安全】云原生-Docker(五)容器逃逸之漏洞利用

漏洞利用逃逸 通过漏洞利用实现逃逸,主要分为以下两种方式: 1、操作系统层面的内核漏洞 这是利用宿主机操作系统内核中的安全漏洞,直接突破容器的隔离机制,获得宿主机的权限。 攻击原理:容器本质上是通过 Linux 的…...

九、CSS工程化方案

一、PostCSS介绍 二、PostCSS插件的使用 项目安装 - npm install postcss-cli 全局安装 - npm install postcss-cli -g postcss-cli地址:GitHub - postcss/postcss-cli: CLI for postcss postcss地址:GitHub - postcss/postcss: Transforming styles…...

gradle创建springboot单项目和多模块项目

文章目录 gradle创建springboot项目gradle多模块项目创建 gradle创建springboot项目 适用IDEA很简单,如下图 gradle多模块项目创建 首选创建父项目,然后删除无用内容至下图 选择父项目目录,右键选择模块,创建子项目&#xff08…...

Vue实现div滚动,并且支持top动态滚动

如果你知道距离目标 div 顶部的像素值,并希望通过传入 top 参数来实现滚动到对应区域,可以使用 window.scrollTo 方法。 编写滚动方法 const scrollToDiv (targetDiv, top) > {if (targetDiv) {top top * targetDiv.value.scrollHeight / data.he…...

Elasticsearch 中,分片(Shards)数量上限?副本的数量?

概念 ElasticSearch高可用集群架构实战 分片数量1 在 Elasticsearch 中,分片(Shards)是数据存储和索引的基本单位。创建分片时需要考虑多个因素,包括集群的配置、硬件资源(如磁盘空间、内存等)以及性能要…...

Unity入门1

安装之后无法获得许可证,可以考虑重装 新建项目 单击空白处生成脚本 双击c#文件 会自动打开vstudio 检查引用 如果没有引用,重开vstu,或者重新加载项目 hierarchy层级 scenes场景 assets资产 inspector督察 icon图标 资源链接&…...

网络模型简介:OSI七层模型与TCP/IP模型

计算机网络是现代信息社会的基石,而网络通信的基础在于理解网络模型。网络模型是对通信过程的抽象,它帮助我们理解数据从源到目的地的传输过程。常见的网络模型有 OSI 七层模型 和 TCP/IP 模型,这两种模型在理论和实践中都起着重要作用。 一、…...

软件测试压力太大了怎么办?

本文其实是知乎上针对一个问题的回答: 目前在做软件测试,主要负责的是手机端的项目测试,项目迭代很快,每次上线前验正式都会发现一些之前验测试包时候没有发现的问题,压力太大了,应该怎么调整 看过我之前其…...

微信小程序-点餐(美食屋)02开发实践

目录 概要 整体架构流程 (一)用户注册与登录 (二)菜品浏览与点餐 (三)订单管理 (四)后台管理 部分代码展示 1.index.wxml 2.list.wxml 3.checkout.wxml 4.detail.wxml 小结优点 概要…...

转换算术表达式

文章目录 构造二叉树表示的算术表达式:按先序次序输入二叉树中结点的值(操作数及运算符均以一位字符表示,注意转换), #字符表示空树,如上图的算术表达式 输入2##*3##4## 输入格式 第一行输入表示要计算的算术表达式的二叉树结点的…...

99.17 金融难点通俗解释:归母净利润

目录 0. 承前1. 简述2. 比喻:小明家的小卖部2.1 第一步:计算收到的所有钱2.2 第二步:减去各种支出2.3 第三步:计算能带回家的钱 3. 生活中的例子3.1 好的经营情况3.2 一般的经营情况3.3 不好的经营情况 4. 小朋友要注意4.1 为什么…...

【Flutter】旋转元素(Transform、RotatedBox )

这里写自定义目录标题 Transform旋转元素可以改变宽高约束的旋转 - RotatedBox Transform旋转元素 说明:Transform旋转操作改变了元素的方向,但并没有改变它的布局约束。因此,虽然视觉上元素看起来是旋转了,但它仍然遵循原始的宽…...

MYSQL学习笔记(六):聚合函数、sql语句执行原理简要分析

前言: 学习和使用数据库可以说是程序员必须具备能力,这里将更新关于MYSQL的使用讲解,大概应该会更新30篇,涵盖入门、进阶、高级(一些原理分析);这一篇是内容较少,主要讲解:聚合函数和简要介绍sql语句执行过…...

thinkphp6+swoole使用rabbitMq队列

安装think-swoole安装 composer require php-amqplib/php-amqplib,以支持rabbitMq使用安装rabbitMq延迟队列插件 安装 rabbitmq_delayed_message_exchange 插件,按照以下步骤操作: 下载插件:https://github.com/rabbitmq/rabbitmq-delayed-…...

大模型开发 | RAG在实际开发中可能遇到的坑

近年来,大语言模型 (LLM) 的飞速发展令人瞩目,它们在各个领域展现出强大的应用潜力。然而,LLM 也存在一些固有的局限性,例如知识更新滞后、信息编造 (幻觉) 等问题。为了克服这些挑战,检索增强生成 (Retrieval-Augment…...

mybatis是什么?有什么作用?mybatis的简单使用

mybatis是什么? MyBatis 是一个持久层框架。 有什么作用? 简化了对数据库数据的操作。 如何简化数据操作的? MyBatis 通过提供 SQL 映射、动态 SQL、结果映射、事务管理等功能,我们直接去用就可以了。 怎么使用?&…...

求平均年龄(信息学奥赛一本通-1059)

【题目描述】 班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位。 【输入】 第一行有一个整数n(1≤n≤100),表示学生的人数。其后n行每行有…...

CY T 4 BB 5 CEB Q 1 A EE GS MCAL配置 - MCU组件

1、ResourceM 配置 选择芯片信号: 2、MCU 配置 2.1 General配置 1) McuDevErrorDetect: - 启用或禁用MCU驱动程序模块的开发错误通知功能。 - 注意:采用DET错误检测机制作为安全机制(故障检测)时,不能禁用开发错误检测。2) McuGetRamStateApi - enable/disable th…...

10 Hyperledger Fabric 介绍

简介 HypeLedger(超级账本)是由Linux基金会2015年创建的首个面向企业应用场景的开源分布式账本平台。 HypeLedger Fabric是HypeLedger种的区块链项目之一HypeLedger Fabric引入权限管理在架构设计上支持可插拔、可扩展是首个面向联盟链场景的开源项目 …...

Word 中实现方框内点击自动打 √ ☑

注: 本文为 “Word 中方框内点击打 √ ☑ / 打 ☒” 相关文章合辑。 对第一篇增加了打叉部分,第二篇为第一篇中方法 5 “控件” 实现的详解。 在 Word 方框内打 √ 的 6 种技巧 2020-03-09 12:38 使用 Word 制作一些调查表、检查表等,通常…...

噪声算法 纹理

噪声是一种程序生成的随机或伪随机数据,在图形学中常用来创建各种自然现象和复杂纹理效果。 它的本质是一种由数学算法公式生成的有规则性或可控的随机数据。 通过噪声算法生成的随机数据具有以下特点: 随机性:噪声数据本质上是随机的&#…...