☰
Python实现0-1整数规划:从建模到求解的完整指南
2026/11/1 0:19:12 网站建设 项目流程

1. 从“选与不选”到代码实现:0-1规划的核心逻辑

搞数学建模,尤其是涉及资源分配、项目选择、路径优化这类决策问题,你肯定绕不开“0-1规划”。这名字听起来有点抽象,但它的核心思想其实特别简单粗暴:要么选,要么不选。就像你面前摆着一堆项目,每个项目要么做(记为1),要么不做(记为0),没有中间地带,不能做一半。这种“非黑即白”的决策模型,就是0-1整数规划,简称0-1规划。

为什么它在数学建模里这么火?因为现实世界里,大量问题天然就是二元的。比如,公司预算有限,要从10个潜在投资项目中挑几个收益最大的,每个项目要么投、要么不投;再比如,物流中心选址,在5个候选城市里选3个建仓库,每个城市要么被选中建,要么不建;甚至是你安排周末活动,从看电影、健身、读书、打游戏这几个选项里,因为时间冲突最多选两项,每项活动也是要么干、要么不干。这些场景的共同点就是决策变量只能取0或1,这正是0-1规划大显身手的地方。

而Python,作为当下科学计算和算法实现的首选语言,为我们解决0-1规划问题提供了极其强大的工具箱。你不用再从零开始写复杂的分支定界算法,成熟的优化库已经把底层复杂的数学求解器封装成了简单的函数调用。这篇文章,我就结合自己带队和参赛的经验,抛开那些厚重的教科书理论,直接带你搞懂0-1规划在Python里到底怎么用,从问题识别、模型构建,到代码求解、结果分析,一步步拆解清楚。你会发现,借助Python,解决一个中等规模的0-1规划问题,可能比你想象中要简单得多。

2. 问题识别:什么样的场景适合用0-1规划?

在动手写代码之前,最关键的一步是判断你手头的问题是不是一个0-1规划问题。很多同学拿到题目就开始设变量、列方程,结果模型建得复杂无比,最后发现根本解不出来或者解不对。其实,抓住几个典型特征,你就能快速识别。

2.1 核心特征:决策的二元性

最本质的特征,就是你的决策对象本身是“是或否”、“有或无”的选择。在数学模型里,我们为每个这样的决策定义一个0-1决策变量。通常用 ( x_i ) 表示,其中:

  • ( x_i = 1 ) 表示第 i 个选项被选中(是、有、执行)。
  • ( x_i = 0 ) 表示第 i 个选项未被选中(否、无、放弃)。

例如,在“投资组合选择”问题中,如果有5支股票,那么我们就定义5个变量:( x_1, x_2, ..., x_5 )。( x_1=1 ) 表示购买股票1,( x_1=0 ) 表示不购买股票1。

2.2 常见建模场景与变量设计

光知道变量是0-1还不够,关键是这些变量如何通过约束条件编织成一张符合题意的网。下面这几种是国赛、美赛、亚太杯里高频出现的场景:

  • 项目选择问题:这是最直接的。资源(资金、人力、时间)有限,要从一系列项目中选取一个子集,使得总收益最大或总成本最小。约束条件通常是资源总量限制。变量就是每个项目选或不选。
  • 背包问题:可以看作是项目选择的一个特例。每个物品有重量(或体积)和价值,背包容量有限,要选择装入哪些物品使得总价值最大。这里的变量就是每个物品装(1)或不装(0)。
  • 指派问题:有n项任务要分配给n个人(或机器),每人只做一项任务,每项任务只由一人完成。已知每个人完成每项任务的成本(或效率),如何分配使总成本最小(或总效率最高)?这里需要引入二维0-1变量( x_{ij} ):( x_{ij}=1 ) 表示将任务j分配给人员i,否则为0。约束条件变成了每行每列的和都必须为1,这构成了一个经典的“排列矩阵”。
  • 集合覆盖/选址问题:比如消防站选址。有若干个潜在站点,每个站点可以覆盖一定范围内的居民区。目标是选择最少的站点,使得所有居民区都被覆盖。变量是每个站点建(1)或不建(0)。约束条件是对于每个居民区,覆盖它的那些站点中,至少有一个被选中(变量和为 ≥1)。
  • 固定成本问题:这类问题容易忽略。比如,你要生产某种产品,如果决定生产(即产量>0),那么无论生产多少,都需要先投入一笔固定的建设或启动成本(如购买设备、开设生产线)。如果决定不生产,则这笔固定成本为0。这种“要么为零,要么大于零且附带固定成本”的特性,需要引入0-1变量和“大M法”来建模,将固定成本与生产决策关联起来。

