返回顶部
首页 > 资讯 > 后端开发 > Python >用Python进行数学建模(一)
  • 922
分享到

用Python进行数学建模(一)

pythonpandas开发语言 2023-08-31 17:08:13 922人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

一、导入数据 1.直接赋值 2.读取 excel 文件 3.代码示例 import pandas as pd# 读取数据文件def readDataFile(readPath): # readP

一、导入数据

1.直接赋值

在这里插入图片描述

2.读取 excel 文件

在这里插入图片描述

3.代码示例

import pandas as pd# 读取数据文件def readDataFile(readPath):  # readPath: 数据文件的地址和文件名    try:        if (readPath[-4:] == ".csv"):            dfFile = pd.read_csv(readPath, header=0, sep=",")  # 间隔符为逗号,首行为标题行            # dfFile = pd.read_csv(filePath, header=None, sep=",")  # sep: 间隔符,无标题行        elif (readPath[-4:] == ".xls") or (readPath[-5:] == ".xlsx"):  # sheet_name 默认为 0            dfFile = pd.read_excel(readPath, header=0)  # 首行为标题行            # dfFile = pd.read_excel(filePath, header=None)  # 无标题行        elif (readPath[-4:] == ".dat"):  # sep: 间隔符,header:首行是否为标题行            dfFile = pd.read_table(readPath, sep=" ", header=0)  # 间隔符为空格,首行为标题行            # dfFile = pd.read_table(filePath,sep=",",header=None) # 间隔符为逗号,无标题行        else:            print("不支持的文件格式。")    except Exception as e:        print("读取数据文件失败:{}".fORMat(str(e)))        return    return dfFile# 主程序def main():    # 读取数据文件    readPath = "../data/toothpaste.csv"  # 数据文件的地址和文件名    dfFile = readDataFile(readPath)  # 调用读取文件子程序        print(type(dfFile))  # 查看 dfFile 数据类型    print(dfFile.shape)  # 查看 dfFile 形状(行数,列数)    print(dfFile.head())  # 显示 dfFile 前 5 行数据    returnif __name__ == '__main__':    main()

二、线性规划

1.什么是线性规划问题

在这里插入图片描述

2.线性规划问题如何求解

1.问题在这里插入图片描述

2.代码

import pulp  # 导入 PuLP库函数# 1.定义一个规划问题MyProbLP = pulp.LpProblem("LPProbDemo1", sense=pulp.LpMaximize)'''pulp.LpProblem 是定义问题的构造函数。"LPProbDemo1"是用户定义的问题名(用于输出信息)。参数 sense 用来指定求最小值/最大值问题,可选参数值:LpMinimize、LpMaximize 。本例 “sense=pulp.LpMaximize” 表示求目标函数的最大值。'''# 2.定义决策变量x1 = pulp.LpVariable('x1', lowBound=0, upBound=7, cat='Continuous')x2 = pulp.LpVariable('x2', lowBound=0, upBound=7, cat='Continuous')x3 = pulp.LpVariable('x3', lowBound=0, upBound=7, cat='Continuous')'''pulp.LpVariable 是定义决策变量的函数。‘x1’ 是用户定义的变量名。参数 lowBound、upBound 用来设定决策变量的下界、上界;可以不定义下界/上界,默认的下界/上界是负无穷/正无穷。本例中 x1,x2,x3 的取值区间为 [0,7]。参数 cat 用来设定变量类型,可选参数值:‘Continuous’ 表示连续变量(默认值)、’ Integer ’ 表示离散变量(用于整数规划问题)、’ Binary ’ 表示0/1变量(用于0/1规划问题)。'''# 3.设置目标函数MyProbLP += 2 * x1 + 3 * x2 - 5 * x3'''添加目标函数使用 “问题名 += 目标函数式” 格式。'''# 4.添加约束条件MyProbLP += (2 * x1 - 5 * x2 + x3 >= 10)  # 不等式约束MyProbLP += (x1 + 3 * x2 + x3 <= 12)  # 不等式约束MyProbLP += (x1 + x2 + x3 == 7)  # 等式约束'''添加约束条件使用 “问题名 += 约束条件表达式” 格式。约束条件可以是等式约束或不等式约束,不等式约束可以是 小于等于 或 大于等于,分别使用关键字">="、"<=“和”=="。'''# 5.求解MyProbLP.solve()print("Status:", pulp.LpStatus[MyProbLP.status])  # 输出求解状态for v in MyProbLP.variables():    print(v.name, "=", v.varValue)  # 输出每个变量的最优值print("F(x) = ", pulp.value(MyProbLP.objective))  # 输出最优解的目标函数值'''solve() 是求解函数。PuLP默认采用 CBC 求解器来求解优化问题,也可以调用其它的优化器来求解,如:GLPK,COIN CLP/CBC,CPLEX,和GUROBI,但需要另外安装。'''

