如何提高一个变量的幂?
回答
我要解一个非线性问题,只有一个约束条件。目标函数是10*x1^4+8*x2^5+12*x3^3+16*x4^6约束条件是x1+x2+x3+x4<=100为了解决这个问题,我引入了8个辅助变量。4个变量等价于主要变量作为约束。其他4个用于提高前4个约束的幂。但我并没有得到实际的结果。请帮帮我。
0
-
你能不能分享一个最小可重复的例子,你对目标函数建模,但没有得到正确的解?
最好的问候,
Jaromił0 -
嗨JaromiłNajman,我提到了一个目标和一个限制。我现在正在分享代码
m = gp.Model(“Matelco”)
x1 = m.addVar (vtype =伽马线暴。连续,name ='x1')
x2 = m.addVar (vtype =伽马线暴。连续,name ='x2')
x3 = m.addVar (vtype =伽马线暴。连续,name ='x3')
x4 = m.addVar (vtype =伽马线暴。连续,name ='x4')
一个= m。addVar (vtype =伽马线暴。连续的,name = ' a ')
b = m。addVar (vtype =伽马线暴。连续的,name = ' b ')
c = m。addVar (vtype =伽马线暴。连续的,name = ' c ')
d = m。addVar (vtype =伽马线暴。连续的,name = ' d ')
m.addConstr(a==x1, name =='c1')
m.addConstr(b==x2, name =='c2')
m.addConstr(c==x3, name =='c3')
m.addConstr(d==x4, name =='c4')
m.addGenConstrPow(x1, a, 4)
m.addGenConstrPow(x2, b, 5)
m.addGenConstrPow(x3, c, 3)
m.addGenConstrPow(x4, d, 6)
m.addConstr(x1+x2+x3+x4<=100, name = 'c1')
m.setObjective (a + b + c + d, GRB.MAXIMIZE)
m.update ()
m.optimize ()
m.printAttr(“X”)我得到了不同的结果。实际结果如下:
x1 = 0
x2 = 0
x3 = 0
x4 = 100但现在我变了。
非常感谢您的指正。
谢谢你!
问候,
0 -
嗨Biswajit,
你可以使用写方法来生成LP文件,并详细分析您的模型。在LP文件中,您可以看到您实际建模的是
\[开始\{对齐}
a + b + c +d\\
x_1 & = \ \
x_2 & = b \ \
x_3 & = c \ \
x_4 & = d \ \
A &= x_1^4\\
B &= x_2^5\\ \
C &= x_3^3\\
D &= x_4^6\\
100 &\geq x_1 + x_2 + x_3 + x_4
X_i &\geq 0, a,b,c,d \geq 0
结束\{对齐}\]这里你可以看到等式约束
\[开始\{对齐}
x_1 & = \ \
x_2 & = b \ \
x_3 & = c \ \
x_4 & = d \ \
结束\{对齐}\]是错误的,因为它们不属于你试图建模的模型。此外,目标函数中的系数也缺失了。
导入gurobipy为gp
从gurobipy进口GRB
m = gp.Model(“Matelco”)
m.setParam(“FuncMaxVal 1 e12汽油)
x1 = m.addVar (vtype =伽马线暴。连续,name ='x1')
x2 = m.addVar (vtype =伽马线暴。连续,name ='x2')
x3 = m.addVar (vtype =伽马线暴。连续,name ='x3')
x4 = m.addVar (vtype =伽马线暴。连续,name ='x4')
= m.addVar (vtype =伽马射线爆发。连续的,name = ' a ')
b = m.addVar (vtype =伽马线暴。连续的,name = ' b ')
c = m.addVar (vtype =伽马线暴。连续的,name = ' c ')
d = m.addVar (vtype =伽马线暴。连续的,name = ' d ')
m.addGenConstrPow(x1, a, 4)
m.addGenConstrPow(x2, b, 5)
m.addGenConstrPow(x3, c, 3)
m.addGenConstrPow(x4, d, 6)
m.addConstr(x1+x2+x3+x4<=100, name = 'c5')
m. seobjective (10*a + 8*b + 12*c + 16*d, GRB.MAXIMIZE)
m.update ()
m.optimize ()
m.write(“myLP.lp”)
m.printAttr(“X”)注意,您必须设置该参数FuncMaxVal到一般约束条件可以达到的最大值,在您的情况下等于\(100^6 = 10^12\)。
不建议使用如此大的值,因为它可能会导致数值困难。您应该尝试重新制定或重新缩放您的模型。详情请参阅数值问题指南欲知详情。你能不能,使用更小的幂值,例如,通过找到一个与你目前使用的具有相同性质的低次多项式?
最好的问候,
Jaromił0 -
嗨JaromiłNajman,我非常感谢你所提供的澄清。恐怕这个问题是作业题,不能改。但我还是要谢谢你的澄清。我会尝试解决较小的问题。
0
请登录留下评论。
评论
4评论