- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章浅谈Python数学建模之固定费用问题由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
。
。
固定费用问题,是指求解生产成本最小问题时,总成本包括固定成本和变动成本,而选择不同生产方式会有不同的固定成本,因此总成本与选择的生产方式有关.
固定费用问题,实际上是互斥的目标函数问题,对于不同的生产方式具有多个互斥的目标函数,但只有一个起作用。固定费用问题不能用一般的线性规划模型求解.
一般地,设有 m 种生产方式可供选择,采用第 j 种方式时的固定成本为 (K_j)、变动成本为 (c_j)、产量为 (x_j),则采用各种生产方式的总成本分别为:
该类问题的建模方法,为了构造统一的目标函数,可以引入 m 个 0-1 变量 y_j 表示是否采用第 j 种生产方式:
于是可以构造新的目标函数和约束条件:
M 是一个充分大的常数.
。
例题 1:
某服装厂可以生产 A、B、C 三种服装,生产不同种类服装需要租用不同设备,设备租金、生产成本、销售价格等指标如下表所示.
服装种类 | 设备租金 | 材料成本 | 销售价格 | 人工工时 | 设备工时 | 设备可用工时 |
---|---|---|---|---|---|---|
单位 | (元) | (元/件) | (元/件) | (小时/件) | (小时/件) | (小时) |
A | 5000 | 280 | 400 | 5 | 3 | 300 |
B | 2000 | 30 | 40 | 1 | 0.5 | 300 |
C | 2000 | 200 | 300 | 4 | 2 | 300 |
如果各类服装的市场需求都足够大,服装厂每月可用人工时为 2000h,那么应该如何安排生产计划使利润最大?
。
首先要理解生产某种服装就会发生设备租金,租金只与是否生产该产品有关,而与生产数量无关,这就是固定成本。因此本题属于固定费用问题.
有些同学下意识地认为是从 3 种产品中选择一种,但题目中并没有限定必须或只能生产一种产品,因此决策结果可以是都不生产、选择 1 种或 2 种产品、3 种都生产.
决策结果会是什么都不生产吗?有可能的.
每种产品的利润:(销售价格 - 材料成本)× 生产数量 - 设备租金 。
本题中如果设备租金很高,决策结果就可能是什么都不做时利润最大,这是利润为 0,至少不亏.
现在可以用固定费用问题的数学模型来描述问题了:
。
编程求解建立的数学模型,用标准模型的优化算法对模型求解,得到优化结果.
模型求解的编程步骤与之前的线性规划、整数规划问题并没有什么区别,这就是 PuLP工具包的优势.
(0)导入 PuLP库函数 。
import pulp
(1)定义一个规划问题 。
FixedCostP1 = pulp.LpProblem("Fixed_cost_problem", sense=pulp.LpMaximize) # 定义问题,求最大值
pulp.LpProblem 用来定义问题的构造函数。"FixedCostP1"是用户定义的问题名。 参数 sense 指定问题求目标函数的最小值/最大值 。本例求最大值,选择 “pulp.LpMaximize” .
(2)定义决策变量 。
x1 = pulp.LpVariable("A", cat="Binary") # 定义 x1,0-1变量,是否生产 A 产品x2 = pulp.LpVariable("B", cat="Binary") # 定义 x2,0-1变量,是否生产 B 产品x3 = pulp.LpVariable("C", cat="Binary") # 定义 x3,0-1变量,是否生产 C 产品y1 = pulp.LpVariable("yieldA", lowBound=0, upBound=100, cat="Integer") # 定义 y1,整型变量y2 = pulp.LpVariable("yieldB", lowBound=0, upBound=600, cat="Integer") # 定义 y2,整型变量y3 = pulp.LpVariable("youCans", lowBound=0, upBound=150, cat="Integer") # 定义 y3,整型变量
pulp.LpVariable 用来定义决策变量的函数。参数 cat 用来设定变量类型," Binary " 表示0/1变量(用于0/1规划问题)," Integer " 表示整数变量。"lowBound"、"upBound" 分别表示变量取值范围的下限和上限.
(3)添加目标函数 。
FixedCostP1 += pulp.lpSum(-5000*x1-2000*x2-2000*x3+120*y1+10*y2+100*y3) # 设置目标函数 f(x)
(4)添加约束条件 。
FixedCostP1 += (5*y1 + y2 + 4*y3 <= 2000) # 不等式约束FixedCostP1 += (3*y1 - 300*x1 <= 0) # 不等式约束FixedCostP1 += (0.5*y2 - 300*x2 <= 0) # 不等式约束FixedCostP1 += (2*y3 - 300*x3 <= 0) # 不等式约束
添加约束条件使用 "问题名 += 约束条件表达式" 格式。 约束条件可以是等式约束或不等式约束,不等式约束可以是 小于等于 或 大于等于,分别使用关键字">="、"<="和"==".
(5)求解 。
FixedCostP1.solve()
solve() 是求解函数,可以对求解器、求解精度进行设置.
。
import pulp # 导入 pulp 库# 主程序def main(): # 固定费用问题(Fixed cost problem) print("固定费用问题(Fixed cost problem)") # 问题建模: """ 决策变量: y(i) = 0, 不生产第 i 种产品 y(i) = 1, 生产第 i 种产品 x(i), 生产第 i 种产品的数量, i>=0 整数 i=1,2,3 目标函数: min profit = 120x1 + 10x2+ 100x3 - 5000y1 - 2000y2 - 2000y3 约束条件: 5x1 + x2 + 4x3 <= 2000 3x1 <= 300y1 0.5x2 <= 300y2 2x3 <= 300y3 变量取值范围:Youcans XUPT 0<=x1<=100, 0<=x2<=600, 0<=x3<=150, 整数变量 y1, y2 ,y3 为 0/1 变量 """ # 1. 固定费用问题(Fixed cost problem), 使用 PuLP 工具包求解 # (1) 建立优化问题 FixedCostP1: 求最大值(LpMaximize) FixedCostP1 = pulp.LpProblem("Fixed_cost_problem_1", sense=pulp.LpMaximize) # 定义问题,求最大值 # (2) 建立变量 x1 = pulp.LpVariable("A", cat="Binary") # 定义 x1,0-1变量,是否生产 A 产品 x2 = pulp.LpVariable("B", cat="Binary") # 定义 x2,0-1变量,是否生产 B 产品 x3 = pulp.LpVariable("C", cat="Binary") # 定义 x3,0-1变量,是否生产 C 产品 y1 = pulp.LpVariable("yieldA", lowBound=0, upBound=100, cat="Integer") # 定义 y1,整型变量 y2 = pulp.LpVariable("yieldB", lowBound=0, upBound=600, cat="Integer") # 定义 y2,整型变量 y3 = pulp.LpVariable("yieldC", lowBound=0, upBound=150, cat="Integer") # 定义 y3,整型变量 # (3) 设置目标函数 FixedCostP1 += pulp.lpSum(-5000*x1-2000*x2-2000*x3+120*y1+10*y2+100*y3) # 设置目标函数 f(x) # (4) 设置约束条件 FixedCostP1 += (5*y1 + y2 + 4*y3 <= 2000) # 不等式约束 FixedCostP1 += (3*y1 - 300*x1 <= 0) # 不等式约束 FixedCostP1 += (0.5*y2 - 300*x2 <= 0) # 不等式约束 FixedCostP1 += (2*y3 - 300*x3 <= 0) # 不等式约束 # (5) 求解 youcans FixedCostP1.solve() # (6) 打印结果 print(FixedCostP1.name) if pulp.LpStatus[FixedCostP1.status] == "Optimal": # 获得最优解 for v in FixedCostP1.variables(): # youcans print(v.name, "=", v.varValue) # 输出每个变量的最优值 print("Youcans F(x) = ", pulp.value(FixedCostP1.objective)) # 输出最优解的目标函数值 returnif __name__ == "__main__": # Copyright 2021 YouCans, XUPT main()
。
Welcome to the CBC MILP Solver 。
Version: 2.9.0 。
Build Date: Feb 12 2015 。
。
Result - Optimal solution found 。
。
Fixed_cost_problem_1 。
A = 1.0 。
B = 1.0 。
C = 1.0 。
yieldA = 100.0 。
yieldB = 600.0 。
yieldC = 150.0 。
Max F(x) = 24000.0 。
从固定费用问题模型的求解结果可知,A、B、C 三种服装都生产,产量分别为 A/100、B/600、C/150 时获得最大利润为:24000.
。
。
通过从线性规划、整数规划、0-1规划到上例中的混合0-1规划问题,我们已经充分体会到 PuLP 使用相同的步骤和参数处理不同问题所带来的便利.
但是,如果问题非常复杂,例如变量数量很多,约束条件复杂,逐个定义变量、逐项编写目标函数与约束条件的表达式,不仅显得重复冗长,不方便修改对变量和参数的定义,而且在输入过程中容易发生错误。因此,我们希望用字典、列表、循环等快捷方法来进行变量定义、目标函数和约束条件设置.
PuLP 提供了快捷建模的编程方案,下面我们仍以上节中的固定费用问题为例进行介绍。本例中的问题、条件和参数都与上节完全相同,以便读者进行对照比较快捷方法的具体内容.
(0)导入 PuLP 库函数 。
import pulp
(1)定义一个规划问题 。
FixedCostP2 = pulp.LpProblem("Fixed_cost_problem", sense=pulp.LpMaximize) # 定义问题,求最大值
(2)定义决策变量 。
types = ["A", "B", "C"] # 定义产品种类status = pulp.LpVariable.dicts("生产决策", types, cat="Binary") # 定义 0/1 变量,是否生产该产品yields = pulp.LpVariable.dicts("生产数量", types, lowBound=0, upBound=600, cat="Integer") # 定义整型变量
本例中的快捷方法使用列表 types 定义 0/1 变量 status 和 整型变量 yields,不论产品的品种有多少,都只有以上几句,从而使程序大为简化.
(3)添加目标函数 。
fixedCost = {"A":5000, "B":2000, "C":2000} # 各产品的 固定费用unitProfit = {"A":120, "B":10, "C":100} # 各产品的 单位利润FixedCostP2 += pulp.lpSum([(yields[i]*unitProfit[i]- status[i]*fixedCost[i]) for i in types])
虽然看起来本例中定义目标函数的程序语句较长,但由于使用字典定义参数、使用 for 循环定义目标函数,因此程序更加清晰、简明、便于修改参数、不容易输入错误.
(4)添加约束条件 。
humanHours = {"A":5, "B":1, "C":4} # 各产品的 单位人工工时machineHours = {"A":3.0, "B":0.5, "C":2.0} # 各产品的 单位设备工时maxHours = {"A":300, "B":300, "C":300} # 各产品的 最大设备工时FixedCostP2 += pulp.lpSum([humanHours[i] * yields[i] for i in types]) <= 2000 # 不等式约束for i in types: FixedCostP2 += (yields[i]*machineHours[i] - status[i]*maxHours[i] <= 0) # 不等式约束
快捷方法对于约束条件的定义与对目标函数的定义相似,使用字典定义参数,使用循环定义约束条件,使程序简单、结构清楚.
注意本例使用了两种不同的循环表达方式:语句内使用 for 循环遍历列表实现所有变量的线性组合,标准的 for 循环结构实现多组具有相似结构的约束条件。读者可以对照数学模型及上例的例程,理解这两种定义约束条件的快捷方法.
(5)求解和结果的输出 。
# (5) 求解FixedCostP2.solve()# (6) 打印结果print(FixedCostP2.name)temple = "品种 %(type)s 的决策是:%(status)s,生产数量为:%(yields)d"if pulp.LpStatus[FixedCostP2.status] == "Optimal": # 获得最优解 for i in types: output = {"type": i, "status": "同意" if status[i].varValue else "否决", "yields": yields[i].varValue} print(temple % output) # youcans@qq.com print("最大利润 = ", pulp.value(FixedCostP2.objective)) # 输出最优解的目标函数值
由于快捷方法使用列表或字典定义变量,对求解的优化结果也便于实现结构化的输出.
。
import pulp # 导入 pulp 库# 主程序def main(): # 2. 问题同上,PuLP 快捷方法示例 # (1) 建立优化问题 FixedCostP2: 求最大值(LpMaximize) FixedCostP2 = pulp.LpProblem("Fixed_cost_problem_2", sense=pulp.LpMaximize) # 定义问题,求最大值 # (2) 建立变量 types = ["A", "B", "C"] # 定义产品种类 status = pulp.LpVariable.dicts("生产决策", types, cat="Binary") # 定义 0/1 变量,是否生产该产品 yields = pulp.LpVariable.dicts("生产数量", types, lowBound=0, upBound=600, cat="Integer") # 定义整型变量 # (3) 设置目标函数 fixedCost = {"A":5000, "B":2000, "C":2000} # 各产品的 固定费用 unitProfit = {"A":120, "B":10, "C":100} # 各产品的 单位利润 FixedCostP2 += pulp.lpSum([(yields[i]*unitProfit[i]- status[i]*fixedCost[i]) for i in types]) # (4) 设置约束条件 humanHours = {"A":5, "B":1, "C":4} # 各产品的 单位人工工时 machineHours = {"A":3.0, "B":0.5, "C":2.0} # 各产品的 单位设备工时 maxHours = {"A":300, "B":300, "C":300} # 各产品的 最大设备工时 FixedCostP2 += pulp.lpSum([humanHours[i] * yields[i] for i in types]) <= 2000 # 不等式约束 for i in types: FixedCostP2 += (yields[i]*machineHours[i] - status[i]*maxHours[i] <= 0) # 不等式约束 # (5) 求解 youcans FixedCostP2.solve() # (6) 打印结果 print(FixedCostP2.name) temple = "品种 %(type)s 的决策是:%(status)s,生产数量为:%(yields)d" if pulp.LpStatus[FixedCostP2.status] == "Optimal": # 获得最优解 for i in types: output = {"type": i, "status": "同意" if status[i].varValue else "否决", "yields": yields[i].varValue} print(temple % output) print("最大利润 = ", pulp.value(FixedCostP2.objective)) # 输出最优解的目标函数值 returnif __name__ == "__main__": # Copyright 2021 YouCans, XUPT main()
。
Welcome to the CBC MILP Solver 。
Version: 2.9.0 。
Build Date: Feb 12 2015 。
。
Result - Optimal solution found 。
。
Fixed_cost_problem_2 。
品种 A 的决策是:同意,生产数量为:100 。
品种 B 的决策是:同意,生产数量为:600 。
品种 C 的决策是:同意,生产数量为:150 。
最大利润 = 24000.0 。
本例的问题、条件和参数都与上节完全相同,只是采用 PuLP 提供的快捷建模的编程方案,优化结果也与 PuLP 标准方法完全相同,但本例使用了结构化的输出显示,使输出结果更为直观.
以上就是浅谈Python数学建模之固定费用问题的详细内容,更多关于Python 数学建模 固定费用的资料请关注我其它相关文章! 。
原文链接:https://www.cnblogs.com/youcans/p/14872211.html 。
最后此篇关于浅谈Python数学建模之固定费用问题的文章就讲到这里了,如果你想了解更多关于浅谈Python数学建模之固定费用问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在寻找可以从 Eclipse 的 UML 图生成代码的工具。该工具应该从 UML 图生成代码,进行逆向工程以查看代码更改,并提供合并选项以防止因任何更改而删除文件。 是否有工具可以做到这一点,或者
我正在寻找有关建模的见解。我有一个关于设计模式和基本类图、序列图和用例的介绍类(class)。 我发现类图作为我编程中的组织工具非常宝贵。到目前为止,用例还算有用。 本学期我正在上课,更深入地学习 U
如何使用 flutter 数据建模技术访问“HH”和“mm”。我一直在尝试按以下方式使用它,但是下面给出了错误。 我的数据模型当前为它的简化版本。 class Week { final Strin
我正在使用 Neo4j 和 PHP。在我的项目中,我有餐厅节点。每个节点都有纬度、经度和分类属性。 我需要返回与用户给定分类相匹配的餐厅节点,其结果按距用户位置的距离排序(即第一个最近的餐厅)。 最简
我希望 POJO 包含一个 Status 字段(只有两个可能的值 SUCCESS、FAILED),并且根据此状态,第二个字段需要为 POJO 对象(如果 Status 为 SUCCESS) 或只是字符
我正在尝试将我的办公室迁移到数据库应用程序中。这是我得到的: (来源:phunkei.de) 公司和个人从客户继承(1:1关系)。这是因为他们都可以是“客户”并收到账单,我想引用订单中的单个表。公司和
我目前有这个数据库结构: 一个条目可以有多个"file"、“文本”和“url”类型的项目。 这些项目中的每一项在文本、网址或文件表(存储数据的位置)中都有一个对应的项目。 我需要一个查询来有效地选择一
下面的代码不应该像“if(condition)”语句一样工作吗,当它在另一个循环中并且“body”有自己的 break 或 continue 语句时,会出现明显的错误行为: for( ; condit
我一直在像这样存储和递增下载计数器: INCRBY downloads: 1 但现在我想要下载:* 按值排序,以便显示热门下载列表。 我觉得我可以更好地存储它。我愚弄了: ZINCRBY downlo
我开始使用图形数据库,在我的团队中,我们已经开始为我们的软件建模图形。当我们尝试“记录”模型以查看数据库的结构时,问题就出现了。对于 SQL 数据库,您只需查看 SQL 模式。 我们花了一些时间阅读
我正在做一个固定效应回归并且遇到了自相关问题,为了解决这个问题,我正在使用预测、lmtest 和 plm 包进行 ARIMA 建模。我的数据是一般面板数据,looks like this ,我正在尝试
我想知道是否有任何工具可以帮助我对 C 应用程序(即函数式编程)进行建模。例如。我目前正在构建一个共享库。但是为了直观地传达我的设计,我需要类似 UML 的东西。我想这样做,以便审查我的设计的人不需要
我正在尝试将 JSON 转换为 GSON ,但我无法建模。谁能给我举个例子。 [ { "id": "1", "name": "lalala",
正如标题所说,在 中建模 optional 参数的最佳方法是什么?斯卡拉 ? 对于 optional 参数,我的意思是执行函数体不需要的值。 要么因为该参数存在默认值,要么根本不需要该参数本身(例如配
我发现 UML 可用于记录 OO 系统的各个方面,尤其是用于整体架构的类图和用于说明特定例程的序列图。我想为我的 clojure 应用程序做同样的事情。我目前对模型驱动开发不感兴趣,只是在交流应用程序
我想知道是否有人知道如何使用 UML 在属性中建模 DateTime 基元类型? 最佳答案 我想这取决于日期的格式......请参阅下面的示例,其中我使用两个整数(分别为日和年)和一个名为“Month
我有一些与我的问题建模相关的问题。我正在研究基于模型的测试的论文项目。还想从专家的角度了解我是否采用正确的方法来建模我的场景。我正在对 Android 应用程序的 UI 进行建模,遍历它们,生成测试用
我正在尝试建立对 CouchDB 以及如何为某些现实世界场景建模数据的理解。我现在已经尽可能多地“按日期获取我的博客文章”;) 给定这样的文件: { "_id": "couch1",
一个模型资源是如何分层的?例如假设一个人有一个“留言板”并且“消息”是一种资源。假设“消息”可以有回复,从而形成一个讨论线程。如何模拟线程的概念? “消息”是否包含它的子项? “线程”是它自己的资源吗
我正在尝试创建一个像通用 POJO 一样工作的对象,因为我必须通过不同的对象传递它,并且我需要一个接口(interface)来访问其属性。 目前,我使用具有 getField 方法的基础对象来完成此操
我是一名优秀的程序员,十分优秀!