python 求矩阵最小值
考虑以下问题:
由于疏忽,您的房屋急需维修。 当然,您外出并获得有关重塑和修复需要执行的操作的报价。 假设您收到的四个引号如下所示:
考虑到所有因素,这似乎很合理。 我们自然可以选择Susan,因为她为我们提供了最佳的整体价格。 但是,另一种解决方案可能是将我们需要完成的工作分解为单个项目。 然后,我们可以从承包商处获得每个维修项目的价格。 这将通过两种方式更加有益:
- 我们可以节省时间,因为所有承包商都可以同时处理每个维修项目,并且可以更快地完成整个项目。
- 通过根据承包商的最低物料成本来雇用承包商,我们也可能会获得更好的价格。
看看下面的图表,这些单独的价格可能是什么样的:
在执行此操作时,我们需要牢记两件事:
- 我们可能只想雇用一名承包商从事一项工作,以最大程度地节省时间。
- 这意味着我们不能两次使用同一承包商,并且自然地,我们在任何时候都不会有两个承包商从事同一工作。
例如,我们可以选择以下内容:
通过采用这种策略,我们可以将工作分散到4个承包商中,从而最大程度地减少时间,但也可以通过每个维修项目雇用承包商来最大程度地降低成本。 尽管这看起来很简单,但是如果我们有更多的承包商可供选择,或者要考虑更多的维修工作,则可能很难计算。 幸运的是,有一个很好的公式可以解决此类问题。 我将使用一种称为“匈牙利方法”的方法。 匈牙利方法是一种组合优化算法,可以解决多项式时间内的赋值问题,并且可以预期以后的原始对偶方法。 它是由哈罗德·库恩(Harold Kuhn)于1955年开发和发布的,他将其命名为“匈牙利方法”,因为该算法主要基于两位匈牙利数学家:DénesKőnig和JenőEgerváry的早期著作。 在使用伪代码解决了这个问题之后,我将介绍如何使用Python创建使用相同方法来解决该问题的函数。 使用Python的好处是,无论网格大小如何,我们都可以创建一个动态函数来求解方程。 如果像上面的示例中那样,我们决定增加更多的维修或获得更多的承包商报价,这可能会特别方便。 希望随着我们的研究,该策略的其他应用将变得显而易见。
匈牙利方法基本上包括三个步骤:
1.在每一列中找到最小值。
- 将每列中的最小值转换为零。
- 从同一列中的其他值减去每列中的最小值。
2.在每一行中找到最小值。
- 如果该行中的最小值还不是零,则将其转换为零。
- 再次从每行的剩余值中减去每行的最小值。
3.选择仅为零的行/列(如上例所示)。
这是此方法背后的原因:在每一列中,我们都有自己的工作。 每列中的最小值代表无论如何我们必须支付的最低价格。 因此,通过将该值设置为零,我们可以从其他列值中减去该值。 这些行代表我们必须向承包商支付的价格。 最小行值表示我们必须向每个承包商支付的最低价格,并且类似地,将其设置为零可以使我们从行中的其他值中减去该价格。 让我们看一下如何将此方法应用于当前问题:
步骤1:将最低的列值设置为0。
在这里,我们可以看到每一列都有一个零。 但是,只有行1、3和4具有零,而行4具有2个零。 现在,我们将从剩余的列值中减去已转换为零的最低值。 在这里,我更新了第1列,从其余的列值中减去了最小值70,剩下15、30和80:
步骤1:从其他列值中减去最低列值。
现在,我们将浏览其余的列并进行更新: