Python 实例介绍固定费用问题的建模与求解。

学习 PuLP工具包中处理复杂问题的快捷使用方式。

『Python小白的数学建模课 @ Youcans』带你从数模小白成为国赛达人。


前文讲到几种典型的 0-1 规划问题,给出了 PuLP 求解的案例。由于 0-1 规划问题种类很多,又是数模竞赛热点,有必要再结合几个实例进行介绍。

1. 固定费用问题案例解析

1.1 固定费用问题(Fixed cost problem)

固定费用问题,是指求解生产成本最小问题时,总成本包括固定成本和变动成本,而选择不同生产方式会有不同的固定成本,因此总成本与选择的生产方式有关。

固定费用问题,实际上是互斥的目标函数问题,对于不同的生产方式具有多个互斥的目标函数,但只有一个起作用。固定费用问题不能用一般的线性规划模型求解。

一般地,设有 m 种生产方式可供选择,采用第 j 种方式时的固定成本为 \(K_j\)、变动成本为 \(c_j\)、产量为 \(x_j\),则采用各种生产方式的总成本分别为:

\[min\;P_j = \begin{cases}
k_j + c_j x_j,&x_j \geq 0\\
0,&x_j = 0, j=1,...m
\end{cases}
\]

该类问题的建模方法,为了构造统一的目标函数,可以引入 m 个 0-1 变量 y_j 表示是否采用第 j 种生产方式:

\[y_j = \begin{cases}
0,不采用第\;j\;种生产方式\\
1,采用第\;j\; 种生产方式
\end{cases}
\]

于是可以构造新的目标函数和约束条件:

\[min\;f(x) = \sum_{j=1} ^m (k_j y_j + c_j x_j)\\
s.t.:\;x_j \leq y_j M,j=1,...m
\]

M 是一个充分大的常数。

欢迎关注 『Python小白的数学建模课 @ Youcans』,每周更新数模笔记

Python小白的数学建模课-01.新手必读

Python小白的数学建模课-02.数据导入

Python小白的数学建模课-03.线性规划

Python小白的数学建模课-04.整数规划

Python小白的数学建模课-05.0-1规划

Python数模笔记-PuLP库

Python数模笔记-StatsModels统计回归

Python数模笔记-Sklearn

Python数模笔记-NetworkX

Python数模笔记-模拟退火算法

1.2 案例问题描述

例题 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,那么应该如何安排生产计划使利润最大?

1.3 建模过程分析

首先要理解生产某种服装就会发生设备租金,租金只与是否生产该产品有关,而与生产数量无关,这就是固定成本。因此本题属于固定费用问题。

有些同学下意识地认为是从 3 种产品中选择一种,但题目中并没有限定必须或只能生产一种产品,因此决策结果可以是都不生产、选择 1 种或 2 种产品、3 种都生产。

决策结果会是什么都不生产吗?有可能的。

每种产品的利润:(销售价格 - 材料成本)× 生产数量 - 设备租金

本题中如果设备租金很高,决策结果就可能是什么都不做时利润最大,这是利润为 0,至少不亏。

现在可以用固定费用问题的数学模型来描述问题了:

设 \(x_i\) 为是否生产第 \(i\) 种服装,\(x_i\) 是 0/1变量:

\[x_i = \begin{cases}
0,不生产第\;i\;种服装\\
1,生产第\;i\;种服装,i=1,2,3
\end{cases}
\]

设 \(y_i\) 为生产第 \(i\) 种服装的数量, \(y_i\) 是整数类型。说 \(y_i\) 是实数变量的同学,你经常穿半条裤子吗?

根据条件确定决策变量的取值范围。例如,本例中的产量 \(y_i\) 显然要大于等于 0。进一步地,题目并没有直接给出 \(y_i\) 的取值上限,但可以从设备单件工时与设备可用工时的关系推导出取值上限为 [100, 600, 150],也可以从单位人工工时与人工可用工时的关系推导出上限 [400, 2000, 500],最后取较小者为 [100, 600, 150]。

数学模型就可以表达为:

\[max\; z = 120 y_1 + 10 y_2 + 100 y_3 - 5000 x_1 - 2000 x_2 - 2000 x_3\\
s.t.:\;\begin{cases}
5 y_1 + y_2 + 4 y_3 \leq 2000\\
3 y_1 \leq 300 x_1\\
0.5 y_2 \leq 300 x_2\\
2 y_3 \leq 300 x_3 \\
0 \leq y_1 \leq 100\\
0 \leq y_2 \leq 600\\
0 \leq y_3 \leq 150\\
\end{cases}
\]

