目录
前言
一、实测
1、整数规划问题
2、非线性规划问题
二、代码正确性验证
1、整数规划问题代码验证
2、非线性规划问题代码验证
三、结果正确性验证
1、整数规划问题结果正确性验证
2、非线性规划问题正确性验证
四、整数规划问题示例
后记
前言
模型:使用ollama部署的deepseek-r1:14b。
一、实测
直接问:规划求解python代码
回答:它给出了两份代码,一个适用于整数规划问题,一个适用于非线性规划。
1、整数规划问题
from pulp import *
# 创建问题
prob = LpProblem('example', LpMaximize)
# 定义变量
x1 = LpVariable('x1', 0, None, Integer)
x2 = LpVariable('x2', 0, None, Integer)
# 定义目标函数
prob += 3 * x1 + 2 * x2
# 定义约束条件
prob += x1 + x2 <= 4
prob += 2 * x1 + x2 <= 6
# 求解问题
prob.solve()
# 输出结果
print("状态:", prob.status)
print(f"x1 = {x1.value}")
print(f"x2 = {x2.value}")
print(f"目标函数值 = {value(prob.objective)}")
2、非线性规划问题
from scipy.optimize import minimize
# 目标函数
def objective(x):
return x[0]**2 + x[1]**2
# 约束条件
constraints = [
{'type': 'ineq', 'fun': lambda x: 4 - (x[0] + x[1])}, # x1 + x2 <= 4
{'type': 'ineq', 'fun': lambda x: 6 - (2*x[0] + x[1])} # 2x1 + x2 <= 6
]
# 初始猜测值
x0 = [0, 0]
# 使用SLSQP方法求解
result = minimize(objective, x0, method='SLSQP', constraints=constraints)
if result.success:
print("结果:")
print(f"x1 = {result.x[0]:.2f}")
print(f"x2 = {result.x[1]:.2f}")
print(f"目标函数值 = {result.fun}")
else:
print("无解或问题未定义。")
二、代码正确性验证
1、整数规划问题代码验证
直接报错……
问题:LpVariable方法的第四个参数有问题。
# 定义变量
x1 = LpVariable('x1', 0, None, Integer)
x2 = LpVariable('x2', 0, None, Integer)
改为:
# 定义变量
x1 = LpVariable('x1', 0, None, "Integer")
x2 = LpVariable('x2', 0, None, "Integer")
或者改为这个也行:
# 定义变量
x1 = LpVariable('x1', 0, None, LpInteger)
x2 = LpVariable('x2', 0, None, LpInteger)
修改完就正常运行了。
2、非线性规划问题代码验证
第二份代码就正常运行了。
三、结果正确性验证
1、整数规划问题结果正确性验证
显然,一眼就看出来了,它结果有问题,x1和x2应为具体的数值。
问题:
print(f"x1 = {x1.value}")
print(f"x2 = {x2.value}")
在源码中找到一个比较可疑的变量名,试试看。
修改:
print(f"x1 = {x1.varValue}")
print(f"x2 = {x2.varValue}")
结果:
那么这个结果是否正确呢?还需进一步验证
问题转换:
设:x = x1,y = x2(为方便查看)
限制条件:
① x ≥ 0,且为整数
② y ≥ 0,且为整数
③ x + y ≤ 4
④ 2x + y ≤ 6
求:当x和y取何值时,3x + 2y取最大值(创建问题时使用的是LpMaximize,即求最大值)
解:直接上图
正确答案为:x = 2,y = 2,目标函数最大值为10。
结果正确。
2、非线性规划问题正确性验证
问题转换:
设:x = x1,y = x2(为方便查看)
限制条件:
① x ≥ 0(因初始猜测值的是x0 = [0, 0])
② y ≥ 0(因初始猜测值的是x0 = [0, 0])
③ x + y ≤ 4
④ 2x + y ≤ 6
求:当x和y取何值时,x² + y²取最小值(使用的是SciPy库中的optimize中的minimize)
解:直接上图
根据条件可知,x和y的取值范围在四边形ABCD的范围内,很容易得出当x = 0,y = 0时,x² + y²的最小值为0。
结果正确。
四、整数规划问题示例
from pulp import *
'''
物品A 6.85元/个
物品B 5.28元/个
物品C 2.3元/个
总价=90.56元
求A、B、C分别买了几个
'''
arr = [6.85, 5.28, 2.3]
total = 90.56
# 创建问题实例
prob = LpProblem("example", LpMaximize)
# 定义决策变量(整数)
n = len(arr)
variables = [LpVariable(f'x{i+1}', 0, None, LpInteger) for i in range(n)]
# 定义约束条件
prob += lpSum([arr[i] * variables[i] for i in range(n)]) == total
# 求解问题
prob.solve()
# 输出结果
print("Status:", prob.status)
for i in range(n):
print(f"x{i+1} = {variables[i].value()}")
'''
结果
Status: 1
x1 = 10.0
x2 = 2.0
x3 = 5.0
'''
from pulp import *
'''
假设有三种产品,每种产品的单位利润分别为 [3, 5, 4] 元,
而生产每个产品需要消耗的资源为 [2, 4, 3] 单位,
总共有 100 单位的资源可用。
目标是确定每种产品的生产数量,以使总利润最大化。
'''
# 输入数据
profits = [3, 5, 4] # 利润数组
resource_usage = [2, 4, 3] # 资源消耗数组
total_resource = 100 # 总资源可用量
# 创建问题实例
prob = LpProblem("Maximize_Profits", LpMaximize)
# 定义决策变量(整数)
n = len(profits)
variables = [LpVariable(f'x{i+1}', 0, None, LpInteger) for i in range(n)]
# 定义目标函数:最大化总利润
prob += lpSum([profits[i] * variables[i] for i in range(n)]), "Maximize Profits"
# 添加约束条件:资源限制
prob += lpSum([resource_usage[i] * variables[i] for i in range(n)]) <= total_resource, "Total Resource Constraint"
# 求解问题
prob.solve()
# 输出结果
print("Status:", prob.status)
for i in range(n):
print(f"x{i+1} = {variables[i].value()}")
print("Maximized Profit =", value(prob.objective))
'''
结果:
Status: 1
x1 = 50.0
x2 = 0.0
x3 = 0.0
Maximized Profit = 150.0
'''
后记
后面又测试了几次,有时候它给出的代码可以直接运行,有时候又有问题