问题:
我有一扇门,高2000毫米。
我有两种类型的板材来构建这扇门:
615毫米的标准板材和495毫米的标准板材。
对于上述高度,我的最优解决方案应该是:
1个615毫米的标准板材
2个495毫米的标准板材
1个495毫米的板材,从中切割100毫米以达到2000毫米的高度。这里最好的解决方案是从495毫米的板材上切割,而不是从615毫米的板材上切割,因为这样会浪费太多材料。
示例:1845毫米高度 –
最优解决方案是:
3个615毫米的板材(3 x 615毫米 = 1845毫米)。
另一个示例:
3000毫米高度 –
最优解决方案:
4个615毫米的板材
1个540毫米的板材(默认615毫米,从中切割75毫米以填补3000毫米的高度)
我的问题是,我能否使用PHP-ML库中的任何算法来训练并预测给定输入(在我的情况下是高度)的解决方案?如果答案是肯定的,哪种算法最适合我的情况?
分类
SVC或k-最近邻或朴素贝叶斯
请查看我附件的图片。你会明白我想表达的意思。
我想使用那个库,以便它可以为给定高度返回多个解决方案,以及一个最优解决方案。
回答:
你的具体任务可以很容易地通过暴力破解来解决,在线检查:https://3v4l.org/dQmdb
这里是代码:
<?php// 示例:// 门 2000 1845 3000// 615毫米板材 1 3 5// 495毫米板材 3 0 0// 板材损耗 100 0 75function calcOptimalPanels ($doorHeight) { $bigHeight = 615; $smallHeight = 495; $bigFit = floor($doorHeight / $bigHeight); $smallFit = floor($doorHeight / $smallHeight); $options = []; for ($big = 0; $big <= $bigFit; $big++) { for ($small = 0; $small <= $smallFit; $small++) { $waste = $bigHeight * $big + $smallHeight * $small - $doorHeight; if ($waste === 0) // 获取第一个无浪费的组合 return getFormattedResult($big, $small, $waste); if ($waste > 0) // 忽略小于门高度的组合 continue; $options[$waste] = getFormattedResult($big, $small, $waste); } } $minWaste = min(array_keys($options)); return $options[$minWaste];}function getFormattedResult($big, $small, $waste) { return ['615mm' => $big, '495mm' => $small, 'waste' => $waste];}echo '2000: ' . json_encode(calcOptimalPanels(2000)) . "\n";echo '1845: ' . json_encode(calcOptimalPanels(1845)) . "\n";echo '2340: ' . json_encode(calcOptimalPanels(1845 + 495)) . "\n";echo '3000: ' . json_encode(calcOptimalPanels(3000)) . "\n";// 结果:// 2000: {"615mm":1,"495mm":3,"waste":100}// 1845: {"615mm":3,"495mm":0,"waste":0}// 2340: {"615mm":3,"495mm":1,"waste":0}// 3000: {"615mm":1,"495mm":5,"waste":90}
我之前的回答是不正确的,但我将其保留作为我们喜欢过度复杂化事情的一个例子。
旧回答
这是一个经典的一维切割库存问题,可以表述为整数线性规划问题。
你应该知道这是一个NP完全问题:
这基本上意味着没有办法保证在不检查所有可能的解决方案的情况下找到最佳解决方案。这并不是说通过以下算法之一达到的解决方案不是最优的,它可能是最优的。
考虑到这些信息,你必须自己实现一个算法:https://neos-guide.org/content/cutting-stock-problem
和视频:https://www.youtube.com/watch?v=NoiPrt4OsQA
如果你迫切希望利用机器学习,那么请查看遗传算法:https://github.com/ffsantos92/2d-cutting-stock-problem