首页 > 编程语言 >运筹学练习Python精解——整数规划

运筹学练习Python精解——整数规划

时间:2024-06-21 23:31:31浏览次数:3  
标签:x1 LpVariable Python cat x2 x3 problem 精解 运筹学

练习1

一汽车厂生产小、中、大三种类型的汽车,已知各类型每辆车对钢材、劳动时间的需求,利润以及每月工厂钢材、劳动时间的现有量如下表所示,试制定月生产计划,使工厂的利润最大。进一步讨论:由于各种条件限制,如果生产某一类型汽车,则至少要生产80辆,那么最优的生产计划应作何改变。

资源/利润 小型汽车 中型汽车 大型汽车 现有量
钢材 (吨) 1.5 3 5 600
劳动时间(小时) 280 250 400 60000
利润 (万元) 2 3 4

目标是最大化利润,在满足钢材和劳动时间的约束条件下,决定每个月生产的小、中、大型汽车的数量。

1.1 不考虑如果生产某一类型汽车,则至少要生产80辆

  • 定义决策变量:
    \(x_1\) 表示生产小型车的数量;\(x_2\)表示生产中型车的数量;\(x_3\) 表示生产大型车的数量

  • 目标函数:
    最大化利润 $Z = 2x_1 + 3x_2 + 4x_3 $

  • 约束条件:
    钢材约束:$1.5x_1 + 3x_2 + 5x_3 \leq 600 $
    劳动时间约束:$280x_1 + 250x_2 + 400x_3 \leq 60000 $

  • 非负性约束:
    $x_1, x_2, x_3 \geq 0 $


from pulp import LpMaximize, LpProblem, LpVariable, lpSum, value, LpInteger

# 定义问题
problem = LpProblem("Maximize Profit", LpMaximize)

# 定义变量
x1 = LpVariable("x1", lowBound=0, cat=LpInteger)
x2 = LpVariable("x2", lowBound=0, cat=LpInteger)
x3 = LpVariable("x3", lowBound=0, cat=LpInteger)

# 目标函数
problem += 2 * x1 + 3 * x2 + 4 * x3

# 约束条件
problem += 1.5 * x1 + 3 * x2 + 5 * x3 <= 600
problem += 280 * x1 + 250 * x2 + 400 * x3 <= 60000

# 求解问题
problem.solve()

# 打印结果
print('Optimal production plan:')
print(f'Small cars: {value(x1):.0f}')
print(f'Medium cars: {value(x2):.0f}')
print(f'Large cars: {value(x3):.0f}')
print(f'Maximum Profit: {value(problem.objective):.2f} 万元')
Optimal production plan:
Small cars: 64
Medium cars: 168
Large cars: 0
Maximum Profit: 632.00 万元

1.2 考虑如果生产某一类型汽车,则至少要生产80辆

  • 定义决策变量:需要添加3个0-1变量表示某一类型汽车是否生产
    \(y_1\) 表示是否生产小型车(0 或 1);$ y_2$ 表示是否生产中型车(0 或 1);\(y_3\) 表示是否生产大型车(0 或 1)

  • 若生产某种类型的汽车,则至少生产80辆:

\[x_1 \geq 80y_1$;$x_2 \geq 80y_2$;$x_3 \geq 80y_3 \]

  • \(y\) 变量的约束:

\[y_1, y_2, y_3 \in \{0, 1\} \]

from pulp import LpMaximize, LpProblem, LpVariable, lpSum, value

# 定义问题
problem = LpProblem("Maximize Profit", LpMaximize)

# 定义变量
x1 = LpVariable("x1", lowBound=0, cat='Integer')
x2 = LpVariable("x2", lowBound=0, cat='Integer')
x3 = LpVariable("x3", lowBound=0, cat='Integer')
y1 = LpVariable("y1", cat='Binary')
y2 = LpVariable("y2", cat='Binary')
y3 = LpVariable("y3", cat='Binary')

# 目标函数
problem += 2 * x1 + 3 * x2 + 4 * x3

