当前位置:   article > 正文

Python数学建模使用plub库_python pulp库

python pulp库

1.线性规划

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

结果:

线性规划例子:

   

  1. import pulp
  2. #定义问题
  3. problem = pulp.LpProblem("Lpproblem", sense=pulp.LpMaximize)
  4. x1 = pulp.LpVariable("x1", lowBound=0, upBound=8, cat="Continuous")
  5. x2 = pulp.LpVariable("x2", lowBound=0, upBound=7.5, cat="Continuous")
  6. #目标函数
  7. problem +=(11 * x1 + 9 * x2)
  8. #约束
  9. problem += (6 * x1 + 5 * x2 <= 60)
  10. problem += (10 * x1 + 20 * x2 <= 150)
  11. problem.solve()
  12. print(problem.name)
  13. print("status", pulp.LpStatus[problem.status])
  14. for v in problem.variables():
  15. print(v.name, " =", v.varValue)
  16. print("最大化利润:" , pulp.value(problem.objective))

2.整数规划

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

例子:

  1. import pulp
  2. """
  3. 问题描述:
  4. 某厂生产甲乙两种饮料,每百箱甲饮料需用原料6千克、工人10名,获利10万元;每百箱乙饮料需用原料5千克、工人20名,获利9万元。
  5. 今工厂共有原料60千克、工人150名,又由于其他条件所限甲饮料产量不超过8百箱。
  6. (1)问如何安排生产计划,即两种饮料各生产多少使获利最大?
  7. (2)若投资0.8万元可增加原料1千克,是否应作这项投资?投资多少合理?
  8. (3)若不允许散箱(按整百箱生产),如何安排生产计划,即两种饮料各生产多少使获利最大?
  9. (4)若不允许散箱(按整百箱生产),若投资0.8万元可增加原料1千克,是否应作这项投资?投资多少合理?
  10. """
  11. # 问题 1:
  12. """
  13. 问题建模:
  14. 决策变量:
  15. x1:甲饮料产量(单位:百箱)
  16. x2:乙饮料产量(单位:百箱)
  17. 目标函数:
  18. max fx = 10*x1 + 9*x2
  19. 约束条件:
  20. 6*x1 + 5*x2 <= 60
  21. 10*x1 + 20*x2 <= 150
  22. x1, x2 >= 0,x1 <= 8
  23. 此外,由 x1,x2>=0 和 10*x1+20*x2<=150 可知 0<=x2<=7.5
  24. 7.5 可加可不加,加了便于提升计算速度
  25. """
  26. def Prob1():
  27. ProbLP1 = pulp.LpProblem("ProbLP1", sense=pulp.LpMaximize) # 定义问题 1,求最大值
  28. x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Continuous') # 定义 x1
  29. x2 = pulp.LpVariable('x2', lowBound=0, cat='Continuous') # 定义 x2
  30. ProbLP1 += (10 * x1 + 9 * x2) # 设置目标函数 f(x)
  31. ProbLP1 += (6 * x1 + 5 * x2 <= 60) # 不等式约束
  32. ProbLP1 += (10 * x1 + 20 * x2 <= 150) # 不等式约束
  33. ProbLP1.solve()
  34. print(ProbLP1.name) # 输出求解状态
  35. print("Status :", pulp.LpStatus[ProbLP1.status]) # 输出求解状态
  36. for v in ProbLP1.variables():
  37. print(v.name, "=", v.varValue) # 输出每个变量的最优值
  38. print("F1(x) =", pulp.value(ProbLP1.objective)) # 输出最优解的目标函数值
  39. def Prob2():
  40. """
  41. 问题建模:
  42. 决策变量:
  43. x1:甲饮料产量(单位:百箱)
  44. x2:乙饮料产量(单位:百箱)
  45. x3:增加投资(单位:万元)
  46. 目标函数:
  47. max fx = 10*x1 + 9*x2 - x3
  48. 约束条件:
  49. 6*x1 + 5*x2 <= 60 + x3/0.8
  50. 10*x1 + 20*x2 <= 150
  51. x1, x2, x3 >= 0,x1 <= 8
  52. 此外,由 x1,x2>=0 和 10*x1+20*x2<=150 可知 0<=x2<=7.5
  53. """
  54. ProbLP2 = pulp.LpProblem("ProbLP2", sense=pulp.LpMaximize) # 定义问题 2,求最大值
  55. x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Continuous') # 定义 x1
  56. x2 = pulp.LpVariable('x2', lowBound=0, upBound=7.5, cat='Continuous') # 定义 x2
  57. x3 = pulp.LpVariable('x3', lowBound=0, cat='Continuous') # 定义 x3
  58. ProbLP2 += (10 * x1 + 9 * x2 - x3) # 设置目标函数 f(x)
  59. ProbLP2 += (6 * x1 + 5 * x2 - 1.25 * x3 <= 60) # 不等式约束
  60. ProbLP2 += (10 * x1 + 20 * x2 <= 150) # 不等式约束
  61. ProbLP2.solve()
  62. print(ProbLP2.name) # 输出求解状态
  63. print("Status :", pulp.LpStatus[ProbLP2.status]) # 输出求解状态
  64. for v in ProbLP2.variables():
  65. print(v.name, "=", v.varValue) # 输出每个变量的最优值
  66. print("F2(x) =", pulp.value(ProbLP2.objective)) # 输出最优解的目标函数值
  67. def Prob3():
  68. """
  69. 问题建模:
  70. 决策变量:
  71. x1:甲饮料产量,正整数(单位:百箱)
  72. x2:乙饮料产量,正整数(单位:百箱)
  73. 目标函数:
  74. max fx = 10*x1 + 9*x2
  75. 约束条件:
  76. 6*x1 + 5*x2 <= 60
  77. 10*x1 + 20*x2 <= 150
  78. x1, x2 >= 0,x1 <= 8,x1, x2 为整数
  79. 此外,由 x1,x2>=0 和 10*x1+20*x2<=150 可知 0<=x2<=7.5
  80. """
  81. ProbLP3 = pulp.LpProblem("ProbLP3", sense=pulp.LpMaximize) # 定义问题 3,求最大值
  82. print(ProbLP3.name) # 输出求解状态
  83. x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Integer') # 定义 x1,变量类型:整数
  84. x2 = pulp.LpVariable('x2', lowBound=0, upBound=7.5, cat='Integer') # 定义 x2,变量类型:整数
  85. ProbLP3 += (10 * x1 + 9 * x2) # 设置目标函数 f(x)
  86. ProbLP3 += (6 * x1 + 5 * x2 <= 60) # 不等式约束
  87. ProbLP3 += (10 * x1 + 20 * x2 <= 150) # 不等式约束
  88. ProbLP3.solve()
  89. print("Status:", pulp.LpStatus[ProbLP3.status]) # 输出求解状态
  90. for v in ProbLP3.variables():
  91. print(v.name, "=", v.varValue) # 输出每个变量的最优值
  92. print("F3(x) =", pulp.value(ProbLP3.objective)) # 输出最优解的目标函数值
  93. def Prob4():
  94. # 问题 4:
  95. """
  96. 问题建模:
  97. 决策变量:
  98. x1:甲饮料产量,正整数(单位:百箱)
  99. x2:乙饮料产量,正整数(单位:百箱)
  100. x3:增加投资(单位:万元)
  101. 目标函数:
  102. max fx = 10*x1 + 9*x2 - x3
  103. 约束条件:
  104. 6*x1 + 5*x2 <= 60 + x3/0.8
  105. 10*x1 + 20*x2 <= 150
  106. x1, x2, x3 >= 0,x1 <= 8,x1, x2 为整数
  107. 此外,由 x1,x2>=0 和 10*x1+20*x2<=150 可知 0<=x2<=7.5
  108. """
  109. ProbLP4 = pulp.LpProblem("ProbLP4", sense=pulp.LpMaximize) # 定义问题 4,求最大值
  110. print(ProbLP4.name) # 输出求解状态
  111. x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Integer') # 定义 x1,变量类型:整数
  112. x2 = pulp.LpVariable('x2', lowBound=0, upBound=7, cat='Integer') # 定义 x2,变量类型:整数
  113. x3 = pulp.LpVariable('x3', lowBound=0, cat='Continuous') # 定义 x3
  114. ProbLP4 += (10 * x1 + 9 * x2 - x3) # 设置目标函数 f(x)
  115. ProbLP4 += (6 * x1 + 5 * x2 - 1.25 * x3 <= 60) # 不等式约束
  116. ProbLP4 += (10 * x1 + 20 * x2 <= 150) # 不等式约束
  117. ProbLP4.solve()
  118. print("Status:", pulp.LpStatus[ProbLP4.status]) # 输出求解状态
  119. for v in ProbLP4.variables():
  120. print(v.name, "=", v.varValue) # 输出每个变量的最优值
  121. print("F4(x) =", pulp.value(ProbLP4.objective)) # 输出最优解的目标函数值
  122. if __name__=="__main__":
  123. Prob1()
  124. Prob2()
  125. Prob3()
  126. Prob4()