1.4 PuLP 求解固定费用问题的编程

编程求解建立的数学模型,用标准模型的优化算法对模型求解,得到优化结果。

模型求解的编程步骤与之前的线性规划、整数规划问题并没有什么区别,这就是 PuLP工具包的优势。

(0)导入 PuLP库函数

  1. import pulp

(1)定义一个规划问题

  1. FixedCostP1 = pulp.LpProblem("Fixed_cost_problem", sense=pulp.LpMaximize) # 定义问题,求最大值

pulp.LpProblem 用来定义问题的构造函数。"FixedCostP1"是用户定义的问题名。

参数 sense 指定问题求目标函数的最小值/最大值 。本例求最大值,选择 “pulp.LpMaximize” 。

(2)定义决策变量

  1. x1 = pulp.LpVariable('A', cat='Binary') # 定义 x1,0-1变量,是否生产 A 产品
  2. x2 = pulp.LpVariable('B', cat='Binary') # 定义 x2,0-1变量,是否生产 B 产品
  3. x3 = pulp.LpVariable('C', cat='Binary') # 定义 x3,0-1变量,是否生产 C 产品
  4. y1 = pulp.LpVariable('yieldA', lowBound=0, upBound=100, cat='Integer') # 定义 y1,整型变量
  5. y2 = pulp.LpVariable('yieldB', lowBound=0, upBound=600, cat='Integer') # 定义 y2,整型变量
  6. y3 = pulp.LpVariable('youCans', lowBound=0, upBound=150, cat='Integer') # 定义 y3,整型变量

pulp.LpVariable 用来定义决策变量的函数。参数 cat 用来设定变量类型,' Binary ' 表示0/1变量(用于0/1规划问题),' Integer ' 表示整数变量。'lowBound'、'upBound' 分别表示变量取值范围的下限和上限。

(3)添加目标函数

  1. FixedCostP1 += pulp.lpSum(-5000*x1-2000*x2-2000*x3+120*y1+10*y2+100*y3) # 设置目标函数 f(x)

(4)添加约束条件

  1. FixedCostP1 += (5*y1 + y2 + 4*y3 <= 2000) # 不等式约束
  2. FixedCostP1 += (3*y1 - 300*x1 <= 0) # 不等式约束
  3. FixedCostP1 += (0.5*y2 - 300*x2 <= 0) # 不等式约束
  4. FixedCostP1 += (2*y3 - 300*x3 <= 0) # 不等式约束

  添加约束条件使用 "问题名 += 约束条件表达式" 格式。

  约束条件可以是等式约束或不等式约束,不等式约束可以是 小于等于 或 大于等于,分别使用关键字">="、"<="和"=="。

(5)求解

  1. FixedCostP1.solve()

  solve() 是求解函数,可以对求解器、求解精度进行设置。

1.5 Python 例程:固定费用问题

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

1.6 Python 例程运行结果

  1. Welcome to the CBC MILP Solver
  2. Version: 2.9.0
  3. Build Date: Feb 12 2015
  4. Result - Optimal solution found
  5. Fixed_cost_problem_1
  6. A = 1.0
  7. B = 1.0
  8. C = 1.0
  9. yieldA = 100.0
  10. yieldB = 600.0
  11. yieldC = 150.0
  12. Max F(x) = 24000.0

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


2. PuLP 求解规划问题的快捷方法

2.1 PuLP 求解固定费用问题的编程

通过从线性规划、整数规划、0-1规划到上例中的混合0-1规划问题,我们已经充分体会到 PuLP 使用相同的步骤和参数处理不同问题所带来的便利。

但是,如果问题非常复杂,例如变量数量很多,约束条件复杂,逐个定义变量、逐项编写目标函数与约束条件的表达式,不仅显得重复冗长,不方便修改对变量和参数的定义,而且在输入过程中容易发生错误。因此,我们希望用字典、列表、循环等快捷方法来进行变量定义、目标函数和约束条件设置。

PuLP 提供了快捷建模的编程方案,下面我们仍以上节中的固定费用问题为例进行介绍。本例中的问题、条件和参数都与上节完全相同,以便读者进行对照比较快捷方法的具体内容。

(0)导入 PuLP 库函数

  1. import pulp

(1)定义一个规划问题

  1. FixedCostP2 = pulp.LpProblem("Fixed_cost_problem", sense=pulp.LpMaximize) # 定义问题,求最大值