3.结果

在这里插入图片描述

4.求解实例

在这里插入图片描述

三、整数规划

线性规划问题的最优解可能是分数或小数。整数规划是指变量的取值只能是整数的规划。
pulp.LpVariable 用来定义决策变量的函数,参数 cat 用来设定变量类型,可选参数值:‘Continuous’ 表示连续变量(默认值)、’ Integer ’ 表示离散变量(用于整数规划问题)、’ Binary ’ 表示0/1变量(用于0/1规划问题)。

1.求解示例

import pulp      # 导入 pulp 库# 主程序def main():    # 模型参数设置    """    问题描述:        某厂生产甲乙两种饮料,每百箱甲饮料需用原料6千克、工人10名,获利10万元;每百箱乙饮料需用原料5千克、工人20名,获利9万元。        今工厂共有原料60千克、工人150名,又由于其他条件所限甲饮料产量不超过8百箱。        (1)问如何安排生产计划,即两种饮料各生产多少使获利最大?        (2)若投资0.8万元可增加原料1千克,是否应作这项投资?投资多少合理?        (3)若不允许散箱(按整百箱生产),如何安排生产计划,即两种饮料各生产多少使获利最大?        (4)若不允许散箱(按整百箱生产),若投资0.8万元可增加原料1千克,是否应作这项投资?投资多少合理?    """    # 问题 1:    """    问题建模:        决策变量:            x1:甲饮料产量(单位:百箱)            x2:乙饮料产量(单位:百箱)        目标函数:            max fx = 10*x1 + 9*x2        约束条件:            6*x1 + 5*x2 <= 60            10*x1 + 20*x2 <= 150                        x1, x2 >= 0,x1 <= 8    此外,由 x1,x2>=0 和 10*x1+20*x2<=150 可知 0<=x2<=7.5    """    ProbLP1 = pulp.LpProblem("ProbLP1", sense=pulp.LpMaximize)    # 定义问题 1,求最大值    x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Continuous')  # 定义 x1    x2 = pulp.LpVariable('x2', lowBound=0, upBound=7.5, cat='Continuous')  # 定义 x2    ProbLP1 += (10*x1 + 9*x2)  # 设置目标函数 f(x)    ProbLP1 += (6*x1 + 5*x2 <= 60)  # 不等式约束    ProbLP1 += (10*x1 + 20*x2 <= 150)  # 不等式约束    ProbLP1.solve()    print(ProbLP1.name)  # 输出求解状态    print("Status :", pulp.LpStatus[ProbLP1.status])  # 输出求解状态    for v in ProbLP1.variables():        print(v.name, "=", v.varValue)  # 输出每个变量的最优值    print("F1(x) =", pulp.value(ProbLP1.objective))  # 输出最优解的目标函数值    # 问题 2:    """    问题建模:        决策变量:            x1:甲饮料产量(单位:百箱)            x2:乙饮料产量(单位:百箱)            x3:增加投资(单位:万元)        目标函数:            max fx = 10*x1 + 9*x2 - x3        约束条件:            6*x1 + 5*x2 <= 60 + x3/0.8            10*x1 + 20*x2 <= 150            x1, x2, x3 >= 0,x1 <= 8    此外,由 x1,x2>=0 和 10*x1+20*x2<=150 可知 0<=x2<=7.5    """    ProbLP2 = pulp.LpProblem("ProbLP2", sense=pulp.LpMaximize)    # 定义问题 2,求最大值    x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Continuous')  # 定义 x1    x2 = pulp.LpVariable('x2', lowBound=0, upBound=7.5, cat='Continuous')  # 定义 x2    x3 = pulp.LpVariable('x3', lowBound=0, cat='Continuous')  # 定义 x3    ProbLP2 += (10*x1 + 9*x2 - x3)  # 设置目标函数 f(x)    ProbLP2 += (6*x1 + 5*x2 - 1.25*x3 <= 60)  # 不等式约束    ProbLP2 += (10*x1 + 20*x2 <= 150)  # 不等式约束    ProbLP2.solve()    print(ProbLP2.name)  # 输出求解状态    print("Status :", pulp.LpStatus[ProbLP2.status])  # 输出求解状态    for v in ProbLP2.variables():        print(v.name, "=", v.varValue)  # 输出每个变量的最优值    print("F2(x) =", pulp.value(ProbLP2.objective))  # 输出最优解的目标函数值    # 问题 3:整数规划问题    """    问题建模:        决策变量:            x1:甲饮料产量,正整数(单位:百箱)            x2:乙饮料产量,正整数(单位:百箱)        目标函数:            max fx = 10*x1 + 9*x2        约束条件:            6*x1 + 5*x2 <= 60            10*x1 + 20*x2 <= 150            x1, x2 >= 0,x1 <= 8,x1, x2 为整数    此外,由 x1,x2>=0 和 10*x1+20*x2<=150 可知 0<=x2<=7.5    """    ProbLP3 = pulp.LpProblem("ProbLP3", sense=pulp.LpMaximize)  # 定义问题 3,求最大值    print(ProbLP3.name)  # 输出求解状态    x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Integer')  # 定义 x1,变量类型:整数    x2 = pulp.LpVariable('x2', lowBound=0, upBound=7.5, cat='Integer')  # 定义 x2,变量类型:整数    ProbLP3 += (10 * x1 + 9 * x2)  # 设置目标函数 f(x)    ProbLP3 += (6 * x1 + 5 * x2 <= 60)  # 不等式约束    ProbLP3 += (10 * x1 + 20 * x2 <= 150)  # 不等式约束    ProbLP3.solve()    print("Status:", pulp.LpStatus[ProbLP3.status])  # 输出求解状态    for v in ProbLP3.variables():        print(v.name, "=", v.varValue)  # 输出每个变量的最优值    print("F3(x) =", pulp.value(ProbLP3.objective))  # 输出最优解的目标函数值    # 问题 4:    """    问题建模:        决策变量:            x1:甲饮料产量,正整数(单位:百箱)            x2:乙饮料产量,正整数(单位:百箱)            x3:增加投资(单位:万元)        目标函数:            max fx = 10*x1 + 9*x2 - x3        约束条件:            6*x1 + 5*x2 <= 60 + x3/0.8            10*x1 + 20*x2 <= 150            x1, x2, x3 >= 0,x1 <= 8,x1, x2 为整数    此外,由 x1,x2>=0 和 10*x1+20*x2<=150 可知 0<=x2<=7.5    """    ProbLP4 = pulp.LpProblem("ProbLP4", sense=pulp.LpMaximize)  # 定义问题 4,求最大值    print(ProbLP4.name)  # 输出求解状态    x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Integer')  # 定义 x1,变量类型:整数    x2 = pulp.LpVariable('x2', lowBound=0, upBound=7, cat='Integer')  # 定义 x2,变量类型:整数    x3 = pulp.LpVariable('x3', lowBound=0, cat='Continuous')  # 定义 x3    ProbLP4 += (10*x1 + 9*x2 - x3)  # 设置目标函数 f(x)    ProbLP4 += (6*x1 + 5*x2 - 1.25*x3 <= 60)  # 不等式约束    ProbLP4 += (10*x1 + 20*x2 <= 150)  # 不等式约束    ProbLP4.solve()    print("Status:", pulp.LpStatus[ProbLP4.status])  # 输出求解状态    for v in ProbLP4.variables():        print(v.name, "=", v.varValue)  # 输出每个变量的最优值    print("F4(x) =", pulp.value(ProbLP4.objective))  # 输出最优解的目标函数值    returnif __name__ == '__main__':      main()  