# 约束条件
problem += 1.5 * x1 + 3 * x2 + 5 * x3 <= 600
problem += 280 * x1 + 250 * x2 + 400 * x3 <= 60000
problem += x1 >= 80 * y1
problem += x2 >= 80 * y2
problem += x3 >= 80 * y3

# 求解问题
problem.solve()

# 打印结果
print('Optimal production plan:')
print(f'Small cars: {value(x1):.0f}')
print(f'Medium cars: {value(x2):.0f}')
print(f'Large cars: {value(x3):.0f}')
print(f'Maximum Profit: {value(problem.objective):.2f} 万元')
Optimal production plan:
Small cars: 64
Medium cars: 168
Large cars: 0
Maximum Profit: 632.00 万元

练习2

固定成本问题:高压容器公司制造小、中、大三种尺寸的金属容器,所用资源为金属板、劳动力和机器设备,制造一个容器所需的各种资源数量如下表。不考虑固定费用,每种容器单位利润分别为4万元、5万元、6万元,可使用的金属板500吨,劳动力300人/月,机器100台/月,此外只要生产,需支付固定费用:小号是100万元,中号为150万元,大号为200万元。试制定一个生产计划,使获利最大。

资源 小号容器 中号容器 大号容器
金属板 (t) 2 4 8
劳动力 (人/月) 3 4 2
机器设备 (台/月) 1 0 1
  • 定义决策变量:
    \(x_1\)表示生产小号容器的数量;\(x_2\)表示生产中号容器的数量;\(x_3\) 表示生产大号容器的数量
    \(y_1\)表示是否生产小号容器(0 或 1);\(y_2\)表示是否生产中号容器(0 或 1);\(y_3\)表示是否生产大号容器(0 或 1)

  • 目标函数:
    最大化利润$$Z = 4x_1 + 5x_2 + 6x_3 - 100y_1 - 150y_2 - 200y_3$$

  • 约束条件:
    金属板约束:

\[2x_1 + 4x_2 + 8x_3 \leq 500 \]

劳动力约束:

\[3x_1 + 4x_2 + 2x_3 \leq 300 \]

机器设备约束:

\[x_1 + x_3 \leq 100 \]

  • 若生产某种类型的容器,则至少支付固定费用:

\[x_1 \leq My_1;x_2 \leq My_2;x_3 \leq My_3 \]

其中\(M\)是一个足够大的常数。

  • \(y\)变量的约束:

\[y_1, y_2, y_3 \in \{0, 1\} \]

  • 非负性约束:

\[x_1, x_2, x_3 \geq 0 \]

from pulp import LpMaximize, LpProblem, LpVariable, lpSum, value, LpInteger, LpBinary

# 定义问题
problem = LpProblem("Maximize Profit", LpMaximize)

# 定义变量
x1 = LpVariable("x1", lowBound=0, cat=LpInteger)
x2 = LpVariable("x2", lowBound=0, cat=LpInteger)
x3 = LpVariable("x3", lowBound=0, cat=LpInteger)
y1 = LpVariable("y1", cat=LpBinary)
y2 = LpVariable("y2", cat=LpBinary)
y3 = LpVariable("y3", cat=LpBinary)

# 目标函数
problem += 4 * x1 + 5 * x2 + 6 * x3 - 100 * y1 - 150 * y2 - 200 * y3

# 约束条件
problem += 2 * x1 + 4 * x2 + 8 * x3 <= 500
problem += 3 * x1 + 4 * x2 + 2 * x3 <= 300
problem += x1 + x3 <= 100

# 固定费用约束
M = 10000  # 这里 M 取一个足够大的常数
problem += x1 <= M * y1
problem += x2 <= M * y2
problem += x3 <= M * y3

# 求解问题
problem.solve()

