我有一个方程组可以解决,就像这样:
方程式的左侧是和,而右侧是约束。我有一个包含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。