Python 如何使用纸浆找到次优(次优)解决方案?
我用纸浆创建了一个目标和约束,它给出了最优的解决方案(最大化),这太棒了 然而,了解下几个并非绝对最佳的解决方案对我来说是很有用的。基本上,我想做以下几点Python 如何使用纸浆找到次优(次优)解决方案?,python,linear-programming,pulp,Python,Linear Programming,Pulp,我用纸浆创建了一个目标和约束,它给出了最优的解决方案(最大化),这太棒了 然而,了解下几个并非绝对最佳的解决方案对我来说是很有用的。基本上,我想做以下几点 求解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…谢谢你的帮助。我找到了一种获得目标相同的解决方案的方法。(我迭代了属于该解决方案的每个组,并创建了一个约束条件,将它们排除在下一个解决方案之外,从而揭示了具有相同目标的其他解决方案。)