【问题标题】:finding which constraints are not true when pulp optimization does not solve in time limit当纸浆优化没有在时间限制内解决时,找出哪些约束不正确
【发布时间】:2021-09-01 19:43:24
【问题描述】:

我有一个非常大的优化,它不能解决大型数据集。我想看看约束条件,看看哪些是持有的,哪些不是。这个可以吗?

【问题讨论】:

    标签: optimization constraints pulp


    【解决方案1】:

    我不知道LpConstraint 类的方法,它允许您轻松检查现有“解决方案”是否已满足它(不是真正的解决方案,因为不满足所有约束)。 link to LpConstraint docs

    不久前有人问过similar question,它没有答案,所以我怀疑这个功能不存在。可能值得在 pulp GitHub page 上提交功能请求。

    与此同时,您可能可以按照以下方式组合一些可能有效的东西(其中prob 是您的 Pulp 问题对象):

    soln_dict = {i.name: i.varValue for i in prob.variables()}
    
    for c in prob.constraints.values():
        c_dict = c.toDict()
        # print(c_dict)
        satisfied = False
        
        LHS = sum([soln_dict[i['name']]*i['value'] for i in c_dict['coefficients']])
        LHS = LHS + c_dict['constant']
        
        if c_dict['sense'] == 0:
            satisfied = (LHS == 0)
       
        if c_dict['sense'] == -1:
            satisfied = (LHS <= 0)
        
        if c_dict['sense'] == 1:
            satisfied = (LHS >= 0)
       
        print(c)
        
        if satisfied:
            #print('LHS: ', LHS)
            print('is satisfied')
        else:
            #print('LHS: ', LHS)
            print('not satisfied')
    

    【讨论】:

      【解决方案2】:

      查看代码看起来约束具有文档中没有的有效函数

      def valid(self, eps=0):
              val = self.value()
              if self.sense == const.LpConstraintEQ:
                  return abs(val) <= eps
              else:
                  return val * self.sense >= -eps
      

      【讨论】:

      • 不错的发现!要注意的另一件事是,如果您有很多整数变量,那么当您用完时间时可能会不满意的是整数变量采用整数值(以及变量的上限/下限)的要求。
      猜你喜欢
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      相关资源
      最近更新 更多