前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面对2000笔金额记录的凑数最优问题,你学了python竟然束手无策?

面对2000笔金额记录的凑数最优问题,你学了python竟然束手无策?

作者头像
咋咋
发布于 2023-02-09 11:18:55
发布于 2023-02-09 11:18:55
1.7K1
举报
文章被收录于专栏:数据大宇宙数据大宇宙

好不容易学了一门编程语言 Python,又懂一点 Excel 操作,感觉自己无所不能了。直到有一天遇到了凑数最优问题,看似很简单,但始终无法解决。

凑数问题:在很多数值数据当中,不限制个数(或一些限制条件),选择出一些数据,这些数据的数值之和要等于一个或最接近与定值。比如:在 [2,1,17,34,3,8,47,9,30]中挑出几个和等于或最接近于100的数值

熟悉 Excel 的小伙伴一定知道规划求解功能,于是你怀着期待的心情打开它,结果只是出来这样子的提示

原来,超过200笔数据是需要用它的收费版本。

相信我,就算只有100多笔数据,它的求解速度也会难以满足你。我可不希望 Excel 卡你半天的时间。

今天,我就来教大家如何使用 python 的 or tools 解决凑数最优问题。

需要安装这些库:

这里有视频版本: http://mpvideo.qpic.cn/0bc3haaa6aaaiaagudfb2zrvaogdb44aadya.f10002.mp4?dis_k=22028126e2e35719673191845db90ca1&dis_t=1675941463&play_scene=10400&vid=wxv_2716724281359220739&format_id=10002&support_redirect=0&mmversion=false


理解流程

库的使用,只不过是一些函数的堆砌。关键在于理解大概的优化流程,否则你是不可能使用 or tools 得到你要的效果。

下面我用少量数据讲解,以便你更好理解。

  • 可以看到,简单的7笔数据。目标值是9。

首先我们需要定义一列变量 x ,这里的 x 表示是否取出该笔金额。0 表示不取,1 表示取出

  • 为什么说是变量呢?因为稍后程序会不断改变它们的值。

接着,定义目标函数。目标函数需要变量参与其中。在这个问题里面,我们需要用每一笔的金额 乘以变量 x,然后求和。

  • 这里使用 SUM PRODUCT 函数。

现在看看目前为止做了什么事情。

  1. 定义了一组变量
  2. 定义了目标函数
  3. 定义了一个约束条件,每个 x 只能取0或1

我们的目标是,通过修改变量 x 的值,使得目标函数最大化。但这些定义就足够了吗?我们来测试一下。

  • 首先,第一个 x 取1 。
  • 目标函数结果满足了所有约束条件,但不是最大化。
  • 于是,第二个 x 取1。以此类推,直到第四个 x 取1。发现目标函数超过了9

此时,从第一个 x 为1开始的搜索找不到结果,退回一开始的全是0的状态。现在换第二个 x 取1开始,直到第四个x取1,得到结果

上面的过程只是一种简单表述,实际程序会做很多优化步骤。

现在可以总结一下关键流程:一,定义变量,设定变量取值的约束 二,定义目标函数 三,设定目标函数的约束 四,使目标函数最大化

接下来,带着这四点步骤,就可以轻松使用 or tools。


用 or tools 表达问题

首先,导入相关的库

使用 pandas 加载数据

设置好指定金额值

接下来,就是使用 or tools 。

  • 行1:实例化 model ,我们将使用它进行变量创建,定义约束等一系列操作。
  • 行4:使用 model 创建一列变量。注意,在创建变量的时候,分别指定了最小值、最大值、以及变量的名字。
  • 行5:为了方便计算,添加到表格中
  • 行10:定义目标函数。按照之前的讲解,每一条记录的金额与 x 相乘,然后求和。
  • 行13:设定目标函数的约束。也就是小于等于指定值
  • 行16:最大化目标函数