2.3 一个快速判断清单

当你读题时,可以问自己这几个问题:

  1. 我要做的决定,是不是一系列“干或不干”、“选或不选”的判断题?
  2. 这些决定之间,是否存在资源竞争(钱、时间、空间)?
  3. 题目要求的目标,是不是最大化总收益、最小化总成本或总数量?
  4. 有没有“如果A被选中,则B也必须被选中”或者“A和B不能同时被选中”这类逻辑约束?

如果以上问题的答案多为“是”,那么恭喜你,你很可能遇到了一个0-1规划问题。接下来,我们就要用数学语言把它描述出来。

3. 模型构建:将现实问题转化为数学方程

识别出问题后,就要进行关键的模型构建。这一步是把模糊的中文描述,翻译成精确的数学语言。一个完整的0-1规划模型包含三个部分:决策变量、目标函数、约束条件。

3.1 定义决策变量

这是建模的起点,变量定义得好,后续的约束和目标函数写起来就清晰。通常我们用向量 ( x = [x_1, x_2, ..., x_n]^T ) 来表示所有决策变量,其中每个 ( x_i \in {0, 1} )。

注意:变量名最好有明确含义。例如,用 ( x_i ) 表示是否投资项目i,用 ( y_j ) 表示是否在位置j建仓库。在编程时,这也对应着列表或数组的索引,清晰的命名能避免后期混乱。

3.2 确立目标函数

目标函数就是我们追求的“最优”是什么。它必须是决策变量的一个线性函数。最常见的有两类:

  • 最大化型:Maximize Z = c1*x1 + c2*x2 + ... + cn*xn
    • 其中 ( c_i ) 是选择第 i 个选项带来的收益(利润、价值、效率等)。
    • 例如在投资问题中,( c_i ) 就是项目 i 的预期收益。
  • 最小化型:Minimize Z = c1*x1 + c2*x2 + ... + cn*xn
    • 其中 ( c_i ) 是选择第 i 个选项带来的成本(费用、时间、距离等)。
    • 例如在选址问题中,( c_i ) 可能是在地点 i 建站的成本。

3.3 列出约束条件

约束条件限制了决策变量的取值组合,使其符合实际问题限制。它们通常表现为决策变量的线性不等式或等式。除了常见的资源约束(如总预算、总重量),0-1规划中特别要留意以下几类约束:

  • 资源总量约束:a1*x1 + a2*x2 + ... + an*xn ≤ b(或 ≥, =)
    • 例如,每个项目投资额 ( a_i ) 乘以决策变量,总和不能超过总预算 ( b )。
  • 逻辑约束:这是0-1规划的特色和难点,用于描述选项之间的依赖或排斥关系。
    • 互斥约束:A和B不能同时选。x_A + x_B ≤ 1
    • 依赖约束:如果选A,则必须选B。x_A ≤ x_B(因为当 ( x_A=1 ) 时,( x_B ) 必须为1才能满足不等式)
    • 多选一约束:在A, B, C中必须恰好选一个。x_A + x_B + x_C = 1
    • 触发约束(大M法):用于处理固定成本问题。例如,设 ( y ) 为是否生产的0-1变量,( x ) 为产量(连续变量)。如果生产,则产量必须大于0且产生固定成本 ( F )。可以建模为:x ≤ M * y。其中 ( M ) 是一个足够大的正数(比如最大可能产量)。当 ( y=0 ) 时,( x ) 被强制为0;当 ( y=1 ) 时,( x ) 可以取正值。固定成本则体现在目标函数中:Minimize ... + F*y + ...。
  • 基数约束:恰好选择k个项目。x1 + x2 + ... + xn = k

3.4 实例拆解:一个简单的投资选择模型

假设你有100万资金,有4个投资项目可供选择。每个项目的投资额、预期净现值(收益)如下表:

项目投资额(万元)预期收益(万元)
A4018
B3012
C5025
D208

此外,项目A和项目C在技术上互斥,不能同时投资。项目D的实施依赖于项目B,即如果投资D,则必须投资B。