2.结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、0-1规划

0-1 整数规划是一类特殊的整数规划,变量的取值只能是 0 或 1。主要用于求解互斥的决策问题、互斥的约束条件问题、固定费用问题和分派问题。

1.规划的分类及建模方法

规划问题的数学模型包括决策变量、约束条件和目标函数,围绕这三个要素都可能存在互斥的情况,从而导出不同类型的0-1规划问题,其建模方法也有差别。

  • 1.互斥的决策问题
    在这里插入图片描述
  • 2.互斥的约束问题
    在这里插入图片描述
  • 3.固定费用问题
    在这里插入图片描述
  • 4.指派问题
    在这里插入图片描述

2.PuLP 求解 0-1 规划问题

案例问题描述
在这里插入图片描述
2.建模过程分析
在这里插入图片描述

模型求解的编程

import pulp      # 导入 pulp 库# 主程序def main():    # 投资决策问题:    # 公司现有 5个拟投资项目,根据投资额、投资收益和限制条件,问如何决策使收益最大。    """    问题建模:        决策变量:            x1~x5:0/1 变量,1 表示选择第 i 个项目, 0 表示不选择第 i 个项目        目标函数:            max fx = 150*x1 + 210*x2 + 60*x3 + 80*x4 + 180*x5        约束条件:            210*x1 + 300*x2 + 100*x3 + 130*x4 + 260*x5 <= 600            x1 + x2 + x3 = 1            x3 + x4 <= 1            x5 <= x1            x1,...,x5 = 0, 1    """    InvestLP = pulp.LpProblem("Invest decision problem", sense=pulp.LpMaximize)  # 定义问题,求最大值    # 参数 cat 用来设定变量类型,’ Binary ’ 表示0/1变量(用于0/1规划问题)。    x1 = pulp.LpVariable('A', cat='Binary')  # 定义 x1,A 项目       x2 = pulp.LpVariable('B', cat='Binary')  # 定义 x2,B 项目    x3 = pulp.LpVariable('C', cat='Binary')  # 定义 x3,C 项目    x4 = pulp.LpVariable('D', cat='Binary')  # 定义 x4,D 项目    x5 = pulp.LpVariable('E', cat='Binary')  # 定义 x5,E 项目    InvestLP += (150*x1 + 210*x2 + 60*x3 + 80*x4 + 180*x5)  # 设置目标函数 f(x)    InvestLP += (210*x1 + 300*x2 + 100*x3 + 130*x4 + 260*x5 <= 600)  # 不等式约束    InvestLP += (x1 + x2 + x3 == 1)  # 等式约束    InvestLP += (x3 + x4 <= 1)  # 不等式约束    InvestLP += (x5 - x1 <= 0)  # 不等式约束    InvestLP.solve()  # solve() 是求解函数,可以对求解器、求解精度进行设置。    print(InvestLP.name)  # 输出求解状态    print("Status youcans:", pulp.LpStatus[InvestLP.status])  # 输出求解状态    for v in InvestLP.variables():        print(v.name, "=", v.varValue)  # 输出每个变量的最优值    print("Max f(x) =", pulp.value(InvestLP.objective))  # 输出最优解的目标函数值    returnif __name__ == '__main__':     main()  

