Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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_Loops - Fatal编程技术网

Algorithm 寻找正确元素组合的有效算法

Algorithm 寻找正确元素组合的有效算法,algorithm,loops,Algorithm,Loops,问题如下: 1) 总负载作为输入给定 2) 负载分配的步数也作为输入给出 3) 每个步骤可以有不同的离散元素数,例如是3的倍数(即3、6、9、12、15个元素…) 4) 元素作为输入 5) 可接受的溶液在总负荷的一定范围内(等于或大于总负荷,但在一定范围内,例如高达+2) 例如: 总负荷:50 步骤数:4 允许使用的元素有:0.5、1、1.5、2.5、3、4 可接受裕度:+2(即总负载在50和52之间) 解决方案的例子有: 为了简单起见,每个步骤都有统一的元素,尽管我们可以在同一步骤中有不同

问题如下:

1) 总负载作为输入给定

2) 负载分配的步数也作为输入给出

3) 每个步骤可以有不同的离散元素数,例如是3的倍数(即3、6、9、12、15个元素…)

4) 元素作为输入

5) 可接受的溶液在总负荷的一定范围内(等于或大于总负荷,但在一定范围内,例如高达+2)

例如:

  • 总负荷:50

  • 步骤数:4

  • 允许使用的元素有:0.5、1、1.5、2.5、3、4

  • 可接受裕度:+2(即总负载在50和52之间)

  • 解决方案的例子有:

为了简单起见,每个步骤都有统一的元素,尽管我们可以在同一步骤中有不同的元素(但应分组为3,即在同一步骤中,我们可以有3个元素1,3个其他元素2,总共9个)

解决方案1:共51个

  • 第1步:4个元素中的3个(总共12个),(例如,该步骤可以是3个元素中的3个,以及3个元素中的1个,即3x3+3x1)

  • 第2步:4个元素中的3个元素(总共12个)

  • 步骤3:1.5中的9个元素(共13.5个元素)

  • 步骤4:1.5中的9个元素(共13.5个元素)

解决方案2:共51个

  • 第1步:4个元素中的3个(共12个)

  • 第2步:4个元素中的3个(共12个)

  • 第3步:6个元素,共2个(共12个)

  • 步骤4:1中的15个元素(共15个)

我使用的代码接受上述输入,并根据步骤数编写另一个代码

第二个代码基本上循环步骤的数量(在彼此的步骤中循环),并检查所有可能的元素组合

两步解决方案的循环示例:

代码:

对于NumberofElementsA=3到18步骤3
这里是每个步骤的最大元素数,因为我不能让它无限大,所以我需要为elemnt定义一个最大值
对于NumberofElementsB=3到18步骤3
对于允许的元素A=1到6
对于AllowedElementsB=AllowedElementsA到6
本例中允许的元素为6:[0.5,1,1.5,2.5,3,4]
荷载差=-总荷载+NumberofElementsA*ElementsArray(AllowedElementsA)+NumberofElementsB*ElementsArray(AllowedElementsB)
“基本上,它只是将每个循环中的元素数量(这里是3,6,9,…到18)乘以元素的值(0.5,1,1.5,2.5,3,4),然后减去总负载。
如果LoadDifference=0
“好的
如果结束
下一个允许的元素b
下一个允许元素a
下一个数字元素b
下一个数字元素a
因此,基本上,代码循环所有可能的元素数量和可能的元素值,并检查每个结果


有没有一种算法能更有效地解决上述问题?除了循环所有可能的结果之外。

由于您被限制为3人一组,这会立即转化为所有权重都增加三倍的问题:

1.5, 3, 4.5, 7.5, 9, 12
您的范围是目标值+2,或距离该范围中点(51+-1)任意一个方向都在1范围内


因为您没有列出平衡步骤负载的要求,所以现在这是目标求和问题的一个实例——在中央解决方案之前和之后都进行了一些处理。

谢谢Prune。事实上,是的步骤应该是平衡的(但不一定是100%,因为有时没有完全平衡的解决方案),所以最好的解决方案是步骤总负载之间的最小标准偏差。我的问题:除了在每次迭代中增加元素数量并检查解决方案的同时尝试所有元素的值之外,还有更好的方法吗?当然:您现在正在尝试优化步骤和,使其达到total_sum/4。。。同样,一个已知的算法。给定一个总的和,您就有一个针对这四个差异优化错误函数(您尚未定义)的短期工作。感谢您的支持@prune,您能分享一个讨论此算法的链接吗?我不确定您是想要一个指向通用优化还是“目标和”的链接,但easy是一个简单的浏览器搜索。
1.5, 3, 4.5, 7.5, 9, 12