我的代码处理小变量。但是当我在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)
答案 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
用于模型表达式。 numpy
和np.abs
之类的函数无法为求解器提供所需的信息。您应该使用np.sum
(或m.abs2
)和m.abs3
。m.sum
和a
数组可以是一堆常量数组,而不是Gekko参数。d
的标量结果。您可以使用a [i] x [i,j] d [j]中的多个a.T x[:,:] d
函数,而不是矩阵乘法产生的一个大表达式。m.Obj