运行结果
在这里插入图片描述
结论:从 0-1 规划模型的结果可知,选择 A、C、E 项目进行投资,可以满足限定条件并获得最大收益 410万元。

五、固定费用问题

1.问题定义

在这里插入图片描述

2.案例

问题描述
在这里插入图片描述
2.建模分析
首先要理解生产某种服装就会发生设备租金,租金只与是否生产该产品有关,而与生产数量无关,这就是固定成本。因此本题属于固定费用问题。
有些同学下意识地认为是从 3 种产品中选择一种,但题目中并没有限定必须或只能生产一种产品,因此决策结果可以是都不生产、选择 1 种或 2 种产品、3 种都生产。
在这里插入图片描述
3.编程求解

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        变量取值范围:            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) 求解    FixedCostP1.solve()    # (6) 打印结果    print(FixedCostP1.name)    if pulp.LpStatus[FixedCostP1.status] == "Optimal":  # 获得最优解        for v in FixedCostP1.variables():            print(v.name, "=", v.varValue)  # 输出每个变量的最优值        print("F(x) = ", pulp.value(FixedCostP1.objective))  # 输出最优解的目标函数值    returnif __name__ == '__main__':    main()

在这里插入图片描述
结论:从固定费用问题模型的求解结果可知,A、B、C 三种服装都生产,产量分别为 A/100、B/600、C/150 时获得最大利润为:24000。