(2)定义决策变量

  1. types = ['A', 'B', 'C'] # 定义产品种类
  2. status = pulp.LpVariable.dicts("生产决策", types, cat='Binary') # 定义 0/1 变量,是否生产该产品
  3. yields = pulp.LpVariable.dicts("生产数量", types, lowBound=0, upBound=600, cat='Integer') # 定义整型变量

本例中的快捷方法使用列表 types 定义 0/1 变量 status 和 整型变量 yields,不论产品的品种有多少,都只有以上几句,从而使程序大为简化。

(3)添加目标函数

  1. fixedCost = {'A':5000, 'B':2000, 'C':2000} # 各产品的 固定费用
  2. unitProfit = {'A':120, 'B':10, 'C':100} # 各产品的 单位利润
  3. FixedCostP2 += pulp.lpSum([(yields[i]*unitProfit[i]- status[i]*fixedCost[i]) for i in types])

虽然看起来本例中定义目标函数的程序语句较长,但由于使用字典定义参数、使用 for 循环定义目标函数,因此程序更加清晰、简明、便于修改参数、不容易输入错误。

(4)添加约束条件

  1. humanHours = {'A':5, 'B':1, 'C':4} # 各产品的 单位人工工时
  2. machineHours = {'A':3.0, 'B':0.5, 'C':2.0} # 各产品的 单位设备工时
  3. maxHours = {'A':300, 'B':300, 'C':300} # 各产品的 最大设备工时
  4. FixedCostP2 += pulp.lpSum([humanHours[i] * yields[i] for i in types]) <= 2000 # 不等式约束
  5. for i in types:
  6. FixedCostP2 += (yields[i]*machineHours[i] - status[i]*maxHours[i] <= 0) # 不等式约束

快捷方法对于约束条件的定义与对目标函数的定义相似,使用字典定义参数,使用循环定义约束条件,使程序简单、结构清楚。

注意本例使用了两种不同的循环表达方式:语句内使用 for 循环遍历列表实现所有变量的线性组合,标准的 for 循环结构实现多组具有相似结构的约束条件。读者可以对照数学模型及上例的例程,理解这两种定义约束条件的快捷方法。

(5)求解和结果的输出

  1. # (5) 求解
  2. FixedCostP2.solve()
  3. # (6) 打印结果
  4. print(FixedCostP2.name)
  5. temple = "品种 %(type)s 的决策是:%(status)s,生产数量为:%(yields)d"
  6. if pulp.LpStatus[FixedCostP2.status] == "Optimal": # 获得最优解
  7. for i in types:
  8. output = {'type': i,
  9. 'status': '同意' if status[i].varValue else '否决',
  10. 'yields': yields[i].varValue}
  11. print(temple % output) # youcans@qq.com
  12. print("最大利润 = ", pulp.value(FixedCostP2.objective)) # 输出最优解的目标函数值

由于快捷方法使用列表或字典定义变量,对求解的优化结果也便于实现结构化的输出。

2.2 Python 例程:PuLP 快捷方法

  1. # mathmodel07_v1.py
  2. # Demo05 of mathematical modeling algorithm
  3. # Solving assignment problem with PuLP.
  4. # Copyright 2021 Youcans, XUPT
  5. # Crated:2021-06-04
  6. # Python小白的数学建模课 @ Youcans
  7. import pulp # 导入 pulp 库
  8. # 主程序
  9. def main():
  10. # 2. 问题同上,PuLP 快捷方法示例
  11. # (1) 建立优化问题 FixedCostP2: 求最大值(LpMaximize)
  12. FixedCostP2 = pulp.LpProblem("Fixed_cost_problem_2", sense=pulp.LpMaximize) # 定义问题,求最大值
  13. # (2) 建立变量
  14. types = ['A', 'B', 'C'] # 定义产品种类
  15. status = pulp.LpVariable.dicts("生产决策", types, cat='Binary') # 定义 0/1 变量,是否生产该产品
  16. yields = pulp.LpVariable.dicts("生产数量", types, lowBound=0, upBound=600, cat='Integer') # 定义整型变量
  17. # (3) 设置目标函数
  18. fixedCost = {'A':5000, 'B':2000, 'C':2000} # 各产品的 固定费用
  19. unitProfit = {'A':120, 'B':10, 'C':100} # 各产品的 单位利润
  20. FixedCostP2 += pulp.lpSum([(yields[i]*unitProfit[i]- status[i]*fixedCost[i]) for i in types])
  21. # (4) 设置约束条件
  22. humanHours = {'A':5, 'B':1, 'C':4} # 各产品的 单位人工工时
  23. machineHours = {'A':3.0, 'B':0.5, 'C':2.0} # 各产品的 单位设备工时
  24. maxHours = {'A':300, 'B':300, 'C':300} # 各产品的 最大设备工时
  25. FixedCostP2 += pulp.lpSum([humanHours[i] * yields[i] for i in types]) <= 2000 # 不等式约束
  26. for i in types:
  27. FixedCostP2 += (yields[i]*machineHours[i] - status[i]*maxHours[i] <= 0) # 不等式约束
  28. # (5) 求解 youcans
  29. FixedCostP2.solve()
  30. # (6) 打印结果
  31. print(FixedCostP2.name)
  32. temple = "品种 %(type)s 的决策是:%(status)s,生产数量为:%(yields)d"
  33. if pulp.LpStatus[FixedCostP2.status] == "Optimal": # 获得最优解
  34. for i in types:
  35. output = {'type': i,
  36. 'status': '同意' if status[i].varValue else '否决',
  37. 'yields': yields[i].varValue}
  38. print(temple % output)
  39. print("最大利润 = ", pulp.value(FixedCostP2.objective)) # 输出最优解的目标函数值
  40. return
  41. if __name__ == '__main__': # Copyright 2021 YouCans, XUPT
  42. main() # Python小白的数学建模课 @ Youcans

