我在将参数传递给 时遇到了问题optim。例如,假设我想对多元函数进行框约束最小化
fr <- function(x) { ## Rosenbrock function
x1 <- x[1]
x2 <- x[2]
x3 <- x[3]
x4 <- x[4]
100 * (x2 - x1 * x1)^2 + (1 - x1)^2 +
100 * (x3 - x2 * x2)^2 + (1 - x2)^2 +
100 * (x4 - x3 * x3)^2 + (1 - x3)^2
}
Run Code Online (Sandbox Code Playgroud)
像往常一样optim可以使用如下:
optim(par = c(0, 1, 1, 2), fr, method = "L-BFGS-B", lower = c(0, 0, 0, 0), upper = …Run Code Online (Sandbox Code Playgroud) 我正在使用 GNU glpk 求解器解决混合整数规划(MIP) 问题。该问题包含大约 1,625 列和 507 行,我认为这不是一个大规模问题。但是,glpk 在解决问题超过 9 小时后未能提供解决方案。
我想知道是否有人遇到过类似的问题或有任何加快计算速度的建议。否则,您是否有任何其他 MIP 求解器建议我可以尝试对源代码进行少量更改?
optimization mathematical-optimization linear-programming glpk
我目前正在尝试使用 scipy 优化函数。我对变量有一些限制,从这个链接:http : //docs.scipy.org/doc/scipy-0.14.0/reference/tutorial/optimize.html,看来SLSQP正是我想要的。在他们的例子中,他们有一个明确定义的关于输入的结果的明确公式,他们从中找到了梯度。我有一个极其令人厌恶的计算密集型函数,它计算电磁场如何从金属壁反弹,这绝不能以封闭形式表达(如果您有兴趣,我正在使用 MEEP FDTD Python 模拟)。scipy 中是否有一个等效的函数可以为您找到函数的梯度然后进行优化?或者,等效地,是否有一个内置于 scipy 的函数(任何基本的 python 库都可以),它会为我找到函数的梯度,然后我可以将其传递给这个优化程序?任何建议将不胜感激。
如何找到不超过某个值的最大项目总和?例如,我有45个这样的值:1.0986122886681098、1.6094379124341003、3.970291913552122、3.1354942159291497、2.5649493574615367。我需要找到不超过 30.7623 的最大可能组合。
我无法使用暴力来找到所有组合,因为组合的数量将会很大。所以我需要使用一些贪心算法。
python algorithm knapsack-problem mathematical-optimization greedy
在谷歌上做了大量搜索后,我无法在 python 中找到任何交通算法求解器。我希望在 Scipy 中找到一些没有用的东西。有人可以指导我找到正确的来源吗?
不知道在哪里发布这个问题,我知道有些策展人会问我代码或说这不是一个合适的地方。在这种情况下,请不要忘记将我引导到正确的地方。
我的问题:
Max(Sum_{i,j}( Cij*Xij) )
x11 + x12 + x13 = D1
X21 + X22 + x23 = D2
X11<10
X23 <100
Run Code Online (Sandbox Code Playgroud)
我通常会有 100,000 个汇(创造需求)和大约 1000 个来源(供应需求)。
algorithm optimization mathematical-optimization scipy python-2.7
在我的 Java 应用程序中,我需要根据以下数据重新计算平均值:
avgValueavgValue是 12 个值列表的平均值 - count。value根据此信息,当新值添加到之前 12 个值的列表中时,如何重新计算 avgValue 。avgValue13 个值的列表有什么新内容- count + 1?
假设我有以下系统说明的一些变量和约束:
灰线可以拉伸和收缩它们顶部的范围给定的量。蓝线只是端点,显示了灰线如何相互作用。
我的目标:我想使用线性规划来均匀地最大化灰线的大小,如图所示。你可以想象带有弹簧的灰色线条,它们都同样向外推。一个糟糕的解决方案是将所有蓝线尽可能推向一侧。请注意,此描述中有一点余地,并且可能有多种解决方案 - 我所需要的只是让它们合理均匀,并且不要让一个值最大化压扁其他所有内容。
我尝试的目标函数只是最大化线条大小的总和:
maximize: (B - A) + (C - B) + (C - A) + (D - C) + (E - B) + (E - D) + (F - E) + (F - D) + (F - A)
Run Code Online (Sandbox Code Playgroud)
我很清楚这不是一个好的解决方案,因为这些项相互抵消,并且一条线上的增加只会在另一条线上减少相同的数量,因此目标永远不会偏向于在变量之间均匀分布最大化。
我还尝试将每条线与其中间可能范围的距离最小化。对于 line B - A,其范围内的中间值(1,3)是2。这是第一学期的目标:
minimize: |(B - A) - 2| + ...
Run Code Online (Sandbox Code Playgroud)
为了实现绝对值,我将术语替换为U并添加了额外的约束:
minimize: U + ...
with: U <= (B - A - 2)
U <= -(B …Run Code Online (Sandbox Code Playgroud) algorithm mathematical-optimization linear-programming or-tools
我正在做一些统计相关的优化。我正在尝试使用 scipy 的最小化。但是,它给我的解决方案并不可行。我的代码是
import numpy as np
from scipy.optimize import minimize, NonlinearConstraint
from math import e
def get_expectation(f,mu):
return f.dot(mu)
def get_neg_subgaus_coeff(f,mu):
return -(e**((f/10)**2)).dot(mu)
def grad_neg_subgaus_coeff(f,mu):
return -(2*e**((f/10)**2)*f)*mu
def my_mu(n):
return 1/(np.abs((np.arange(n)-n//2))+1)**2
def get_constraints(n):
constr_list = []
for i in range(n-1):
constr = lambda f: f[i]- f[i+1]
constr_list.append(NonlinearConstraint(constr,.1, .1))
return constr_list
def callback(x,_): # not important, only debug info
print(get_neg_subgaus_coeff(x, mu))
return False
def get_solution(mu,n):
constraints = get_constraints(n) + [NonlinearConstraint(lambda f: get_expectation(f,mu), 0, 0)]
return minimize(get_neg_subgaus_coeff, np.zeros(n)-1, args=(mu),jac=grad_neg_subgaus_coeff, method="trust-constr", bounds=[(-100, …Run Code Online (Sandbox Code Playgroud) 我使用 Google OR Tools in Python 编写了一个约束编程模型,它使用 CP 求解器。我需要多次运行该模型,并且在每次运行中我都会修改约束。目前,每次我想运行模型时,我都会从头开始创建模型对象。无论如何,我可以修改现有模型的变量/约束,这样我就不需要每次都从头开始构建模型吗?
为了提供更好的上下文,请考虑以下示例模型。
from ortools.sat.python import cp_model
model = cp_model.CpModel()
num_vals = 3
a = model.NewIntVar(0, num_vals -1, 'a')
b = model.NewIntVar(0, num_vals -1, 'b')
c = model.NewIntVar(0, num_vals -1, 'c')
model.Add(a == b)
solver = cp_model.CpSolver()
solver.Solve(model)
Run Code Online (Sandbox Code Playgroud)
现在,在问题的第二次运行中,我想做以下更改。
5a==ba==c在不从头开始构建模型的情况下如何实现这一目标?
python mathematical-optimization constraint-programming or-tools cp-sat
我想测试一个点是否在球体的特定距离内.
所以你有这些变量......
Point3F spherePnt;
F32 sphereRadius;
Point3F testPnt;
Run Code Online (Sandbox Code Playgroud)
我可以...
F32 dist = ( spherePnt - testPnt ).len() - sphereRadius;
Run Code Online (Sandbox Code Playgroud)
如果dist为正,则它在半径之外,如果dist为负,则它在半径内.
或者作为避免len()函数中的平方根的优化,您可以尝试这个...
F32 dist = ( spherePnt - testPnt ).lenSquared() - ( sphereRadius * sphereRadius );
Run Code Online (Sandbox Code Playgroud)
好吧,这看起来像乍看之下,但显然它实际上给了我不正确的结果.
例如,给定的变量就像这样设置......
SpherePnt( 0, 0, 0 )
SphereRadius( 1 )
testPnt( 1, 1, 1 )
Run Code Online (Sandbox Code Playgroud)
取结果......
F32 dist = ( spherePnt - testPnt ).len() - sphereRadius;
F32 dist2 = mSqrt( ( spherePnt - testPnt ).lenSquared() - ( sphereRadius * sphereRadius ) );
dist = 0.7320508075688772935274463415059; …Run Code Online (Sandbox Code Playgroud)