# 打印结果
print('Optimal production plan:')
print(f'Small containers: {value(x1):.0f}')
print(f'Medium containers: {value(x2):.0f}')
print(f'Large containers: {value(x3):.0f}')
print(f'Maximum Profit: {value(problem.objective):.2f} 万元')
Optimal production plan:
Small containers: 100
Medium containers: 0
Large containers: 0
Maximum Profit: 300.00 万元

运筹说 第61期 | 整数规划经典例题讲解

标签:x1,LpVariable,Python,cat,x2,x3,problem,精解,运筹学
From: https://www.cnblogs.com/haohai9309/p/18261582

相关文章

  • python笔记
    pythonflatten()flatten()方法用于将多维数组转换为一维数组:#创建一个二维数组array_2d=np.array([[1,2,3],[4,5,6]])#使用flatten()方法将其展平为一维数组array_1d=array_2d.flatten()print(array_1d)输出结果是:[1,2,3,4,5,6]是X.flatten()[:......
  • python---计算器界面以及功能
    代码:importtkinterastkfromtkinterimport*root=Tk()root.title("calculate")result_num=tk.StringVar()result_num.set('')#在Tkinter中,StringVar是一个特殊的变量类,它用于与Tkinter的某些部件(如标签Label、条目Entry等)的文本属性进行双向绑定。        ......
  • python---学生通讯录
    代码:importcsvstudents=[]defmenu():    print("学生信息管理")    print("1.显示学生信息")    print("2.添加学生信息")    print("3.删除学生信息")    print("4.保存学生信息")    print("5.退出")defadd():    student={}    ......
  • 2024年华为OD机试真题-分披萨-(C++/Java/python)-OD统一考试(C卷D卷)
    题目描述"吃货"和"馋嘴"两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。但是粗心的服务员将披萨切成了每块大小都完全不同奇数块,且肉眼能分辨出大小。由于两人都想吃到最多的披萨,他们商量了一个他们认为公平的分法:从"吃货"开始,轮流......
  • 【故障诊断】动态系统故障诊断的不断演进方法研究(Python代码实现)
     ......
  • 金控风控:Python实现基于数据技巧的拒绝推断
    常说的拒绝推断(Inferencemethods),通常是指通过数据分析方法修正模型的参数估计偏差。拒绝推断的主要意义是希望修正建模样本和实际全量样本之间的差异,本质上是为了降低模型参数估计的偏差。拒绝推断场景下有如下三个概念。已知好坏标签(KnowGoodBad,KGB)样本:准入模型允许通过......
  • 初识Python----“三剑客“之matplotlib(个人总结,一些简单的图形使用,适用于初学者)
            Matplotlib是Python中最受欢迎的数据可视化软件包之一,支持跨平台运行,它是Python常用的2D绘图库,同时它也提供了一部分3D绘图接口,Matplotlib通常与NumPy、Pandas一起使用,是数据分析中不可或缺的重要工具之一。        在数据分析中,我们......
  • python爬虫之iframe处理+动作链
    python爬虫之iframe处理+动作链selenium处理iframe1、如果定位的标签存在于iframe标签之中,则必须使用switch_to.frame(id)2、动作链(拖动):fromselenium.webdriverimportActionChains(1)实例化一个动作链对象:action=ActionChains(bro)(2)click_and_hold(div):长按且点击操......
  • 横向LQR、纵向PID控制进行轨迹跟踪以及python实现
    横向LQR、纵向PID控制进行轨迹跟踪以及python实现附赠自动驾驶最全的学习资料和量产经验:链接一、LQR问题模型建立:理论部分比较成熟,这里只介绍demo所使用的建模方程:使用离散代数黎卡提方程求解系统状态矩阵:输入矩阵:A矩阵:B矩阵:二、代码实现#导入相关包imp......
  • 【每日一练】python入门级小案例
    题目数字从小到大排序 用户随意分别输入三个数,利用列表的排序方法sort()从小到大排序。代码: 输出结果: 代码分析:先创建三个变量x,y,z,用input()输入获取值;再创建一个列表,元素分别是x,y,z三个变量;利用列表的排序方法sort(),对列表从小到大排序;用for循环遍......