python - 选择总和以满足生产输出的最小机器数量 - 简化代码?
问题描述
我正在尝试确定可以满足一定产量的“机器”的最小数量。根据“经验法则”,大型机器比小型机器更经济。我相信这可以表述为优化问题或使用我不知道的某种算法来解决。如果有,我将不胜感激指针(实现哪种算法)。如果没有,我想知道是否有更简单、更优雅的方法来解决问题。我在想可能有一个使用数学集、数线对象等的选项。
lower = (lower[i],upper[i]) 定义机器 i 的生产输出范围。索引 i 在此问题之外的 OrderedDict 中定义机器。即最后一个索引对应于字典中的最后一项。此函数将返回一个机器列表,然后我可以使用 OrderedDict (其中包含机器上的其他信息)来实现这些机器。
排除错误检查以简化代码。
lower = [0, 5, 10]
upper = [3, 9, 15]
他们需要的一些用户定义的生产价值
prod_value = 4
假设所有生产输出都是整数并且允许不连续性(4 不在任何机器范围内)
def get_machines(prod_value, lower, upper):
prod_value = prod_value
lower = lower
upper = upper
def in_range(prod_value, lower, upper):
# Function that returns (machine index, machine output) if it is not greater than max
for i in range(len(lower)):
# within range
if prod_value >= lower[i] and prod_value <= upper[i]:
return (i,prod_value)
# This catches all machines smaller than min or discontinuities
elif prod_value <= lower[i]:
return (i, lower[i])
else:
continue
machine_list = []
if prod_value > upper[-1]:
while prod_value:
if prod_value - upper[-1] > 0:
prod_value -= upper[-1]
machine_list.append((-1,upper[-1]))
else:
machine_list.append(in_range(prod_value,lower,upper))
prod_value = 0
return machine_list
else:
machine_list.append(in_range(prod_value,lower,upper))
return machine_list
解决方案
这是一个解决方案
import collections
Solution = collections.namedtuple(
'Solution', 'machine_type production machines previous overproduction')
def optimal_machines (target, lower, upper):
best = [None for i in range(target+1)]
best[0] = Solution(
machine_type=None, production=None, machines=0,
previous=None, overproduction=0)
for i in range(target):
if best[i] is not None:
soln = best[i]
for j in range(len(lower)):
for production in range(upper[j]+1):
k = i+production
if target < k:
break
overproduction = soln.overproduction
if production < lower[j]:
overproduction += lower[j] - production
production = lower[j]
if best[k] is None or (soln.machines+1, overproduction) < (best[k].machines, best[k].overproduction):
best[k] = Solution(
machine_type=j, production=production,
machines=best[i].machines+1, previous=best[i],
overproduction=overproduction)
# We now have the answer as a linked list. Convert that to the desired format.
answer = []
solution = best[target]
if solution is None:
return None
else:
while solution.machine_type is not None:
answer.append([solution.machine_type, solution.production])
solution = solution.previous
return answer
这与您现有 target
的0
or解决方案不同16+
。我相信在这两种情况下我的解决方案都更好。
推荐阅读
- javascript - 如何有效地通过 React 中父级的引用访问子级?
- mongoose - 按日期对所有子文档进行分组并获取每个日期的最后数据
- swift - how do I actually display a variable in SwiftUI to the end user
- javascript - 在 setTimeout() 中调用对象方法
- google-cloud-platform - GCP“管理元数据中的 SSH 密钥”如何在幕后工作
- javascript - React Native:onPress 不适用于身份验证
- python - 如果在 csv 文件中找到字符串,如何通过 python 发送电子邮件警报?
- google-maps - 折线和叠加轴承特征一起使用
- docker - 不要使用 docker-compose 在 selenoid 中启动所有浏览器
- python-3.x - 有没有办法让这段代码更好?数据科学,数据可视化(python)