我需要用 JuMP 将两条曲线(都应该属于三次函数)拟合成一组点。
我已经完成了一条曲线的拟合,但我正在努力将 2 条曲线拟合到同一个数据集中。
我想,如果我可以将点分布到曲线上——所以如果每个点只能使用一次——我可以像下面那样做,但它没有用。(我知道我可以使用更复杂的东西,我想保持简单。)
这是我当前代码的一部分:
# cubicFunc is a two dimensional array which accepts cubicFunc[x,degree]
@variable(m, mult1[1:4]) // 0:3 because it's cubic
@variable(m, mult2[1:4]) // 0:3 because it's cubic
@variable(m, 0 <= includeIn1[1:numOfPoints] <= 1, Int)
@variable(m, 0 <= includeIn2[1:numOfPoints] <= 1, Int)
# some kind of hack to force one of them to 0 and other one to 1
@constraint(m, loop[i in 1:numOfPoints], includeIn1[i] + includeIn2[i] == 1)
@objective(m, Min, sum( (yPoints - cubicFunc*mult1).*includeIn1 .^2 ) …
Run Code Online (Sandbox Code Playgroud) regression mathematical-optimization curve-fitting julia julia-jump
我想知道是否有一种很好的方法(最好使用JuMP)来获得线性程序的所有最优解(如果有多个最优解).
一个例子
最小化两个概率分布之间的统计距离(Kolmogorov距离).
min sum_{i=1}^{4} |P[i] - Q[i]| over free variable Q
P = [0.25,0.25,0.25,0.25]
sum_i P[i] = 1
Q[1] + Q[4] = 1
sum_i Q[i] = 1 -> Q[2],Q[3] = 0
Run Code Online (Sandbox Code Playgroud)
注意我们可以将优化表示为线性程序,目标就变成了
min S >= sum_i S[i]
S[i] >= P[i]-Q[i]
S[i] >= Q[i]-P[i]
Run Code Online (Sandbox Code Playgroud)
这个问题没有唯一的解决方案,而是跨越最优解的子空间
Q1 = [0.75,0,0,0.25]
Q2 = [0.25,0,0,0.75]
Run Code Online (Sandbox Code Playgroud)
两者都具有0.5的最小距离,这两种解决方案的任何凸组合都是最佳的.
我想知道是否有一种很好的方法可以找到所有这些最佳极值点(跨越最佳子空间的点)?
为什么我对此感兴趣; 给出最大Bhattacharyya系数(凹函数)的点位于静态距离的最佳子空间的中间.
到目前为止,我试图找到最佳的P,Q对(参考我给出的例子),使算法有利于通过在该项中增加1.001的权重来缩小P [i],Q [i]之间的距离.和.它似乎在某种程度上起作用,尽管我几乎无法确定.
我正在尝试重写Julia中的Matlab fmincon优化函数.
这是Matlab代码:
function [x,fval] = example3()
x0 = [0; 0; 0; 0; 0; 0; 0; 0];
A = [];
b = [];
Ae = [1000 1000 1000 1000 -1000 -1000 -1000 -1000];
be = [100];
lb = [0; 0; 0; 0; 0; 0; 0; 0];
ub = [1; 1; 1; 1; 1; 1; 1; 1];
noncon = [];
options = optimset('fmincon');
options.Algorithm = 'interior-point';
[x,fval] = fmincon(@objfcn,x0,A,b,Ae,be,lb,ub,@noncon,options);
end
function f = objfcn(x)
% user inputs
Cr = [ 0.0064 …
Run Code Online (Sandbox Code Playgroud) 我有一个混合整数规划问题.我可以使用JuMP找到最佳解决方案.但我怎样才能找到第二个最佳解决方案?或者第三好等
这可能是另一个同样最优的解决方案,或者它可能是更糟糕的解决方案,或者可能是:Infeasible
- 可能没有大多数解决方案.
我知道对于类似TSP的问题,我可以通过逐步删除最佳路径上的链接来找到其他解决方案(即将某些城市之间的距离设置为无限).对于调度类型问题,我可以类似地逐步设置禁止在最佳路径中使用的时隙的可用性.
但有没有一种通用的方法来做到这一点,而没有编写自己的问题特定的方法来禁止这个解决方案?
mathematical-optimization julia coin-or-cbc julia-jump mixed-integer-programming
我使用GLPKMathProgInterface和JuMP编写了一个程序来解决Julia中的线性程序.Julia代码由python程序调用,该程序通过多个命令行调用运行Juila代码的多个实例.虽然我对实际求解器的性能非常满意,但初始化非常慢.我想知道是否有办法加快这个速度.
例如,如果我只是将以下内容保存到文件中
@time using DataFrames, CSV, GLPKMathProgInterface, JuMP, ArgParse
Run Code Online (Sandbox Code Playgroud)
并运行它
mylabtop:~ me$ julia test.jl
12.270137 seconds (6.54 M allocations: 364.537 MiB, 3.05% gc time)
Run Code Online (Sandbox Code Playgroud)
这看起来非常慢,是否有一些很好的方法来加速使用模块,比如我可以做一次的预编译步骤?
using JuMP, Cbc
model = Model(with_optimizer(Cbc.Optimizer, seconds= (20 * 60), ratioGap = 0.10));
@variable(model, x[1:5], Bin);
@constraint(model, c1[i in 1:4], x[i] == 0 )
@constraint(model, c2[i in 4:5], x[i] == 1 )
@objective(model, Min, sum(x[i] for i in 1:5))
JuMP.optimize!(model)
# Problem is infeasible - 0.00 seconds
Run Code Online (Sandbox Code Playgroud)
我如何获得约束 c1[4] 和 c2[4] 使问题不可行的信息?
c1[4] : x[4] = 0.0
c2[4] : x[4] = 1.0
如何处理JuMP中的稀疏矩阵?
例如,假设我想施加以下形式的约束:
A * x == 0
Run Code Online (Sandbox Code Playgroud)
其中A
是稀疏矩阵和x
变量向量。我认为A
可以利用 的稀疏性来加快优化速度。我如何在 JuMP 中利用这一点?
我有一个非常难以构建的优化模型。这个模型有很多 if-else 条件和很多循环。所以我在考虑使用多线程来构建这个单一的 JuMP 模型对象。
一个循环代码的非常简化的版本如下所示:
Threads.@threads for g in sets["A"]
Array_1 = [gg for gg in [sets["B"];sets["A"]] if data2[gg] == g]
Array_2 = [gg for gg in sets["B"] if data[gg] == g]
for t in STAGES
Array_3 = [gg for gg in [sets["B"];sets["A"]] if data2[gg] == g && (gg, t) in sets["C"] ]
for b in BLOCKS
name = @constraint( model, ((g, t, b) in sets["C"] ? X1[(g,t,b)] : 0)
- sum(X1[(gg,t,b)] for gg in Array_3 )
+ X2[(g,t,b)] …
Run Code Online (Sandbox Code Playgroud) 是否可以在 JuMP for Julia 中将向量化变量与用户定义的目标函数一起使用?就像这样,
model = Model(GLPK.Optimizer)
A = [
1 1 9 5
3 5 0 8
2 0 6 13
]
b = [7; 3; 5]
c = [1; 3; 5; 2]
@variable(model, x[1:4] >= 0)
@constraint(model, A * x .== b)
# dummy functions, could be nonlinear hypothetically
identity(x) = x
C(x, c) = c' * x
register(model, :identity, 1, identity; autodiff = true)
register(model, :C, 2, C; autodiff = true)
@NLobjective(model, Min, C(identity(x), c))
Run Code Online (Sandbox Code Playgroud)
这会引发错误, …
我希望拥有所有可行(次优)向量,而不仅仅是 mip 的最佳解决方案向量。
\n我在这里发现了一些老问题,但我不确定它们是如何工作的。
首先,是否有任何新的库工具/方法可以自动执行此操作?
\n我尝试了这个,但是什么也没做:
if termination_status(m) == MOI.FEASIBLE_POINT\n println(x)\nend\noptimize!(m);\n
Run Code Online (Sandbox Code Playgroud)\n如果没有,最简单的方法是什么?
\n我想到扫描最优解,直到找到第一个非零决策变量,然后将该变量约束为零并再次求解模型。
for i in 1:active_variables\n if value.(z[i])==1\n @constraint(m, x[i] == 0)\n break\n end\nend\n\noptimize!(m);\n
Run Code Online (Sandbox Code Playgroud)\n但我用这个方法看到了这个问题**:
\nx[i]==1