作者:欧新宇(Xinyu OU)
当前版本:Release v1.0
开发平台:Python3.11
运行环境:Intel Core i7-7700K CPU 4.2GHz, nVidia GeForce GTX 1080 Ti
本教案所涉及的数据集仅用于教学和交流使用,请勿用作商用。
最后更新:2024年2月27日
图论基础、最小生成树
使用word文档或Markdown文档进行作答,使用Python编写程序,最终结果合并为一个word文档或Markdown文档,并另存为PDF格式进行提交。
注意:可以使用手机拍照文档进行提交,但请不要使用word文档直接进行提交。
[习题5.2-P134] 一个塑料大筐里装满了鸡蛋,两个两个地数,余1个鸡蛋;三个三个地数,正好输完;四个四个地数,余1个鸡蛋;五个五个地数,余4个鸡蛋;六个六个地数,余3个鸡蛋;七个七个地数,余4个鸡蛋;八个八个地数,余1个鸡蛋;九个九个地数,正好输完。请建立数学规划模型求大筐中鸡蛋个数的最小值是多少。
要求手工建模后使用Python进行求解。
(1)模型假设
设大框中鸡蛋个数的最小值为 。根据题目中的条件建立如下数学规划模型求解 。
(2)建立模型
其中,约束条件中的 表示 除以2的余数, 表示 除以3的余数,以此类推。
(3)模型简化
以上数学规划模型为非线性整数规划模型,无法直接使用Python进行求解。但我们可以引入8个松弛整数变量 ,将非线性问题转换为整数规划模型进行求解。
(4)编程求解
接下来,我们使用Python编写代码求解该问题,最终可以计算得到鸡蛋的最小个数为1089个。
import numpy as np
import cvxpy as cp
a = np.array([1,0,1,4,3,4,1,0]) # 8个余数值
x = cp.Variable(integer = True) # 定义整数变量x
y = cp.Variable(8,integer = True) # 定义8个整数变量y
objective = cp.Minimize(x) # 定义目标函数为最小化变量x
constraints = [x >= 0, y >= 0] # 定义约束条件
for i in range(8): # 定义约束条件
constraints.append((i+2) * y[i] + a[i] == x)
prob = cp.Problem(objective, constraints)
result = prob.solve(solver = cp.GLPK_MI)
print('最小个数为:', result)
最小个数为: 1089.0