pyscipopt,方程组的非线性系统,代码有效,但速度慢无法缩放

时间:2019-03-30 20:13:40

标签: python-3.x linear-algebra scip

我有一个方程组可以解决,就像这样:

https://imgur.com/oxVdM10

方程式的左侧是和,而右侧是约束。我有一个包含N个变量的N个非线性方程组。

我尝试用scipy fsolve解决它,但是它不会收敛,sympy也有一个求解器,也不会收敛。我遇到了pyscipopt,它似乎可以工作,但是行为却不一致并且崩溃了。


import numpy as np   
import networkx as nx
''' set up the problem with n nodes, and the constraint array c with the degree sequence'''

''' example : power law degree distribution''' 
n=8
c = np.round(nx.utils.random_sequence.powerlaw_sequence(n))


''' other examples '''
#n=8
#c=[1, 2, 2, 1, 2, 1, 1, 2]
#n=3
#c=[2,1,1]

from pyscipopt import Model, quicksum

m = Model()
''' tolerance for convergence'''
tol = 1e-6

print('create the lagrange multipliers')
X = dict(zip(range(n), [m.addVar(vtype="C", lb=0) for i in range(n)]))
#X = dict(zip(range(n), [m.addVar(vtype="C") for i in range(n)]))

'''  create the variable for the objective function because it's nonlinear
and must be linearized'''
Y = m.addVar(vtype='C')

print('set up the constraints')

''' the equations are essentially sum_i - degree_i <= tolerance'''

'''  set up the constraints as sums of the lagrange multipliers as written in the papers'''
system =[]
for i in range(n):
    idx = np.arange(n)
    idx = idx[idx!=i]
    k= quicksum(X[i]*X[j]/(1+X[i]*X[j]) for j in idx) -c[i]
    ''' the equations are essentially sum_i - degree_i <= tolerance'''
    m.addCons(k<=tol)
    system.append(k)

m.addCons( Y <= quicksum(system[j] for j in range(n)) )
m.setObjective(Y, 'minimize')
print('all constraints added, now optimization')
m.optimize()

所以我有一个系统数组,其中存储了所有要优化的约束,k个值是约束,我对整个数据集执行了两次循环。

1)是否有更好或更快速的方法来实现这一目标?我猜想对于大N来说效率不高。

一个运行迅速的示例:

n = 8 c = [1、2、2、1、1、2、1、1、2]

但是其他示例,尤其是当我增加N(在代码中使用很少的n)后,就陷入了困境。

edit:关于示例,我不得不说任何示例都可以工作。设计示例的硬约束就是k_i <= N。

0 个答案:

没有答案