跳到主要内容

如何提高一个变量的幂?

回答

评论

4评论

  • JaromiłNajman
    Gurobi员工Gurobi员工

    你能不能分享一个最小可重复的例子,你对目标函数建模,但没有得到正确的解?

    最好的问候,
    Jaromił

    0
  • BISWAJIT凹地
    Gurobi-versary
    健谈的人
    调查员

    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
  • JaromiłNajman
    Gurobi员工Gurobi员工

    嗨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
  • BISWAJIT凹地
    Gurobi-versary
    健谈的人
    调查员

    JaromiłNajman,我非常感谢你所提供的澄清。恐怕这个问题是作业题,不能改。但我还是要谢谢你的澄清。我会尝试解决较小的问题。

    0

登录留下评论。