回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>以下代码包括一些类和函数,用于生成可行的组合,作为解决下料优化问题的第一步。你知道吗</p>
<pre><code>from collections import namedtuple, Counter
from itertools import combinations_with_replacement
roll_extra_width = 2
max_roll_count = 5
# and other parameters
class Roll(namedtuple('Roll', ['grade', 'thickness', 'width', 'length'])):
def __repr__(self):
return f'{self.grade}x{self.thickness}x{self.width:}x{self.length}'
class RollSet(Counter):
def __repr__(self):
return '\n' + '\n'.join(f'{key}: {qty}' for key, qty in self.items())
def roll_count(self):
return sum(self.values())
def width(self):
return sum(roll.width + roll_extra_width for roll in self.elements())
def get_viable_sets(rolls: list, min_width: int, max_width: int):
roll_sets = (RollSet(combination) for combination in combinations_with_replacement(rolls, max_roll_count))
viable_sets = [rset for rset in roll_sets if min_width < rset.width() < max_width]
return viable_sets
def other_funcs(*args):
# uses Roll and RollSet a lot
pass
if __name__ == '__main__':
rolls = [('N', 20, 300, 6000),
('N', 20, 350, 6000),
('N', 20, 400, 6000),
('N', 20, 500, 6000)]
rolls = [Roll(*x) for x in rolls]
min_width = 1000
max_width = 2000
viable = get_viable_sets(rolls, min_width, max_width)
for rset in viable:
print(rset)
# More code using the defined classes
</code></pre>
<p>代码使用全局变量来保存一些参数值。<br/>
我知道这是一种非常糟糕的做法,可能会导致许多问题,但它具有以下可取的特性:<br/>
它将定义的类和函数的参数数量保持在最小,并使代码更易于阅读和理解。你知道吗</p>
<p>我尝试过使用容器类,但最终不得不将它的实例作为参数传递给其他每个函数/类,比如<code>RollSet(rolls, param.roll_extra_width)</code>,而不仅仅是<code>RollSet(rolls)</code>。这似乎是不必要的冗余,因为初始化后参数将始终保持不变。你知道吗</p>
<p>有人能不能建议一种更好的方法来保存参数值,而不让代码被冗长的参数列表和重复的参数弄得乱七八糟?你知道吗</p>