如何修复Python Gekko Max Equation Length错误

时间:2019-11-14 09:59:17

标签: python gekko

我的代码处理小变量。但是当我在128 * 128变量数组中进行操作时,出现以下错误:

  

APM模型错误:字符串> 15000个字符考虑中断   上升到多个方程中这也可能是由于   使用换行符CR代替CR LF(对于Windows)或LF   (对于MacOS / Linux)要解决此问题,请使用   合适的换行符

我不知道如何解决此错误。

假设是gekko不能运行像这样的大数组变量。

我将代码放在下面。

from gekko import GEKKO
import numpy as np

m = GEKKO()
m.options.SOLVER=1
# optional solver settings with APOPT
m.solver_options = ['minlp_maximum_iterations max', \
                    # minlp iterations with integer solution
                    'minlp_max_iter_with_int_sol max', \
                    # treat minlp as nlp
                    'minlp_as_nlp min', \
                    # nlp sub-problem max iterations
                    'nlp_maximum_iterations 5000', \
                    # 1 = depth first, 2 = breadth first
                    'minlp_branch_method 1', \
                    # maximum deviation from whole number
                    'minlp_integer_tol 0.0005', \
                    # covergence tolerance
                    'minlp_gap_tol 0.0001' ,\
                    'max_cpu_time 10min']

n = 128 
p = 8 
q = 16 


x = m.Array(m.Var,(n,n),integer=True)

for i in range(n):
    for j in range(n):
        x[i,j].value = 1
        x[i,j].lower = 0
        x[i,j].upper = 1


s = 60

a = m.Array(m.Param,(x.shape[0],))
a_ = [172,282,10, 264, 287, 442, 393, 428, 484, 444, 344, 250, 293,  34, 473, 110, 338,  62,
 250, 205,  81, 336, 249, 199, 328, 447, 408,  82, 357, 334, 181, 133, 378,  79, 292, 103,
 494, 382,  10, 477, 237, 267, 337, 313, 395, 110, 114, 381,  52, 232, 457,  69, 167, 344,
 363, 284, 136 ,240, 258, 449, 119, 317, 370, 404, 197, 102, 428, 238, 321, 103, 282,  37,
  41,  86, 496  ,31, 148, 245,  78, 219,  37, 115, 378, 129,  37, 448, 415, 368, 238, 406,
 408, 100, 112 ,289 ,205, 329, 338, 396, 494, 145, 355,  45,   5, 220, 411, 167,  85, 369,
 426, 442, 406 ,217,  57, 176,  12, 368, 444, 227, 337,  63, 267, 216, 227, 182, 408, 116,
 385, 140]
for i in range(len(a)):
    a[i] = a_[i]


O1 = np.array(range(n))
O_= np.transpose(np.nonzero(O1+1))

O = np.zeros((x.shape[0],x.shape[1]),dtype=int)
for i in range(n):
    for j in range(n):
        O[i,O_[i]] = 1


d = m.Array(m.Param,(p,q))
for i in range(p):
    for j in range(q):
        d[i,j] = (round(p/2)-int(i/2))*4-(j%4)

#condition
m.Equation(m.sum(abs(x[:,:]-O[:,:]))<=2*s)

for i in range(n):
    m.Equation(m.sum(x[:,i])==1)

for i in range(n):
    m.Equation(m.sum(x[i,:])==1)

#Objective
m.Obj(np.sum(a.T*np.sum(x*d.reshape(1,n),axis=1)))

#Set global options
m.options.IMODE = 3

#Solve simulation
m.solve(disp=False,debug=True)

1 个答案:

答案 0 :(得分:4)

下面是一个应该工作的版本,如果您让它解决足够长的时间,尽管不可能解决,因为您有128 * 128 = 16384个二进制变量。如果有2 ^ 16384个解决方案,并且整数变量的数量大于几百个,则混合整数非线性规划求解器(如APOPT)不太可能很快找到解决方案。它可以求解具有数千个变量的连续变量,但是混合整数比较困难,因为它必须使用分支定界方法进行求解。如果可以使问题线性化(用# Tests that simply require an instance of ClassA class TestA(unittest.TestCase): def setUp(self): self.a = ClassA() def firstTest(self): # Test method and assign instance variables to self.a # Tests that require a particular configuration of an instance of ClassA class TestB(unites.TestCase): def setUp(self): self.a = ClassA() self.a.x = 6 # For example def secondTest(self): # Test something that requires self.a.x be set to 6 first 函数代替松弛变量),则可能需要尝试使用CPLEX或Gurobi之类的MILP解算器。

以下是有关您的模型的一些建议:

  • 请勿将abs用于模型表达式。 numpynp.abs之类的函数无法为求解器提供所需的信息。您应该使用np.sum(或m.abs2)和m.abs3
  • m.suma数组可以是一堆常量数组,而不是Gekko参数。
  • 您可以将至少一个表达式分解为Intermediates,以帮助解决问题。
  • 目标函数是d的标量结果。您可以使用a [i] x [i,j] d [j]中的多个a.T x[:,:] d函数,而不是矩阵乘法产生的一个大表达式。
  • 我建议您从较小的问题开始,然后随着对模型和解决方案的信心增强,扩大到较大的问题。
m.Obj