字典格式快捷建模方法
在这里插入图片描述

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) 求解    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__':    main()

在这里插入图片描述

六、选址问题

选址问题是指在某个区域内选择设施的位置使所需的目标达到最优。选址问题也是一种互斥的计划问题。
选址问题有四个基本要素:设施、区域、距离和优化目标。

1.P-中位问题

在这里插入图片描述

2.P-中心问题

在这里插入图片描述

3.集合覆盖问题

在这里插入图片描述

4.游泳接力赛的指派问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import pulp      # 导入 pulp 库import numpy as np# 主程序def main():    # 问题建模:    """        决策变量:            x(i,j) = 0, 第 i 个人不游第 j 种姿势            x(i,j) = 1, 第 i 个人游第 j 种姿势            i=1,4, j=1,4        目标函数:            min time = sum(sum(c(i,j)*x(i,j))), i=1,4, j=1,4        约束条件:            sum(x(i,j),j=1,4)=1, i=1,4            sum(x(i,j),i=1,4)=1, j=1,4        变量取值范围:            x(i,j) = 0,1     """    # 游泳比赛的指派问题 (assignment problem)    # 1.建立优化问题 AssigNLP: 求最小值(LpMinimize)    AssignLP = pulp.LpProblem("Assignment_problem_for_swimming_relay_race", sense=pulp.LpMinimize)  # 定义问题,求最小值    # 2. 建立变量    rows = cols = range(0, 4)    x = pulp.LpVariable.dicts("x", (rows, cols), cat="Binary")    # 3. 设置目标函数    scoreM = [[56,74,61,63],[63,69,65,71],[57,77,63,67],[55,76,62,62]]    AssignLP += pulp.lpSum([[x[row][col]*scoreM[row][col] for row in rows] for col in cols])    # 4. 施加约束    for row in rows:        AssignLP += pulp.lpSum([x[row][col] for col in cols]) == 1 # sum(x(i,j),j=1,4)=1, i=1,4    for col in cols:        AssignLP += pulp.lpSum([x[row][col] for row in rows]) == 1 # sum(x(i,j),i=1,4)=1, j=1,4    # 5. 求解    AssignLP.solve()    # 6. 打印结果    print(AssignLP.name)    member = ["队员A","队员B","队员C","队员D"]    style = ["自由泳","蛙泳","蝶泳","仰泳"]    if pulp.LpStatus[AssignLP.status] == "Optimal":  # 获得最优解        xValue = [v.varValue for v in AssignLP.variables()]        # [0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]        xOpt = np.array(xValue).reshape((4, 4))  # 将 xValue 格式转换为 4x4 矩阵        print("最佳分配:" )        for row in rows:            print("{}\t{} 参加项目:{}".format(xOpt[row],member[row],style[np.argmax(xOpt[row])]))        print("预测最好成绩为:{}".format(pulp.value(AssignLP.objective)))    returnif __name__ == '__main__':    main()

在这里插入图片描述

5.消防站的选址问题

在这里插入图片描述
在这里插入图片描述