0-1规划:

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

数学模型:

   

当然我们也可以手写背包算法。

案例1:

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

注意=号右边是数字

  1. import pulp # 导入 pulp 库
  2. # 主程序
  3. def main():
  4. # 固定费用问题(Fixed cost problem)
  5. print("固定费用问题(Fixed cost problem)")
  6. # 问题建模:
  7. """
  8. 决策变量:
  9. y(i) = 0, 不生产第 i 种产品
  10. y(i) = 1, 生产第 i 种产品
  11. x(i), 生产第 i 种产品的数量, i>=0 整数
  12. i=1,2,3
  13. 目标函数:
  14. min profit = 120x1 + 10x2+ 100x3 - 5000y1 - 2000y2 - 2000y3
  15. 约束条件:
  16. 5x1 + x2 + 4x3 <= 2000
  17. 3x1 <= 300y1
  18. 0.5x2 <= 300y2
  19. 2x3 <= 300y3
  20. 变量取值范围:
  21. 0<=x1<=100, 0<=x2<=600, 0<=x3<=150, 整数变量
  22. y1, y2 ,y3 为 0/1 变量
  23. """
  24. # 1. 固定费用问题(Fixed cost problem), 使用 PuLP 工具包求解
  25. # (1) 建立优化问题 FixedCostP1: 求最大值(LpMaximize)
  26. FixedCostP1 = pulp.LpProblem("Fixed_cost_problem_1", sense=pulp.LpMaximize) # 定义问题,求最大值
  27. # (2) 建立变量
  28. x1 = pulp.LpVariable('A', cat='Binary') # 定义 x1,0-1变量,是否生产 A 产品
  29. x2 = pulp.LpVariable('B', cat='Binary') # 定义 x2,0-1变量,是否生产 B 产品
  30. x3 = pulp.LpVariable('C', cat='Binary') # 定义 x3,0-1变量,是否生产 C 产品
  31. y1 = pulp.LpVariable('yieldA', lowBound=0, upBound=100, cat='Integer') # 定义 y1,整型变量
  32. y2 = pulp.LpVariable('yieldB', lowBound=0, upBound=600, cat='Integer') # 定义 y2,整型变量
  33. y3 = pulp.LpVariable('yieldC', lowBound=0, upBound=150, cat='Integer') # 定义 y3,整型变量
  34. # (3) 设置目标函数
  35. FixedCostP1 += pulp.lpSum(-5000*x1-2000*x2-2000*x3+120*y1+10*y2+100*y3) # 设置目标函数 f(x)
  36. # (4) 设置约束条件
  37. FixedCostP1 += (5*y1 + y2 + 4*y3 <= 2000) # 不等式约束
  38. FixedCostP1 += (3*y1 - 300*x1 <= 0) # 不等式约束
  39. FixedCostP1 += (0.5*y2 - 300*x2 <= 0) # 不等式约束
  40. FixedCostP1 += (2*y3 - 300*x3 <= 0) # 不等式约束
  41. # (5) 求解
  42. FixedCostP1.solve()
  43. # (6) 打印结果
  44. print(FixedCostP1.name)
  45. if pulp.LpStatus[FixedCostP1.status] == "Optimal": # 获得最优解
  46. for v in FixedCostP1.variables():
  47. print(v.name, "=", v.varValue) # 输出每个变量的最优值
  48. print("F(x) = ", pulp.value(FixedCostP1.objective)) # 输出最优解的目标函数值
  49. return
  50. if __name__ == '__main__':
  51. main()