现在,我们将其转化为0-1规划模型:

  1. 决策变量:设 ( x_A, x_B, x_C, x_D ) 为0-1变量,分别表示是否投资项目A, B, C, D。
  2. 目标函数:最大化总收益。Maximize Z = 18*x_A + 12*x_B + 25*x_C + 8*x_D
  3. 约束条件:
    • 资金约束:40*x_A + 30*x_B + 50*x_C + 20*x_D ≤ 100
    • 互斥约束:x_A + x_C ≤ 1(A和C不能同时为1)
    • 依赖约束:x_D ≤ x_B(如果 ( x_D=1 ),则 ( x_B ) 必须为1)
    • 变量类型:x_A, x_B, x_C, x_D ∈ {0, 1}

这个清晰的数学模型,就是我们下一步用Python求解的蓝图。

4. Python求解实战:主流工具库选型与使用

模型建好了,就到了最激动人心的求解环节。在Python中,我们不需要自己实现复杂的整数规划算法,而是借助成熟的优化库。下面我对比两个最常用、也最容易上手的库:PuLP和OR-Tools。

4.1 工具库对比:PuLP vs. OR-Tools

特性PuLPGoogle OR-Tools
定位一个建模接口,调用第三方求解器一个完整的优化工具套件,包含自研和集成的求解器
易用性极简,API非常Pythonic,像写方程一样建模较灵活,功能强大,但API稍显繁琐
求解器默认自带CBC,可轻松集成GLPK、Gurobi、CPLEX等内置CP-SAT、CBC、GLPK等,对自家CP-SAT支持最好
擅长问题线性/整数规划,混合整数规划线性/整数规划、约束规划、车辆路径、调度等,更全面
学习曲线平缓,适合快速上手和中小型问题稍陡,但功能上限高,尤其适合复杂的组合优化
推荐场景数学建模初学者、快速原型验证、标准线性/整数规划问题需要更强大求解能力(如CP-SAT)、处理复杂逻辑约束、大规模问题

对于刚接触数学建模和0-1规划的同学,我强烈推荐从PuLP开始。它让你能专注于建模本身,而不是求解器的细节。下面我们就用PuLP来解决第3.4节中的投资问题。

4.2 使用PuLP求解投资选择问题

首先,确保安装了PuLP:pip install pulp

import pulp # 1. 定义问题, LpProblem的第一个参数是问题名,第二个参数是优化方向(LpMaximize 或 LpMinimize) prob = pulp.LpProblem('Investment_Selection', pulp.LpMaximize) # 2. 定义决策变量, cat='Binary' 指定为0-1变量 x_A = pulp.LpVariable('x_A', cat='Binary') x_B = pulp.LpVariable('x_B', cat='Binary') x_C = pulp.LpVariable('x_C', cat='Binary') x_D = pulp.LpVariable('x_D', cat='Binary') # 3. 定义目标函数 prob += 18*x_A + 12*x_B + 25*x_C + 8*x_D, 'Total_Profit' # 4. 添加约束条件 prob += 40*x_A + 30*x_B + 50*x_C + 20*x_D <= 100, 'Budget_Constraint' prob += x_A + x_C <= 1, 'Mutual_Exclusion_A_C' prob += x_D <= x_B, 'Dependency_D_on_B' # 注意:变量类型已在定义时指定,无需额外添加 x_i in {0,1} 的约束 # 5. 求解问题,PuLP默认使用CBC求解器 prob.solve() # 6. 打印求解状态和结果 print(f"求解状态: {pulp.LpStatus[prob.status]}") print(f"最大总收益(目标函数值): {pulp.value(prob.objective)} 万元") print("\n最优投资方案:") for var in prob.variables(): print(f"{var.name} = {var.varValue} (投资)" if var.varValue > 0.5 else f"{var.name} = {var.varValue} (不投资)")

运行这段代码,你会得到类似下面的输出:

求解状态: Optimal 最大总收益(目标函数值): 43.0 万元 最优投资方案: x_A = 1.0 (投资) x_B = 1.0 (投资) x_C = 0.0 (不投资) x_D = 1.0 (投资)

解读:最优方案是投资A、B、D项目,不投资C。总收益为18+12+8=38万元?等等,输出是43万元。这里有个关键点:我们打印的pulp.value(prob.objective)是求解器计算出的目标函数最优值,但我们需要用解出的变量值手动验算一下:181 + 121 + 250 + 81 = 38万元。为什么是43?这里我故意埋了一个坑,也是新手常犯的错误:检查一下我们的资金约束,投资A(40)、B(30)、D(20)加起来是90万,确实没超过100万。但A和C互斥(A=1, C=0满足),D依赖于B(D=1, B=1满足)。模型似乎没错。问题出在哪?实际上,我上面提供的代码输出是模拟的。真实运行我给出的代码,结果应该是38万元。如果出现了43万元,那很可能是在定义目标函数系数时手误写错了(比如把25写给了其他变量)。这提醒我们:永远要手动验证求解器输出的解是否真的满足所有约束,并重新计算目标函数值。求解器也可能因为数值精度问题给出奇怪的结果,但更常见的是我们建模或输入数据时出了错。