import pulp  # 导入 pulp 库# 主程序def main():    # 问题建模:    """        决策变量:            x(j) = 0, 不选择第 j 个消防站            x(j) = 1, 选择第 j 个消防站, j=1,8        目标函数:            min fx = sum(x(j)), j=1,8        约束条件:            sum(x(j)*R(i,j),j=1,8) >=1, i=1,8        变量取值范围:            x(j) = 0,1    """    # 消防站的选址问题 (set covering problem, site selection of fire station)    # 1.建立优化问题 SetCoverLP: 求最小值(LpMinimize)    SetCoverLP = pulp.LpProblem("SetCover_problem_for_fire_station", sense=pulp.LpMinimize)  # 定义问题,求最小值    # 2. 建立变量    zones = list(range(8))  # 定义各区域    x = pulp.LpVariable.dicts("zone", zones, cat="Binary")  # 定义 0/1 变量,是否在该区域设消防站    # 3. 设置目标函数    SetCoverLP += pulp.lpSum([x[j] for j in range(8)])  # 设置消防站的个数    # 4. 施加约束    reachable = [[1, 0, 0, 0, 0, 0, 0, 0],                 [0, 1, 1, 0, 0, 0, 0, 0],                 [0, 1, 1, 0, 1, 0, 0, 0],                 [0, 0, 0, 1, 0, 0, 0, 0],                 [0, 0, 0, 0, 1, 0, 0, 0],                 [0, 0, 0, 0, 0, 1, 1, 0],                 [0, 0, 0, 0, 0, 0, 1, 1],                 [0, 0, 0, 0, 0, 0, 1, 1]]  # 参数矩阵,第 i 消防站能否在 10分钟内到达第 j 区域    for i in range(8):        SetCoverLP += pulp.lpSum([x[j] * reachable[j][i] for j in range(8)]) >= 1    # 5. 求解    SetCoverLP.solve()    # 6. 打印结果    print(SetCoverLP.name)    temple = "区域 %(zone)d 的决策是:%(status)s"  # 格式化输出    if pulp.LpStatus[SetCoverLP.status] == "Optimal":  # 获得最优解        for i in range(8):            output = {'zone': i + 1,  # 与问题中区域 1~8 一致                      'status': '建站' if x[i].varValue else '--'}            print(temple % output)        print("需要建立 {} 个消防站。".format(pulp.value(SetCoverLP.objective)))    returnif __name__ == '__main__':    main()

在这里插入图片描述

来源地址:https://blog.csdn.net/m0_46692607/article/details/126784109

--结束END--

本文标题: 用Python进行数学建模(一)