接力问题

  1. import pulp # 导入 pulp 库
  2. import numpy as np
  3. # 主程序
  4. def main():
  5. # 问题建模:
  6. """
  7. 决策变量:
  8. x(i,j) = 0, 第 i 个人不游第 j 种姿势
  9. x(i,j) = 1, 第 i 个人游第 j 种姿势
  10. i=1,4, j=1,4
  11. 目标函数:
  12. min time = sum(sum(c(i,j)*x(i,j))), i=1,4, j=1,4
  13. 约束条件:
  14. sum(x(i,j),j=1,4)=1, i=1,4
  15. sum(x(i,j),i=1,4)=1, j=1,4
  16. 变量取值范围:
  17. x(i,j) = 0,1
  18. """
  19. # 游泳比赛的指派问题 (assignment problem)
  20. # 1.建立优化问题 AssignLP: 求最小值(LpMinimize)
  21. AssignLP = pulp.LpProblem("Assignment_problem_for_swimming_relay_race", sense=pulp.LpMinimize) # 定义问题,求最小值
  22. # 2. 建立变量
  23. rows = cols = range(0, 4)
  24. x = pulp.LpVariable.dicts("x", (rows, cols), cat="Binary")
  25. # 3. 设置目标函数
  26. scoreM = [[56,74,61,63],[63,69,65,71],[57,77,63,67],[55,76,62,62]]
  27. AssignLP += pulp.lpSum([[x[row][col]*scoreM[row][col] for row in rows] for col in cols])
  28. # 4. 施加约束
  29. for row in rows:
  30. AssignLP += pulp.lpSum([x[row][col] for col in cols]) == 1 # sum(x(i,j),j=1,4)=1, i=1,4
  31. for col in cols:
  32. AssignLP += pulp.lpSum([x[row][col] for row in rows]) == 1 # sum(x(i,j),i=1,4)=1, j=1,4
  33. # 5. 求解
  34. AssignLP.solve()
  35. # 6. 打印结果
  36. print(AssignLP.name)
  37. member = ["队员A","队员B","队员C","队员D"]
  38. style = ["自由泳","蛙泳","蝶泳","仰泳"]
  39. if pulp.LpStatus[AssignLP.status] == "Optimal": # 获得最优解
  40. xValue = [v.varValue for v in AssignLP.variables()]
  41. # [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]
  42. xOpt = np.array(xValue).reshape((4, 4)) # 将 xValue 格式转换为 4x4 矩阵
  43. print("最佳分配:" )
  44. for row in rows:
  45. print("{}\t{} 参加项目:{}".format(xOpt[row],member[row],style[np.argmax(xOpt[row])]))
  46. print("预测最好成绩为:{}".format(pulp.value(AssignLP.objective)))
  47. return
  48. if __name__ == '__main__':
  49. main()

