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 作为高性能、异步的网络通信框架ÿ…...

【云安全】云原生-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多模块项目创建 首选创建父项目,然后删除无用内容至下图 选择父项目目录,右键选择模块,创建子项目(…...
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 为什么…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...