2.3 Python 例程运行结果

  1. Welcome to the CBC MILP Solver
  2. Version: 2.9.0
  3. Build Date: Feb 12 2015
  4. Result - Optimal solution found
  5. Fixed_cost_problem_2
  6. 品种 A 的决策是:同意,生产数量为:100
  7. 品种 B 的决策是:同意,生产数量为:600
  8. 品种 C 的决策是:同意,生产数量为:150
  9. 最大利润 = 24000.0

  本例的问题、条件和参数都与上节完全相同,只是采用 PuLP 提供的快捷建模的编程方案,优化结果也与 PuLP 标准方法完全相同,但本例使用了结构化的输出显示,使输出结果更为直观。


3. 课后练习

  1. 修改生产某种服装的设备租金,例如将 A 产品租金调整为 10000、20000元,观察求解结果有何差异?
  2. 将各种设备租金都调整为 20000元,观察求解结果有何差异?该结果有何现实意义?
  3. 如果希望找到影响是否生产某种服装决策的设备租金的大小,即租金低于该值就可以生产、高于该值则不能生产,应该如何处理?

【本节完】

版权声明:

欢迎关注『Python小白的数学建模课 @ Youcans』 原创作品

原创作品,转载必须标注原文链接。

Copyright 2021 Youcans, XUPT

Crated:2021-06-04

欢迎关注 『Python小白的数学建模课 @ Youcans』,每周更新数模笔记

Python小白的数学建模课-01.新手必读

Python小白的数学建模课-02.数据导入

Python小白的数学建模课-03.线性规划

Python小白的数学建模课-04.整数规划

Python小白的数学建模课-05.0-1规划

Python小白的数学建模课-A1.国赛赛题类型分析

Python小白的数学建模课-A2.2021年数维杯C题探讨

Python小白的数学建模课-A3.12个新冠疫情数模竞赛赛题及短评

Python数模笔记-PuLP库

Python数模笔记-StatsModels统计回归

Python数模笔记-Sklearn

Python数模笔记-NetworkX

Python数模笔记-模拟退火算法