建模

Rij 代表第i个站是否可以被第j个站覆盖

  1. import pulp # 导入 pulp 库
  2. # 主程序
  3. def main():
  4. # 问题建模:
  5. """
  6. 决策变量:
  7. x(j) = 0, 不选择第 j 个消防站
  8. x(j) = 1, 选择第 j 个消防站, j=1,8
  9. 目标函数:
  10. min fx = sum(x(j)), j=1,8
  11. 约束条件:
  12. sum(x(j)*R(i,j),j=1,8) >=1, i=1,8
  13. 变量取值范围:
  14. x(j) = 0,1
  15. """
  16. # 消防站的选址问题 (set covering problem, site selection of fire station)
  17. # 1.建立优化问题 SetCoverLP: 求最小值(LpMinimize)
  18. SetCoverLP = pulp.LpProblem("SetCover_problem_for_fire_station", sense=pulp.LpMinimize) # 定义问题,求最小值
  19. # 2. 建立变量
  20. zones = list(range(8)) # 定义各区域(0,1,2,3,...,7)
  21. x = pulp.LpVariable.dicts("zone", zones, cat="Binary") # 定义 0/1 变量,是否在该区域设消防站
  22. # 3. 设置目标函数
  23. SetCoverLP += pulp.lpSum([x[j] for j in range(8)]) # 设置消防站的个数
  24. # 4. 施加约束
  25. reachable = [[1, 0, 0, 0, 0, 0, 0, 0],
  26. [0, 1, 1, 0, 0, 0, 0, 0],
  27. [0, 1, 1, 0, 1, 0, 0, 0],
  28. [0, 0, 0, 1, 0, 0, 0, 0],
  29. [0, 0, 0, 0, 1, 0, 0, 0],
  30. [0, 0, 0, 0, 0, 1, 1, 0],
  31. [0, 0, 0, 0, 0, 0, 1, 1],
  32. [0, 0, 0, 0, 0, 0, 1, 1]] # 参数矩阵,第 i 消防站能否在 10分钟内到达第 j 区域
  33. for i in range(8):
  34. SetCoverLP += pulp.lpSum([x[j] * reachable[i][j] for j in range(8)]) >= 1
  35. # 5. 求解
  36. SetCoverLP.solve()
  37. # 6. 打印结果
  38. print(SetCoverLP.name)
  39. temple = "区域 %(zone)d 的决策是:%(status)s" # 格式化输出
  40. if pulp.LpStatus[SetCoverLP.status] == "Optimal": # 获得最优解
  41. for i in range(8):
  42. output = {'zone': i + 1, # 与问题中区域 1~8 一致
  43. 'status': '建站' if x[i].varValue else '--'}
  44. print(temple % output)
  45. print("需要建立 {} 个消防站。".format(pulp.value(SetCoverLP.objective)))
  46. return
  47. if __name__ == '__main__':
  48. main()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/943864
推荐阅读
相关标签
  

闽ICP备14008679号