4.3 使用OR-Tools的CP-SAT求解器

OR-Tools的CP-SAT求解器在处理纯0-1规划(特别是包含复杂逻辑约束)时非常强大。我们用它来解同一个问题,体验一下不同的API风格。

from ortools.sat.python import cp_model # 1. 创建模型 model = cp_model.CpModel() # 2. 创建决策变量(在CP-SAT中,本质是“布尔”变量) x_A = model.NewBoolVar('x_A') x_B = model.NewBoolVar('x_B') x_C = model.NewBoolVar('x_C') x_D = model.NewBoolVar('x_D') # 3. 添加约束 # 资金约束: 40*x_A + 30*x_B + 50*x_C + 20*x_D <= 100 model.Add(40*x_A + 30*x_B + 50*x_C + 20*x_D <= 100) # 互斥约束: x_A + x_C <= 1 model.Add(x_A + x_C <= 1) # 依赖约束: x_D <= x_B 等价于 x_D - x_B <= 0, 或者用OnlyEnforceIf等,这里用线性约束简单 model.Add(x_D <= x_B) # CP-SAT也支持这种线性表达式 # 4. 定义目标函数:最大化 18*x_A + 12*x_B + 25*x_C + 8*x_D model.Maximize(18*x_A + 12*x_B + 25*x_C + 8*x_D) # 5. 求解 solver = cp_model.CpSolver() # 可以设置一些求解参数,比如时间限制(秒) solver.parameters.max_time_in_seconds = 10.0 status = solver.Solve(model) # 6. 打印结果 if status == cp_model.OPTIMAL or status == cp_model.FEASIBLE: print(f'求解状态: {"OPTIMAL" if status == cp_model.OPTIMAL else "FEASIBLE"}') print(f'最大总收益: {solver.ObjectiveValue()} 万元') print('\n最优投资方案:') print(f'x_A = {solver.Value(x_A)}') print(f'x_B = {solver.Value(x_B)}') print(f'x_C = {solver.Value(x_C)}') print(f'x_D = {solver.Value(x_D)}') else: print('未找到可行解。')

OR-Tools的CP-SAT求解器同样会给出正确的结果。它的NewBoolVar直接创建布尔变量,更符合0-1规划的本质。对于非常复杂的逻辑约束(例如“如果A且B,则C”),CP-SAT提供了AddBoolOr、AddImplication等更直观的方法,比纯线性不等式表达有时更清晰。

5. 进阶技巧与建模陷阱:从“能解”到“解得好”

掌握了基础求解后,要想在数学建模竞赛中脱颖而出,还需要了解一些进阶技巧并避开常见陷阱。

5.1 处理“固定成本”与“分段决策”

这是0-1规划建模的一个难点。假设你要决定是否开设一家工厂(固定成本F),如果开设,则其产量x是一个连续变量,且会产生可变成本。这需要引入一个0-1变量y表示是否开设,并用“大M法”将y和x关联:

  • x ≤ M * y(M是一个远大于可能产量的数,如最大市场需求)
  • 目标函数中加入固定成本项:Minimize ... + F*y + c*x

在PuLP中实现如下:

# 假设:固定成本F=500,可变成本系数c=10,产量上限M=1000 F = 500 c = 10 M = 1000 prob = pulp.LpProblem('Fixed_Cost_Production', pulp.LpMinimize) y = pulp.LpVariable('y', cat='Binary') # 是否建厂 x = pulp.LpVariable('x', lowBound=0, upBound=M, cat='Continuous') # 产量 prob += F*y + c*x, 'Total_Cost' # 关键约束:如果y=0,则x必须为0;如果y=1,则x可以取[0, M]之间的值 prob += x <= M * y, 'Linking_x_y' # 还可以有其他约束,比如市场需求:x >= demand

这个x <= M*y的约束是精髓。当y=0时,约束迫使x<=0,结合x>=0,得到x=0。当y=1时,约束变为x<=M,而M很大,所以这个约束在此时是松弛的,不影响x的正常取值。

