繁体   English   中英

寻找线性系统的最小值和最大值

[英]Finding min and max of a linear system

所以我试图理解课堂练习中的一个场景,即找到函数的最大值和最小值。 我有两个权重向量 w 和 v,它们的总和为 1。向量是 w = [0.6, 0.2, 0.2]^T v = [0.8, -0.2, 0.4]^T

这些向量形成权重 M = Aw + Bv 的线性组合,并且 A 和 B 的总和必须为 1。然后我们要优化的函数是 r = [0.1, 0.2, 0.1] • M

约束如下: 0 ≤ (0.6A + 0.8B) <= 1 , 0 ≤ (0.2A - 0.2B) <= 1 , 0 ≤ (0.2A + 0.4B) <= 1

我们应该得到的答案是 A = B = .5,r 的最小值为 0.1。 对于最大值,我们应该得到 A = 2,B = -1,r = 0.16。 但是我得到的最大值是 A = 3.5714286,B = -1.4285714,而我得到的最小值是 A = B = 0。

下面是代码。

import pulp as p
from pulp import *

problem = LpProblem('Car Factory', LpMaximize)

A = LpVariable('Amound of w',  cat=LpContinuous)
B = LpVariable('Amount of v',  cat=LpContinuous)

#Objective Function
problem += (0.1)*(0.6*A + 0.8*B) + (0.2)*(0.2*A - 0.2*B) + (0.1)*(0.2*A + 0.4*B) , 'Objective Function'
#Constraints
problem += (0.6*A + 0.8*B) <= 1 , 'A'
problem += (0.6*A + 0.8*B) >= 0 , 'AL'
problem += (0.2*A - 0.2*B) <= 1, 'B'
problem += (0.2*A - 0.2*B) >= 0, 'BL'
problem += (0.2*A + 0.4*B) <= 1, 'C'
problem += (0.2*A + 0.4*B) >= 0, 'CL'

problem.solve()
print("Amount of w: ", A.varValue)
print("Amount of v: ", B.varValue)
print("total: ", value(problem.objective))

我确定这与我没有看到的设置有关。 还有一种更有效的方法可以将它们组合在一起吗?

我认为您缺少一个约束,这可以解释您与预期结果的偏差。 你的约束在哪里:

A + B == 1

此外,您两次导入pulp ,这可能会导致代码命名空间出现一些混乱。 做一个或另一个,而不是两个。

关于更有效地表达问题......? 不。 可以将您的两个列向量视为长度为 3 的数组,并在您的目标中做一些不同的数学运算,但这可能不值得,而且您的变量只是标量,所以我会像您一样编写它。 现在,如果向量更大,或者变量是向量,当然,我会做其他事情。

据我所知, pulp不会自然地处理向量(如numpy数组)。 如果您要以向量矩阵格式进行大量优化并且您对线性代数感到满意,您可能会查看自然处理它们的cvxpy 如果您在使用pulp的课程中,则可以学习基础知识。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM