当前位置: 首页 > 面试题库 >

使用可变的bin成本和大小进行bin打包Python查询

孙阳舒
2023-03-14
问题内容

我目前正在处理一个需要更改装箱问题的问题。我的问题不同,因为垃圾箱的数量是有限的。我有三个垃圾箱,最小的一个垃圾箱放入物体的成本最低,中型垃圾箱比小垃圾箱稍贵,而第三个垃圾箱理论上来说容量不受限制,但放入物品的成本高得多。

我能够在线找到一个Python脚本,以类似的方式解决bin问题。我的问题是如何重写脚本以更接近最初的问题?有问题的脚本使用相同的垃圾箱。

我在最底部添加了一些行,以讨论我希望该垃圾箱看起来如何。此外,是否有办法为每个bin设置单独的约束?感谢您的所有帮助!

from openopt import *

N = 30  #Length of loan dataset

items = []
for i in range(N):
    small_vm = {
        'name': 'small%d' % i,
        'cpu': 2,
        'mem': 2048,
        'disk': 20,
        'n': 1
        }
    med_vm = {
        'name': 'medium%d' % i,
        'cpu': 4,
        'mem': 4096,
        'disk': 40,
        'n': 1
        }
    large_vm = {
        'name': 'large%d' % i,
        'cpu': 8,
        'mem': 8192,
        'disk': 80,
        'n': 1
        }
    items.append(small_vm)
    items.append(med_vm)
    items.append(large_vm)



bins = {
'cpu': 48*4, # 4.0 overcommit with cpu
'mem': 240000, 
'disk': 2000,
}

p = BPP(items, bins, goal = 'min')

r = p.solve('glpk', iprint = 0) 
print(r.xf) 
print(r.values) # per each bin
print "total vms is " + str(len(items))
print "servers used is " + str(len(r.xf))

for i,s in enumerate(r.xf):
    print "server " + str(i) + " has " + str(len(s)) + " vms"




##OP Interjection:  Ideally my bins would look something like:
bin1 = {
    'size': 10000, 
    'cost': 0.01*item_weight,
    }

bin2 = {
    'size': 20000,
    'cost': 0.02*item_weight,
    }

bin3 = {
    'size': 100000, 
    'cost': 0.3*item_weight,
    }

问题答案:

您要描述的具有可变装箱尺寸的装箱问题的变体至少是np-hard。

我不知道软件包openopt,项目网站似乎已关闭。Openopt似乎使用GLPK作为混合整数程序来解决该问题。您没有直接访问模型公式的权限,因为BPP()是抽象的。您可能需要修改openopt软件包以为各个容器添加约束。

通常,添加可变仓位大小作为约束很容易,如果需要扩展此公式,则需要将索引i添加到容量V,以便每个仓位具有不同的容量

我建议查看一些维护的库来建模和解决此问题:有库PuLP,CyLP和SCIP。我认为,后者并非免费用于商业用途。

由于装箱是一个非常普遍的问题,所以我找到了PuLP库的示例。我认为它默认使用CoinOR解算器,您也可以使用其他商业解决方案。

easy_install pulp

在安装PuLP之后(可以使用easy_install实现该功能),可以扩展此示例。我根据您的问题修改了示例:

from pulp import *

items = [("a", 5), ("b", 6), ("c", 7)]

itemCount = len(items)
maxBins = 3
binCapacity = [11, 15, 10]
binCost = [10, 30, 20]

y = pulp.LpVariable.dicts('BinUsed', range(maxBins), lowBound = 0, upBound = 1, cat = pulp.LpInteger)
possible_ItemInBin = [(itemTuple[0], binNum) for itemTuple in items for binNum in range(maxBins)]
x = pulp.LpVariable.dicts('itemInBin', possible_ItemInBin, lowBound = 0, upBound = 1, cat = pulp.LpInteger)

# Model formulation
prob = LpProblem("Bin Packing Problem", LpMinimize)

# Objective
prob += lpSum([binCost[i] * y[i] for i in range(maxBins)])

# Constraints
for j in items:
    prob += lpSum([x[(j[0], i)] for i in range(maxBins)]) == 1
for i in range(maxBins):
    prob += lpSum([items[j][1] * x[(items[j][0], i)] for j in range(itemCount)]) <= binCapacity[i]*y[i]
prob.solve()

print("Bins used: " + str(sum(([y[i].value() for i in range(maxBins)]))))
for i in x.keys():
    if x[i].value() == 1:
        print("Item {} is packed in bin {}.".format(*i))

此实现的强大优势在于,您可以完全控制模型的制定,并且在openopt的情况下,不受BPP()等抽象层的限制。



 类似资料:
  • 问题内容: 我正在使用matplotlib制作直方图。 有什么方法可以手动设置垃圾箱的大小,而不是垃圾箱的数量吗? 问题答案: 实际上,这很简单:您可以提供一个带有bin边界的列表,而不是bin的数量。它们也可能分布不均: 如果只希望它们均匀分布,则可以使用range: 添加到原始答案 上一行仅适用于整数填充。正如macrocosme所指出的,对于浮点数,您可以使用:

  • 问题内容: Cucumber.js提供了一个命令行“二进制”,它是一个包含 shebang 指令的简单文件: 二进制文件是使用配置密钥指定的: 这一切在POSIX系统上都能很好地工作。在Windows上运行Cucumber.js时,有人报告了一个问题。 基本上,该文件似乎是通过Windows的JScript解释器(不是Node.js)执行的,并且由于shebang指令而引发语法错误。 我的问题是:

  • bin

    neutron-rootwrap文件,python可执行文件 neutron-rootwrap-xen-dom0文件,python可执行文件。 提供利用root权限执行命令时候的操作接口,通过检查,可以配置不同用户利用管理员身份执行命令的权限。其主要实现是利用了oslo.rootwrap 包中的cmd模块。

  • 我正在制作一个有3个子绘图的图,尽管它们的宽度都相等,但一些直方图箱子的大小似乎不同。我的目标是创建一个具有相等宽度条的直方图。 我正在绘制来自三个不同数据框< code>df1、df2、df3的数据,每个数据框都有自己的轴。前两个数据帧(< code>df1,df2)有12个值,而第三个(< code>df3)有21个值。一个简单的工作示例: 在上图中,第三个子图 具有一个柱形图条,其条柱宽度显

  • 问题内容: 我有一个值列表和bin边缘列表。现在,我需要检查所有值属于它们的bin。除了遍历值然后遍历bin并检查该值是否属于当前bin之外,还有没有比Python更有效的方法了,例如: 对我来说,这看起来并不漂亮。谢谢! 问题答案: 可能为时已晚,但为将来参考,numpy具有执行此操作的功能: http://docs.scipy.org/doc/numpy/reference/generated

  • 这个问题相当抽象,不一定与tensorflow或keras有关。假设您想要训练一个语言模型,并且您想要为您的LSTM使用不同大小的输入。我特别关注这篇论文:https://www.researchgate.net/publication/317379370_A_Neural_Language_Model_for_Query_Auto-Completion. 除其他外,作者使用单词嵌入和一种热字符编

  • 问题内容: 我在Mac osx 10.7.3中遇到Java的可悲问题。以前我安装了它,并且工作正常。在一段时间后对.bash_profile和.profile文件进行了一些更改之后,出现类似以下错误 每当我尝试在终端上运行“ javac”或“ java”时。 给出类似的输出: 我的.bash_profile看起来像: 输出 它困扰了我很长时间,并且卸载和安装Java并没有帮助我。 我是Mac的新手

  • 我的mac osx 10.7.3中的Java出现了一个可悲的问题。之前我安装了它,它工作正常。经过一段时间对.bash_profile和.profile文件进行了一些更改后,出现了如下错误 每当我试图在终端中运行“javac”或“java”时。 给出如下输出: 我的.bash_profile如下所示: 输出 它困扰了我好几天,卸载和安装java对我的运气没有帮助。 我是Mac中的新手,需要帮助来解