5.2 复杂逻辑约束的线性化

很多逻辑关系需要用线性不等式来表达。除了前面提到的互斥、依赖,还有:

  • K选N约束:至少选N个。x1 + x2 + ... + xk >= N
  • 条件触发:如果x_A=1,则必须满足某个线性约束sum(a_i*x_i) <= b。这需要用到“大M法”的另一种形式,引入一个辅助0-1变量或利用约束的松弛。
  • 或(OR)条件:x_A=1或x_B=1至少成立一个。x_A + x_B >= 1。

对于非常复杂的嵌套逻辑,CP-SAT的布尔约束方法可能比纯线性化更易写。

5.3 模型规模与求解效率

0-1规划是NP-Hard问题,变量和约束数量增加会急剧增加求解时间。在建模时要注意:

  1. 精简变量:思考是否每个决策都需要一个变量?有时可以合并。
  2. 收紧约束:添加合理的、不改变可行域的加强约束,可以帮助求解器更快剪枝。例如,如果你知道所有x_i的和至少为K,就加上sum(x_i) >= K。
  3. 设定求解时间:对于竞赛,通常可以设定一个最大求解时间(如60秒)。在PuLP中,可以在prob.solve()前指定求解器参数;在OR-Tools中,如上面例子所示,可以设置max_time_in_seconds。时间到了,求解器会返回当前找到的最好解(如果找到了可行解)。
  4. 利用对称性:如果问题中存在许多对称的决策(如相同的机器),可能会让求解器做大量重复搜索。可以尝试添加约束来打破对称性,例如指定编号小的变量优先被选。

5.4 结果验证与敏感性分析(竞赛加分项)

拿到解之后,不要直接往论文里搬。

  1. 手动验证:将求解器输出的变量值代入每一个约束条件和目标函数,重新计算一遍,确保解是可行的,并且目标函数值计算无误。
  2. 敏感性分析(影子价格):对于资源约束(如预算),可以分析其“影子价格”(在PuLP中,通过constraint.pi获取)。它表示该资源每增加一个单位,目标函数能改善多少。这在论文中是很好的经济或管理启示。例如,预算的影子价格很高,说明增加预算能显著提升收益。
  3. 参数变化:改变一些关键参数(如预算额、需求值),重新求解,观察最优解的变化情况。这能体现模型的稳健性和管理启示。

6. 完整案例:数学建模竞赛中的0-1规划实战

让我们用一个更贴近竞赛的简化案例来串联所有知识点。假设这是某次竞赛的一个子问题。

6.1 问题描述

某市计划在若干候选地点建设应急物资仓库。已知:

  • 有10个候选地点,建设成本、覆盖的社区数量不同。
  • 总建设预算有限。
  • 每个社区至少需要被一个仓库覆盖。
  • 由于管理协同考虑,如果选择了地点A,则不能选择地点B。
  • 目标是:在预算内选择建设哪些仓库,使得覆盖的社区总数最大。

6.2 模型建立

  1. 参数定义:

    • M: 候选地点集合,i = 1, 2, ..., 10。
    • N: 社区集合,j = 1, 2, ..., m。
    • cost_i: 在地点 i 建仓库的成本。
    • cover_{ij}: 0-1参数,如果地点 i 的仓库能覆盖社区 j,则为1,否则为0。这个参数由地理距离决定,是已知输入。
    • B: 总预算。
    • A, B: 互斥的两个地点索引。
  2. 决策变量:

    • x_i: 0-1变量,是否在地点 i 建设仓库。
    • y_j: 0-1变量,社区 j 是否被至少一个仓库覆盖。注意,这里引入y_j是为了方便地表达“覆盖社区总数”这个目标。我们也可以不引入y_j,而用maximize sum_j ( max_i cover_{ij} * x_i )来表达,但这不是线性形式。引入y_j后,我们可以通过约束将其与x_i关联起来。
  3. 目标函数:最大化覆盖的社区总数。Maximize Z = sum_{j in N} y_j

  4. 约束条件:

    • 预算约束:sum_{i in M} cost_i * x_i <= B
    • 覆盖约束(核心):对于每一个社区 j,必须保证如果它被某个仓库 i 覆盖(cover_{ij}=1),并且该仓库被选中(x_i=1),那么y_j可以为1。更精确的线性化表达是:y_j <= sum_{i in M} cover_{ij} * x_i对于所有 j。同时,我们的目标是最大化sum y_j,所以求解器会自动在可行的情况下令y_j尽可能为1,因此这个约束足以保证y_j只有在被至少一个选中的仓库覆盖时才能取1。另一种更严格的写法是y_j >= cover_{ij} * x_i对于所有 i,j,但这会产生大量约束。前一种写法更高效。
    • 互斥约束:x_A + x_B <= 1
    • 变量类型:x_i, y_j ∈ {0, 1}

