Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 你如何证明这个算法是最优的?_Algorithm_Optimization - Fatal编程技术网

Algorithm 你如何证明这个算法是最优的?

Algorithm 你如何证明这个算法是最优的?,algorithm,optimization,Algorithm,Optimization,我有一个问题:“考虑到n件物品的重量从1公斤到10公斤不等,你如何将它们分配到最少数量的袋子中,因为每个袋子的重量可能不超过10公斤。” 我试着解决这个问题,把物品从最重的到最轻的分类,如果合适的话把它们放进一个袋子里,如果不合适的话就创建一个新的袋子。如果是这种情况,那么从剩余物品中最重的到最轻的再开始。这是我的密码: list\u of_items=raw\u input(“输入项的权重(用空格分隔):”)。split() 对于范围内的i(len(项目列表)): 项目列表[i]=int(项目

我有一个问题:“考虑到n件物品的重量从1公斤到10公斤不等,你如何将它们分配到最少数量的袋子中,因为每个袋子的重量可能不超过10公斤。”

我试着解决这个问题,把物品从最重的到最轻的分类,如果合适的话把它们放进一个袋子里,如果不合适的话就创建一个新的袋子。如果是这种情况,那么从剩余物品中最重的到最轻的再开始。这是我的密码:

list\u of_items=raw\u input(“输入项的权重(用空格分隔):”)。split()
对于范围内的i(len(项目列表)):
项目列表[i]=int(项目列表[i])
列出项的项。排序()
列出所有项目。反向()
当\u项的列表[0]>=10时:
项目列表=原始输入(“您输入了一个超过10kg的项目:”).split()
对于范围内的i(len(项目列表)):
项目列表[i]=int(项目列表[i])
列出项的项。排序()
列出所有项目。反向()
set_of_bags=[]在这个列表中,我们将存储这些包
而(len(项目列表)!=0):
重量=0
bag=[]#创建一个新的包
对于项目列表中的项目:#循环将项目复制到行李

如果物品+重量我认为这很接近,但我看不出你考虑的重量可能有问题,如果你有9公斤、5公斤、1公斤的物品。它会增加9公斤的物品,看到5公斤太多,跳到下一个袋子,即使1公斤的物品合适

我对Python优化的了解不如大多数人,但我认为最快的应该是

获取原始值(10KG、5KG、8KG、2KG、2KG、1KG、10KG、9KG); 分类/索引重量数量(10KG:2、9KG:1、8KG:1、5KG:1、2KG:2、1KG:1)

首先开始填充具有最重值的袋子,如果重量超过,则尝试添加下一个最大的索引,直到袋子在值索引末尾为A:满或B:为止

根据值的多少…实际上,向后搜索值索引并根据下一个最高值进行测试可能会更快,这样您就不必为较大的项迭代那么多值。(例如,10KG测试1KG,发现它不起作用。9KG测试1KG,发现它起作用,但也测试2KG,发现它不起作用,因此它以1KG为最佳值,这仍然只是2次迭代,而不是从8、5、2、1开始需要的4次迭代)


我希望这是有意义的。

当然,这不是最佳选择。一般来说,如果你有一个非平凡的算法,对某些东西进行排序,然后使用“贪婪方法”,即选择最小值或最大值的东西,而你不确定为什么这是正确的,那么它可能是错误的。特别是如果你有一个整数优化问题

如果你有,比如说,
3,3,3,4,4
,那么你的算法将使用三个包而不是两个包

您的算法:

Bag 1: 4, 4
Bag 2: 3, 3, 3
Bag 3: 3
最佳:

Bag 1: 4, 3, 3
Bag 2: 4, 3, 3
现在,为了说明其他一些启发式方法也是错误的,看看这个例子:
3,3,4,6,7,7
。如果你从最低到最高,把
3,3,4
放在一个袋子里,你会得到四个而不是三个袋子。同一个例子表明,仅仅因为你可以装满一个袋子并不意味着你应该这样做。(但是,如果您只有两种物品组合在一起,例如
7
3
,那么您可以将它们放在一个袋子中,完全忘记它们。)

最后,看看
3,3,3,3,4,4,4
。如果你从最底层开始,你会得到四个袋子:

Bag 1: 3 3 3
Bag 2: 3 4
Bag 3: 4 4
Bag 4: 4
Bag 1: 4 4
Bag 2: 4 4
Bag 3: 3 3 3
Bag 4: 3
如果你从最高点出发,你会得到四个包:

Bag 1: 3 3 3
Bag 2: 3 4
Bag 3: 4 4
Bag 4: 4
Bag 1: 4 4
Bag 2: 4 4
Bag 3: 3 3 3
Bag 4: 3
但是,您可以得到三个包:

Bag 1: 4 3 3
Bag 2: 4 3 3
Bag 3: 4 4 
以下是你能做的(我省略了证据):

  • 如果你有一个10,把它放在一个单独的袋子里。先处理所有10个
  • 如果你有一个9,如果可能的话,把它和一个1放在一个袋子里,或者单独放。在继续之前处理所有9
  • 如果你有一个8,如果可能的话,把它和一个2放在一个袋子里;如果可能的话,把它和两个1放在一个袋子里;如果可能的话,把它和一个1放在一个袋子里;或者单独放在一个袋子里。在继续之前处理所有8
  • 如果你有一个7,把它放在一个袋子里,袋子里有3,如果没有,袋子里有2和1,如果没有,袋子里有一个2,如果没有,袋子里还有多少个1。在继续之前处理好所有7
  • 如果你有一个6,把If和4放在一起。如果不是,这里会变得很棘手
  • 在这一点上,你只剩下6秒,5秒,3秒,2秒,1秒。现在,1并不重要。您只需消除它们,找到最佳解决方案,然后将它们重新添加。另外,如果你至少有两个5,把它们加在一起,做成一个袋子(也很容易证明)。因此,您有6个、3个、2个,最多一个5个。如果你有一个5,那么如果可能的话,它必须加上一个3,然后再加上一个2或者你剩下的任何1。如果你没有3,那么你的5必须和你剩下的2一样多,然后是1
  • 现在我们还有6秒,3秒和2秒。现在它就像一个简单的游戏。你只有2和3,这才是重要的。每个“6”允许您取一个“3”或两个“2”。用完6秒后,您可以选择5秒,或3秒加3秒,或2秒加2秒,或3秒。现在您可以使用动态规划来找到最佳解决方案。例如,设
    d[i,j,k]
    i
    2s、
    j
    3s和
    k
    6s的最小行李数。也许有更好的解决办法

听起来像是一个箱子包装问题:在先添加最大的可用重量后,如果再添加最小的可用重量值,会发生什么情况?很好!!由于这个过程本质上是还原的,这实际上会使它更快!