一切就绪,使用求解器求解。

  • 行1:创建一个求解器
  • 行3:调用求解器的函数,传入之前构造的 model
  • 行5:其返回值可以表示是否找到最优解

可以看到目标函数结果与指定值一致。

但我们需要知道,目标函数的结果是来自于哪些记录。也就是每一个变量 x 的取值。

只需要把每个变量 x,给求解器转换,就可以得到变量值。这里我们在表格中新增一列,查看结果

到这里,肯定有人会认为,"自己用 Python 的 itertools 中的排列组合也能做到"

注意看左下角的运行时间,这个库是在 C++ 中执行运算。而且它使用的是最先进的算法。作为学习可以自己实现,但在产生工作切忌心高气燥


添加更多约束条件

在实际工作需求中,往往会存在更多的限制条件。比如本来超过指定成本值等等。

接下来看看需求进阶。

看看结果中,每个组别抽取了多少笔记录。

可以看到,总共26个组别,其中一些组别被抽取了多于10笔的记录

现在可以考虑第二个需求。我们希望在每个组别抽取的数量不能多于10笔,这种情况还能找到凑数结果吗?

回到之前定义约束的代码。

  • 行13-15:对表格数据按组别分组,每一组数据中,对该组别中的所有变量 x 的总和,限定在10以内。
  • 注意, 所有的约束条件都记录放入 model 中

重新执行得到:

可以看到仍然找到最优解。

再次获取变量的值,然后看看每个组别的抽取数量。

完全符合要求

不要忘记一键三连。你的点赞、收藏、关注,是我创作的动力。

今天就分享到这里。从本期例子中可以看到,凑数问题在找到最优解的情况下,是有可能出现多个组合答案。那么,怎么可以列出所有符合要求的组合答案呢?

