考虑以下(凸)优化问题:
minimize 0.5 * y.T * y
s.t. A*x - b == y
其中优化(矢量)变量x
和y
和A
,b
是适当维度的矩阵和向量,分别。
下面的代码使用SLSQP
Scipy中的方法轻松找到解决方案:
import numpy as np
from scipy.optimize import minimize
# problem dimensions:
n = 10 # arbitrary integer set by user
m = 2 * n
# generate parameters A, b:
np.random.seed(123) # for reproducibility of results
A = np.random.randn(m,n)
b = np.random.randn(m)
# objective function:
def obj(z):
vy = z[n:]
return 0.5 * vy.dot(vy)
# constraint function:
def cons(z):
vx = z[:n]
vy = z[n:]
return A.dot(vx) - b - vy
# constraints input for SLSQP:
cons = ({'type': 'eq','fun': cons})
# generate a random initial estimate:
z0 = np.random.randn(n+m)
sol = minimize(obj, x0 = z0, constraints = cons, method = 'SLSQP', options={'disp': True})
Optimization terminated successfully. (Exit mode 0) Current function value: 2.12236220865 Iterations: 6 Function evaluations: 192 Gradient evaluations: 6
注意约束函数是一个方便的“数组输出”函数。
现在,代替约束的数组输出函数,原则上可以使用一组等效的“标量输出”约束函数(实际上,scipy.optimize文档仅讨论此类约束函数作为的输入minimize
)。
下面是对应的约束集,随后的输出minimize
(同样A
,b
和初始值与上述列出):
# this is the i-th element of cons(z):
def cons_i(z, i):
vx = z[:n]
vy = z[n:]
return A[i].dot(vx) - b[i] - vy[i]
# listable of scalar-output constraints input for SLSQP:
cons_per_i = [{'type':'eq', 'fun': lambda z: cons_i(z, i)} for i in np.arange(m)]
sol2 = minimize(obj, x0 = z0, constraints = cons_per_i, method = 'SLSQP', options={'disp': True})
Singular matrix C in LSQ subproblem (Exit mode 6) Current function value: 6.87999270692 Iterations: 1 Function evaluations: 32 Gradient evaluations: 1
显然,算法失败了(返回的目标值实际上是给定初始化的目标值),我觉得有点奇怪。请注意,运行[cons_per_i[i]['fun'](sol.x) for i in np.arange(m)]
表明sol.x
使用数组输出约束公式获得的满足cons_per_i
预期的所有标量输出约束(在数值公差范围内)。
如果有人对此问题有任何解释,我将不胜感激。
您已经遇到了“后期绑定闭包” 问题
。cons_i
使用第二个参数等于19进行的所有调用。
一种解决方法是args
在字典中使用定义约束的字典元素,而不是使用lambda函数闭包:
cons_per_i = [{'type':'eq', 'fun': cons_i, 'args': (i,)} for i in np.arange(m)]
这样,最小化工作:
In [417]: sol2 = minimize(obj, x0 = z0, constraints = cons_per_i, method = 'SLSQP', options={'disp': True})
Optimization terminated successfully. (Exit mode 0)
Current function value: 2.1223622086
Iterations: 6
Function evaluations: 192
Gradient evaluations: 6
您还可以使用链接文章中的建议,即使用带有第二个参数且具有所需默认值的lambda表达式:
cons_per_i = [{'type':'eq', 'fun': lambda z, i=i: cons_i(z, i)} for i in np.arange(m)]
问题内容: 我收到此错误消息: 第40行的错误1217(23000):无法删除或更新父行:外键约束失败 …当我尝试放置桌子时: …定义如下: 有趣的是, 我已经删除 了模式中具有外键的 所有其他表。实际上,除了表外,数据库是空的。 如果数据库中没有其他对象,怎么可能会有子行?据我所知,InnoDB不允许在其他模式上使用外键,对吗? (我什至可以运行命令:-?) 问题答案: 两种可能性: 在另一个架
嗨,我知道有人问过这个问题,但我还没有找到正确的答案,为什么当我尝试做我的第二个插入: 我得到了错误: 错误1452(23000):无法添加或更新子行:外键约束失败(.,约束外键()引用()) 下面的DDL代码:
我尝试使用cbv的im来保存一个对象,我不熟悉使用它,并且我尝试使用create view来保存一个对象,但是得到这个错误: "Not NULL约束失败:forum_question.user_id" 我将不胜感激初学者友好的解释如何解决这个问题,也许还有提示,谢谢! models.py: 表单.py: 视图.py: 例外?: 编辑3: 其他信息: 回溯(最近一次调用最后):文件“/主页/钛/本地
在不同的限制条件下,我试图挑选最好的梦幻足球队。我的目标是挑选能够最大化其预测积分总和的球员。 制约因素是: 1) 团队必须包括: -1个QB -2苏格兰皇家银行 -2个WRs -1 TE 2)玩家的风险不得超过6 3) 球员的费用总额不得超过300英镑。 如何做到这一点?R中优化这些约束的最佳包/函数是什么?在给定这些约束的情况下,最大化投影点的函数调用会是什么样子?仅供参考,我将搜索100-3
我有这样布局的模型: 这里的场景是我永远不希望用户删除数据。相反,删除只会隐藏记录。但是,我仍然希望所有非软删除的记录都遵循唯一的键约束。基本上,我希望有尽可能多的重复的已删除记录,但只有一个唯一的未删除记录可以存在。所以我本来想包括“已删除”字段(由django安全删除库提供),但问题是Django的唯一检查因“psycopg2”而失败。完整性错误:重复的键值违反了 ['field2', 'fi
问题内容: 我正在使用Django从Tango中学习Django,但是在输入时,我始终收到此错误: 这是输出: Models.py: 问题答案: 造成这种限制的原因可能是,在你最初迁移它时,在类中没有任何字段被调用(第一次迁移),并且在模型中添加了该字段之后,当你运行时,你已将默认值设置为静态值值(即或”等),并且打破了类别表的表段列的唯一约束,其中表段应该是唯一的,但这不是因为所有条目都将获得该