Python 如何使用纸浆找到次优(次优)解决方案?

Python 如何使用纸浆找到次优(次优)解决方案?,python,linear-programming,pulp,Python,Linear Programming,Pulp,我用纸浆创建了一个目标和约束,它给出了最优的解决方案(最大化),这太棒了 然而,了解下几个并非绝对最佳的解决方案对我来说是很有用的。基本上,我想做以下几点 求解LP并获得最大目标值(我这样做了) 使用此最大值作为约束,以限制未来解决方案中的目标值 重复该过程数次,每次降低最大目标值 解算之后,我尝试添加一个约束,该约束使用不等式中的目标方程(限制目标的最大值),但我得到了以下错误: 用户警告:覆盖以前设置的目标 此外,新解决方案的目标是“无”。我已经读到,当您意外地创建了一个没有不等式的约束时,

我用纸浆创建了一个目标和约束,它给出了最优的解决方案(最大化),这太棒了

然而,了解下几个并非绝对最佳的解决方案对我来说是很有用的。基本上,我想做以下几点

  • 求解LP并获得最大目标值(我这样做了)
  • 使用此最大值作为约束,以限制未来解决方案中的目标值
  • 重复该过程数次,每次降低最大目标值
  • 解算之后,我尝试添加一个约束,该约束使用不等式中的目标方程(限制目标的最大值),但我得到了以下错误:

    用户警告:覆盖以前设置的目标

    此外,新解决方案的目标是“无”。我已经读到,当您意外地创建了一个没有不等式的约束时,经常会出现这个错误。我的约束肯定有一个不等式

    有没有更好的方法,我不知道

    new_model = pulp.LpProblem("NBA stats optimizer", LpMaximize)
    
    # create binary lpVariables for every pairing
    pfs = [LpVariable("pf{}".format(i+1), cat="Binary") for i in range(len(pf_pairs))]
    sfs = [LpVariable("sf{}".format(i+1), cat="Binary") for i in range(len(sf_pairs))]
    pgs = [LpVariable("pg{}".format(i+1), cat="Binary") for i in range(len(pg_pairs))]
    sgs = [LpVariable("sg{}".format(i+1), cat="Binary") for i in range(len(sg_pairs))]
    cs = [LpVariable("c{}".format(i+1), cat="Binary") for i in range(len(c_singles))]
    
    # add objective
    new_model += sum(x1 * pts1 for x1,pts1 in zip(pfs, [row[0] for row in pf_pairs])) \
                 + sum(x2 * pts2 for x2,pts2 in zip(sfs, [row[0] for row in sf_pairs])) \
                 + sum(x3 * pts3 for x3,pts3 in zip(pgs, [row[0] for row in pg_pairs])) \
                 + sum(x4 * pts4 for x4,pts4 in zip(sgs, [row[0] for row in sg_pairs])) \
                 + sum(x5 * pts5 for x5,pts5 in zip(cs, [row[0] for row in c_singles]))
    
    # create a constraint that each set of pairings has only 1 group at a time
    new_model += lpSum([pfs[i] for i in range(len(pf_pairs))]) == 1, "pfLimit"
    new_model += lpSum([sfs[i] for i in range(len(sf_pairs))]) == 1, "sfLimit"
    new_model += lpSum([pgs[i] for i in range(len(pg_pairs))]) == 1, "pgLimit"
    new_model += lpSum([sgs[i] for i in range(len(sg_pairs))]) == 1, "sgLimit"
    new_model += lpSum([cs[i] for i in range(len(c_singles))]) == 1, "cLimit"
    
    status = new_model.solve()
    
    new_model += (sum(x1 * pts1 for x1,pts1 in zip(pfs, [row[0] for row in pf_pairs])) \
                  + sum(x2 * pts2 for x2,pts2 in zip(sfs, [row[0] for row in sf_pairs])) \
                  + sum(x3 * pts3 for x3,pts3 in zip(pgs, [row[0] for row in pg_pairs])) \
                  + sum(x4 * pts4 for x4,pts4 in zip(sgs, [row[0] for row in sg_pairs])) \
                  + sum(x5 * pts5 for x5,pts5 in zip(cs, [row[0] for row in c_singles]))) \
                  < float(value(new_model.objective))
    
    status = new_model.solve()
    
    new_model=plup.LpProblem(“NBA统计优化器”,lpmax)
    #为每个配对创建二进制变量
    pfs=[LpVariable(“pf{}”.format(i+1),cat=“Binary”)表示范围内的i(len(pf_对))]
    sfs=[LpVariable(“sf{}”.format(i+1),cat=“Binary”)表示范围内的i(len(sf_对))]
    pgs=[LpVariable(“pg{}”.format(i+1),cat=“Binary”)表示范围内的i(len(pg_对))]
    sgs=[LpVariable(“sg{}”.format(i+1),cat=“Binary”)表示范围内的i(len(sg_对))]
    cs=[LpVariable(“c{}”.format(i+1),cat=“Binary”)表示范围内的i(len(c_singles))]
    #添加目标
    新的_模型+=总和(x1*pts1表示x1,pts1表示zip(pfs,[0]行表示pf_对中的行])\
    +总和(x2*pts2表示x2,pts2表示zip(sfs,[0]行表示sf_对中的行])\
    +总和(x3*pts3表示x3,pts3表示zip(pgs,[0]行表示pg_对中的行])\
    +总和(x4*pts4表示x4,pts4表示zip(sgs,[0]行表示sg_对中的行])\
    +总和(x5*pts5代表x5,pts5代表zip(cs,[0]行代表c_单曲中的行])
    #创建一个约束,使每组配对一次只有一个组
    新的_模型+=lpSum([pfs[i]用于范围内的i(len(pf_对)))==1,“pfLimit”
    新的_模型+=lpSum([sfs[i]用于范围内的i(len(sf_对)))==1,“sfLimit”
    新的_模型+=lpSum([pgs[i]表示范围内的i(len(pg_对)))==1,“pgLimit”
    新的_模型+=lpSum([sgs[i]表示范围内的i(len(sg_对)))==1,“sgLimit”
    新的_模型+=lpSum([cs[i]表示范围内的i(len(c_singles)))==1,“cLimit”
    状态=新模型。求解()
    新的_模型+=(和(x1*pts1表示x1,pts1表示zip(pfs,[0]行表示pf_对中的行]))\
    +总和(x2*pts2表示x2,pts2表示zip(sfs,[0]行表示sf_对中的行])\
    +总和(x3*pts3表示x3,pts3表示zip(pgs,[0]行表示pg_对中的行])\
    +总和(x4*pts4表示x4,pts4表示zip(sgs,[0]行表示sg_对中的行])\
    +总和(x5*pts5代表x5,pts5代表zip(cs,[0]行代表c_单曲中的行]))\
    
    我收到警告的原因是因为我的新约束是一个没有等号的不等式


    我不得不改变“警告不是错误。但是在你的情况下,这个警告意味着你没有做你想做的事情(你不想触及目标).为什么?没有看到任何代码就不清楚了。该方法实际上也可能不会达到您想要的效果。那么具有相同目标的解决方案呢?在降低obj约束时,您不能保证找到这些解决方案,而在不降低约束的情况下,您也不能保证找到其他解决方案(可能每次都会遇到相同的解决方案).@sascha…谢谢你的帮助。我找到了一种获得目标相同的解决方案的方法。(我迭代了属于该解决方案的每个组,并创建了一个约束条件,将它们排除在下一个解决方案之外,从而揭示了具有相同目标的其他解决方案。)