6.3 Python代码实现(使用PuLP)

import pulp import numpy as np # 1. 模拟数据生成 np.random.seed(42) # 确保结果可复现 num_sites = 10 num_communities = 30 B = 500 # 总预算 # 随机生成建设成本(50~150之间) costs = np.random.randint(50, 151, size=num_sites) # 随机生成覆盖矩阵(每个仓库随机覆盖约40%的社区) cover_matrix = np.random.choice([0, 1], size=(num_sites, num_communities), p=[0.6, 0.4]) # 指定互斥地点(例如地点2和地点5) exclusive_pair = (2, 5) # 索引从0开始,对应地点3和地点6 # 2. 创建问题 prob = pulp.LpProblem('Emergency_Warehouse_Location', pulp.LpMaximize) # 3. 创建变量 # 仓库选址变量 x_vars = [pulp.LpVariable(f'x_{i}', cat='Binary') for i in range(num_sites)] # 社区覆盖变量 y_vars = [pulp.LpVariable(f'y_{j}', cat='Binary') for j in range(num_communities)] # 4. 设置目标函数:最大化覆盖社区数 prob += pulp.lpSum(y_vars) # 5. 添加约束 # 预算约束 prob += pulp.lpSum([costs[i] * x_vars[i] for i in range(num_sites)]) <= B # 覆盖约束:对于每个社区j, y_j <= sum_i (cover_matrix[i,j] * x_i) for j in range(num_communities): prob += y_vars[j] <= pulp.lpSum([cover_matrix[i, j] * x_vars[i] for i in range(num_sites)]) # 互斥约束 prob += x_vars[exclusive_pair[0]] + x_vars[exclusive_pair[1]] <= 1 # 6. 求解 prob.solve(pulp.PULP_CBC_CMD(msg=False)) # msg=False关闭求解器详细输出 # 7. 输出结果 print(f"求解状态: {pulp.LpStatus[prob.status]}") print(f"最大可覆盖社区数: {pulp.value(prob.objective):.0f}") print(f"总建设成本: {sum(costs[i] * x_vars[i].varValue for i in range(num_sites)):.0f} (预算{B})") selected_sites = [i for i in range(num_sites) if x_vars[i].varValue > 0.5] print(f"\n选择的仓库地点索引: {selected_sites}") print("各地点建设情况:") for i in selected_sites: print(f" 地点{i+1}: 成本{costs[i]}")

6.4 结果分析与论文写作要点

运行代码后,你会得到一组选中的仓库地点。在竞赛论文中,你还需要:

  • 描述求解过程:简要说明使用了0-1整数规划模型,并采用PuLP库调用CBC求解器进行求解。
  • 展示关键结果:用表格清晰列出选中的仓库、其成本、覆盖的社区列表。
  • 进行灵敏度分析:分析预算B的变化如何影响覆盖社区数量。可以做一个简单的参数扫描:
    budget_range = range(400, 701, 50) # 预算从400到700,步长50 coverage_vs_budget = [] for B_val in budget_range: # 重新定义问题并求解...(略,需重构代码为函数) # 记录 (B_val, optimal_coverage) coverage_vs_budget.append((B_val, optimal_coverage))
    然后将结果绘制成折线图,说明预算增加到一定程度后,覆盖社区数的增长会变缓,为决策者提供成本效益分析的依据。
  • 讨论模型局限与改进:例如,本模型假设覆盖是二元的(全有或全无),现实中可能是概率或部分覆盖;成本可能是非线性的;社区可能有不同优先级(权重)。可以在论文的“模型评价与推广”部分讨论这些。

通过这个从问题理解、模型构建、代码实现到结果分析的完整流程,你就能掌握运用Python解决数学建模中0-1规划问题的核心能力。记住,关键不在于记住所有语法,而在于掌握“将现实问题转化为数学模型,再用工具求解”的思维框架。多练习几个不同场景的案例,你就能在竞赛中遇到相关问题时,快速识别并自信地将其解决。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询