Python小白的数学建模课-06 固定费用问题的更多相关文章

  1. Python小白的数学建模课-B5. 新冠疫情 SEIR模型

    传染病的数学模型是数学建模中的典型问题,常见的传染病模型有 SI.SIR.SIRS.SEIR 模型. 考虑存在易感者.暴露者.患病者和康复者四类人群,适用于具有潜伏期.治愈后获得终身免疫的传染病. 本 ...

  2. Python小白的数学建模课-B6. 新冠疫情 SEIR 改进模型

    传染病的数学模型是数学建模中的典型问题,常见的传染病模型有 SI.SIR.SIRS.SEIR 模型. SEIR 模型考虑存在易感者.暴露者.患病者和康复者四类人群,适用于具有潜伏期.治愈后获得终身免疫 ...

  3. Python小白的数学建模课-B4. 新冠疫情 SIR模型

    Python小白的数学建模课-B4. 新冠疫情 SIR模型 传染病的数学模型是数学建模中的典型问题,常见的传染病模型有 SI.SIR.SIRS.SEIR 模型. SIR 模型将人群分为易感者(S类). ...

  4. Python小白的数学建模课-16.最短路径算法

    最短路径问题是图论研究中的经典算法问题,用于计算图中一个顶点到另一个顶点的最短路径. 在图论中,最短路径长度与最短路径距离却是不同的概念和问题,经常会被混淆. 求最短路径长度的常用算法是 Dijkst ...

  5. Python小白的数学建模课-12.非线性规划

    非线性规划是指目标函数或约束条件中包含非线性函数的规划问题,实际就是非线性最优化问题. 从线性规划到非线性规划,不仅是数学方法的差异,更是解决问题的思想方法的转变. 非线性规划问题没有统一的通用方法, ...

  6. Python小白的数学建模课-15.图论基本概念

    图论中所说的图,不是图形图像或地图,而是指由顶点和边所构成的图形结构. 图论不仅与拓扑学.计算机数据结构和算法密切相关,而且正在成为机器学习的关键技术. 本系列结合数学建模的应用需求,来介绍 Netw ...

  7. Python小白的数学建模课-19.网络流优化问题

    流在生活中十分常见,例如交通系统中的人流.车流.物流,供水管网中的水流,金融系统中的现金流,网络中的信息流.网络流优化问题是基本的网络优化问题,应用非常广泛. 网络流优化问题最重要的指标是边的成本和容 ...

  8. Python小白的数学建模课-17.条件最短路径

    条件最短路径问题,指带有约束条件.限制条件的最短路径问题.例如: 顶点约束,包括必经点或禁止点的限制: 边的约束,包括必经路段.禁行路段和单向路段:无权路径长度的限制,如要求经过几步或不超过几步到达终 ...

  9. Python小白的数学建模课-18.最小生成树问题

    最小生成树(MST)是图论中的基本问题,具有广泛的实际应用,在数学建模中也经常出现. 路线设计.道路规划.官网布局.公交路线.网络设计,都可以转化为最小生成树问题,如要求总线路长度最短.材料最少.成本 ...

随机推荐

  1. Linux运维比较常用的一些脚本

    目录 一.根据PID过滤进程所有信息 二.根据进程名过滤进程信息 三.根据用户名查询该用户的相关信息 四.加固系统的一些配置 五:实现磁盘分区的 六.使用一整块硬盘创建逻辑卷 七.将一块硬盘分区,然后 ...

  2. 3.逆向分析Hello World!程序-下

    5.继续补充,常用操作指令: Ctrl+G    Go to       移动到指定地址,用来查看代码或内存,运行时不可用 F4        Execute till Cursor 执行到光标位置, ...

  3. [CTF]ROT5/13/18/47位移密码

    [CTF]ROT5/13/18/47位移密码 ---------------转换网站 https://www.qqxiuzi.cn/bianma/ROT5-13-18-47.php ROT5:只对数字 ...

  4. 【phpstorm】Server's certificate is not trusted

    问题描述 phpstorm 一直跳出 问题解决 file-->Settings然后搜索Server Certificates,选中框打钩

  5. 006-Java的访问权限控制符和包导入机制

    目录 一.Java的访问权限控制符 一.访问控制符的作用 二.访问控制符的分类 二.Java的包导入机制 一.为什么要使用package? 二.package怎么用? 三.对于带有package的ja ...

  6. Git 系列教程(5)- 记录每次更新到仓库

    文件状态 你工作目录下的每一个文件只有两种状态:tracked 或 untracked tracked 已跟踪 tracked 的文件是指那些被纳入了版本控制的文件 在上一次快照中有它们的记录,在工作 ...

  7. [bug] C++:[Error] name lookup of 'i' changed for ISO '

    错误原因:变量i只在for循环中可见,若在循环外使用需要单独定义 1 #include <iostream> 2 using namespace std; 3 4 int main(){ ...

  8. Kali Linux 安装中文输入法

    1.设置源 vim /etc/apt/sources.list 添加一行 deb http://mirrors.aliyun.com/kali kali-rolling main non-free c ...

  9. LTP--linux稳定性测试 linux性能测试 ltp压力测试 内核更新 稳定性测试

    LTP--linux稳定性测试 linux性能测试 ltp压力测试 zhangzj1030关注14人评论33721人阅读2011-12-09 12:07:45   说明:在写这篇文章之前,本人也不曾了 ...

  10. Java8 Period 类与 Duration 类 用法详解

    引言 Java 8 中引入了两个与日期相关的新类: Period :基于日期值 Duration:基于时间值 它们最大的作用就不需要你自己复杂的计算关于两个年月日之间的相差的时间或日期啦. Perio ...