此外,or tools 还可以解决排班问题、路径最优、解答数独游戏等等。以后有机会再分享。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据大宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
金额记录不一定都是整数, 浮点数如何求解
金额记录不一定都是整数, 浮点数如何求解
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
五幅图阐述:机器学习的本质是最优化过程
为了将事物和问题转化为最优化问题数学模型我们需要考虑三个要素:因素变量、约束条件和目标函数。我们根据事物和问题先找到影响模型的所有因素变量,然后再根据目的建立一个目标函数用来衡量系统的效果,最后还要找到客观的限制条件并作为模型的约束。
double
2019/09/09
1.4K0
五幅图阐述:机器学习的本质是最优化过程
深入浅出—一文看懂支持向量机(SVM)
如果你是一名模式识别专业的研究生,又或者你是机器学习爱好者,SVM是一个你避不开的问题。如果你只是有一堆数据需要SVM帮你处理一下,那么无论是Matlab的SVM工具箱,LIBSVM还是python框架下的SciKit Learn都可以提供方便快捷的解决方案。
黄博的机器学习圈子
2020/04/22
11.7K1
深入浅出—一文看懂支持向量机(SVM)
python数据分析——数据分析的数据模型
数据分析的数据模型是决策支持系统的重要组成部分,它通过对大量数据的收集、整理、分析和挖掘,为企业提供有价值的信息,以支持企业的战略规划和日常运营。数据模型的选择和应用,直接关系到数据分析的准确性和有效性,进而影响企业的决策质量和市场竞争力。
鲜于言悠
2024/03/20
3510
python数据分析——数据分析的数据模型
数学求解器Lingo软件最新激活版,Lingo软件2023安装教程下载
Lingo是一种求解器软件,它主要用于求解线性规划问题。线性规划问题是一类最优化问题,它通常用于寻找最大化或最小化目标函数的最优解,同时满足一些约束条件。例如,假设我们有一家生产纸箱的工厂,现在我们需要确定每种纸箱的生产数量,以最大化利润,同时保证我们有足够的原材料和工人来完成工作。这就是一个典型的线性规划问题,我们可以使用Lingo来求解。
用户10413399
2023/03/19
1.3K0
数学求解器Lingo软件最新激活版,Lingo软件2023安装教程下载
支持向量机原理篇之手撕线性SVM
Python版本: Python3.x 运行平台: Windows IDE: Sublime text3 一、前言 说来惭愧,断更快半个月了,本打算是一周一篇的。感觉SVM瞬间难了不少,推导耗费了很多时间,同时身边的事情也不少,忙了许久。本篇文章参考了诸多大牛的文章写成的,对于什么是SVM做出了生动的阐述,同时也进行了线性SVM的理论推导,以及最后的编程实践,公式较多,还需静下心来一点一点推导。 本文出现的所有代码,均可在我的github上下载,欢迎Follow、Star:https://githu
机器学习算法工程师
2018/03/06
2K0
支持向量机原理篇之手撕线性SVM
如何口述机器学习模型原理
作者:Ricky翘 zhuanlan.zhihu.com/p/34128571 有时碰到跟别人聊起模型的熟悉时,不免要阐述下模型的原理,但一般口头交流都比较难,因为脑海里面都是一些公式,似乎从功利角度有必要把模型原理用文字表达一遍,所以自己整理了下机器学习的部分,有遗漏或者不对的地方也请多多指教~
统计学家
2019/07/22
8420
如何口述机器学习模型原理
SVM | 支持向量机原理讲解(二)
在支持向量机一中,我们介绍了当数据集是线性可分的时候,我们可以使用线性可分的支持向量机将数据进行分类(由于隔了很长时间才更新,因此忘记了支持向量机一的读者可以回看支持向量机一讲解)。但是,在现实生活中,还存在着很多数据是线性不可分的,或者说本来是线性可分的数据因为存在一些异常点,使得不能线性划分。
磐创AI
2019/05/13
1.6K0
SVM | 支持向量机原理讲解(二)
Python高级算法——线性规划(Linear Programming)
线性规划是一种数学优化方法,用于求解线性目标函数在线性约束条件下的最优解。它在运筹学、经济学、工程等领域得到广泛应用。本文将深入讲解Python中的线性规划,包括基本概念、线性规划问题的标准形式、求解方法,并使用代码示例演示线性规划在实际问题中的应用。
Echo_Wish
2023/12/13
1.9K0
Python高级算法——线性规划(Linear Programming)
彻底搞懂机器学习SVM模型!
自从大半年前接触到SVM以来,感觉一直没怎么把SVM整明白。直到最近上的《模式识别》课程才仿佛打通了我的任督二脉,使我终于搞清楚了SVM的来龙去脉,所以写个博客作个总结。
算法进阶
2023/08/28
1.3K0
彻底搞懂机器学习SVM模型!
用一张图理解SVM的脉络
SVM在之前的很长一段时间内是性能最好的分类器,它有严密而优美的数学基础作为支撑。在各种机器学习算法中,它是最不易理解的算法之一,要真正掌握它的原理有一定的难度。在本文中,SIGAI将带领大家通过一张图来理清SVM推导过程的核心过程。
SIGAI学习与实践平台
2018/08/07
2.9K0
用一张图理解SVM的脉络
数学建模--整数规划和非线性规划
在数学建模中,整数规划和非线性规划是两种重要的优化方法,它们在实际应用中具有广泛的应用。
用户11315985
2024/10/16
3980
支持向量机(SVM) (2)
在上一次的介绍中,我们稍微了解到了关于support vector machine 的一些入门知识。今天,我们将真正进入支持向量机的算法之中,大体的框架如下: 1、最大间隔分类器 2、线性可分的情况(详细) 3、原始问题到对偶问题的转化 4、序列最小最优化算法 1、最大间隔分类器 函数间隔和几何间隔相差一个∥w∥ 的缩放因子(感觉忘记的可以看一下上一篇文章)。按照前面的分析,对一个数据点进行分类,当它的间隔越大的候,分类正确的把握越大。对于一个包含n 个点的数据集,我们可以很自然地定义它的间
昱良
2018/04/04
8650
支持向量机(SVM) (2)
机器学习笔记(九)——手撕支持向量机SVM之间隔、对偶、KKT条件详细推导
支持向量机(SVM)是一种有监督的分类算法,并且它绝大部分处理的也是二分类问题,先通过一系列图片了解几个关于SVM的概念。
奶糖猫
2020/07/24
1.9K0
机器学习笔记(九)——手撕支持向量机SVM之间隔、对偶、KKT条件详细推导
软考高级架构师:运筹方法(线性规划和动态规划)
运筹学是研究在给定的资源限制下如何进行有效决策的学问。其中,线性规划和动态规划是两种重要的运筹方法,它们在解决资源优化分配、成本最小化、收益最大化等问题上有着广泛的应用。
明明如月学长
2024/05/25
3060
软考高级架构师:运筹方法(线性规划和动态规划)
最优解问题——PuLP解决线性规划问题(一)
线性规划是研究线性约束条件下线性目标函数的极值问题的数学理论和方法。Python中有许多第三方的工具可以解决这类问题,这里介绍常用的pulp工具包。pulp能够解包括整数规划在内的绝大多数线性规划问题,并且提供了多种solver,每种solver针对不同类型的线性规划问题有更好的效果。 关于pulp工具包的详细介绍,请参见pulp官网。
悟乙己
2021/12/07
3K0
最优解问题——PuLP解决线性规划问题(一)
线性规划入门:概念与基本应用
线性规划,这个听起来有些抽象的数学术语,实际上在我们的日常生活和工作中有着广泛的应用。无论是优化企业生产、分配资源,还是做出复杂决策,线性规划都能提供强大的帮助。那么,什么是线性规划呢?
theskylife
2024/08/06
4920
线性规划之单纯形法【超详解+图解】
1.作用     单纯形法是解决线性规划问题的一个有效的算法。线性规划就是在一组线性约束条件下,求解目标函数最优解的问题。 2.线性规划的一般形式     在约束条件下,寻找目标函数z的最大值。 3.
Angel_Kitty
2018/04/09
32.5K0
线性规划之单纯形法【超详解+图解】
数学建模~~多目标规划
(2)使用上面的这个题目作为例子,简单的翻译一下题干,这个题目说的就是 有1,2这两种产品需要我们进行生产,一共有11的原材料,10小时的时间,产品1的生产消耗原材料2千克,需要耗费1小时,利润是8万元,产品二以此类推;
阑梦清川
2025/02/24
870
数学建模~~多目标规划
支持向量机1--线性SVM用于分类原理
在机器学习中,支持向量机(SVM,也叫支持向量网络),是在分类与回归分析中分析数据的监督式学习模型与相关的学习算法。是由Vapnik与同事(Boser等,1992;Guyon等,1993;Vapnik等,1997)在AT&T贝尔实验室开发。支持向量机是基于统计学习框架与由Chervonenkis(1974)和Vapnik(1982,1995)提出Vapnik–Chervonenkis理论上的最强大的预测方法之一。给定一组训练实例,每个训练实例被标记为属于两个类别中的一个或另一个,SVM训练算法创建一个将新的实例分配给两个类别之一的模型,使其成为非概率二元线性分类器。SVM模型是将实例表示为空间中的点,这样映射就使得单独类别的实例被尽可能宽的明显的间隔分开。然后,将新的实例映射到同一空间,并基于它们落在间隔的哪一侧来预测所属类别。
数据STUDIO
2021/06/24
1.8K0
建模 python_整数规划建模例题
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说建模 python_整数规划建模例题,希望能够帮助大家进步!!!
Java架构师必看
2022/07/19
1.3K0
建模 python_整数规划建模例题
相关推荐
五幅图阐述:机器学习的本质是最优化过程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档