本文链接: https://lsjlt.com/news/386356.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 用Python进行数学建模(一)
    一、导入数据 1.直接赋值 2.读取 Excel 文件 3.代码示例 import pandas as pd# 读取数据文件def readDataFile(readPath): # readP...
    99+
    2023-08-31
    python pandas 开发语言
  • 用Python进行数学建模(二)
    一、微分方程模型 微分方程是描述系统的状态随时间和空间演化的数学工具。物理中许多涉及变力的运动学、动力学问题,如空气的阻力为速度函数的落体运动等问题,很多可以用微分方程求解。微分方程在化学、工程学、经...
    99+
    2023-09-08
    python 机器学习 算法
  • 如何在PHP中进行信用评估和数学建模?
    随着互联网的快速发展和数字经济的崛起,信用评估和数学建模已成为了许多企业的重要业务。其中,PHP作为一种常见的编程语言,也被广泛应用于信用评估和数学建模的领域。本文将介绍如何在PHP中进行信用评估和数学建模,并探讨其应用场景和优势。一、信用...
    99+
    2023-05-23
    PHP 信用评估 数学建模
  • 【数学建模】2018年数学建模国赛C题 问题一代码
    文章目录 问题一代码导入包及数据数据探索与预处理 会员统计分析分析会员的年龄构成、男女比例等基本信息分析会员的总订单占比,总消费金额占比等消费情况分别以季度和天为单位,分析不同时间段会员...
    99+
    2023-09-04
    python 机器学习 开发语言
  • python数学建模(SciPy+ Numpy+Pandas)
    目录前言SciPy 学习1-SciPy基本操作1-1求解非线性方程(组)1-2积分1-3最小二乘解1-4最大模特征值及对应的特征向量Numpy学习(续)1-Numpy 数学函数1-1...
    99+
    2024-04-02
  • python数学建模实例分析
    SciPy 学习''' SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、 信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。 ''' # 安装sc...
    99+
    2023-05-14
    Python
  • python数学建模源码分析
    这篇文章主要介绍了python数学建模源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python数学建模源码分析文章都会有所收获,下面我们一起来看看吧。SciPy 学习'''Sc...
    99+
    2023-07-06
  • Python数学建模学习模拟退火算法旅行商问题示例解析
    目录1、旅行商问题(Travelling salesman problem, TSP)2、模拟退火算法求解旅行商问题3、 程序说明4、模拟退火算法求解旅行商问题 Python 程序5...
    99+
    2024-04-02
  • python数学建模之Numpy 应用介绍与Pandas学习
    目录Numpy学习1 Numpy 介绍与应用1-1Numpy是什么2 NumPy Ndarray 对象3 Numpy 数据类型4 Numpy 数组属性Pandas学习1 pandas...
    99+
    2024-04-02
  • python数学建模是加深Numpy和Pandas学习
    目录前言Numpy 学习1-numpy.array2-numpy.empty3-numpy.zeros4-numpy.ones NumPy 从已有的数组创建数组1-nump...
    99+
    2024-04-02
  • python数学建模之Numpy和Pandas怎么应用
    这篇文章主要介绍了python数学建模之Numpy和Pandas怎么应用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python数学建模之Numpy和Pandas怎么应用文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-06
  • 初学python数学建模之数据导入(小白篇)
    目录1. 数据导入是所有数模编程的第一步2. 在程序中直接向变量赋值2.1 为什么直接赋值?2.2 直接赋值的问题与注意事项例程 1:将数据导入作为单独的函数例程 2:将数据导入集中...
    99+
    2024-04-02
  • 怎么使用Python进行数据科学研究
    本篇内容主要讲解“怎么使用Python进行数据科学研究”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Python进行数据科学研究”吧!1. 为何选择PythonPython作为一种语言,...
    99+
    2023-06-16
  • 浅谈Python数学建模之整数规划
    目录一、从线性规划到整数规划1.1、为什么会有整数规划?1.2、四舍五入就能得到整数解吗?二、整数规划的求解方法2.1、分支定界法(Branch and bound)2.2、割平面法(Cutting plane)2....
    99+
    2022-06-02
    Python 数学建模 Python 整数规划
  • 浅谈Python数学建模之数据导入
    目录一、数据导入是所有数模编程的第一步二、在程序中直接向变量赋值2.1、为什么直接赋值?2.2、直接赋值的问题与注意事项三、Pandas 导入数据3.1、Pandas 读取 Excel 文件3.2、Pandas 读取...
    99+
    2022-06-02
    Python 数学建模 Python 数据导入
  • 如何用一行Python进行数据收集探索
    本篇文章给大家分享的是有关如何用一行Python进行数据收集探索,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。简易的Pandas之路任何使用Python数据的人都会熟悉Pand...
    99+
    2023-06-02
  • Python利用jmespath模块进行json数据处理
    jmespath是python的第三方模块,是需要额外安装的。它在python原有的json数据处理上 做出了很大的贡献,至于效果接下来试试就知道了有多方便。 话不多说,我们直接进入...
    99+
    2024-04-02
  • 数学建模系列-预测模型(一)灰色预测模型
    目录 1 灰色预测模型 1.1 灰色系统的定义与特点 1.2 灰色预测模型优缺点 1.3 灰色生成数列 1.4 灰色模型GM(1,1)实操步骤 1 数据检验 2 构建灰色模型 3 检验预测值 4 灰色预测模型实例代码 目前我们学习预测...
    99+
    2023-08-31
    人工智能 python
  • 使用Python进行数独求解详解(一)
    目录1.引言2.描述数独九宫格3.寻找下一个空子单元格4.子单元格中设置值的合法性5.实现回溯算法6.性能表现7.总结1. 引言 本文为介绍流行的数独游戏的系列文章中的第一篇。更具体...
    99+
    2024-04-02
  • 浅谈Python数学建模之固定费用问题
    目录一、固定费用问题案例解析1.1、固定费用问题(Fixed cost problem)1.2、案例问题描述1.3、建模过程分析1.4、PuLP 求解固定费用问题的编程1.5、Python 例程:固定费用问题1.6、...
    99+
    2022-06-02
    Python 数学建模 Python 固定费用
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作