Проблема:
У меня есть дверь высотой 2000 мм.
У меня есть 2 типа панелей для постройки дверей:
615mm стандартные панели и 495mm стандартные панели.
Для вышеупомянутой высоты мое оптимальное решение должно быть:
1 х 615 мм стандартная панель
Стандартная панель 2 х 495 мм
1 х 495 мм панель, из которой я вырезал 100 мм, чтобы достичь высоты 2000 мм.
Вот лучшее решение для резки с 495 вместо 615 мм, потому что это будет потеря большого количества материала.
Пример:
Высота 1845 мм —
Оптимальным решением является:
3 х 615 мм панели (3 х 615 мм = 1845 мм).
Другой пример:
Высота 3000 мм —
Оптимальным решением:
4 х 615 мм панели
Панель 1 х 540 мм (по умолчанию 615 мм, из которых вырезано 75 мм для заполнения высоты 3000 мм)
Мой вопрос, могу ли я использовать любой алгоритм из библиотеки PHP-ML для обучения и прогнозирования решений для заданного ввода (высота, в моем случае). Если ответ да, какой алгоритм лучше всего подходит для моего случая?
классификация
SVC или
k-Ближайшие соседи или
Наивный байесовский
Пожалуйста, смотрите картинку, которую я прикрепил. Вы поймете, что я хочу сказать.
Я хочу использовать эту библиотеку, чтобы она могла вернуть мне несколько решений для данной высоты и оптимальное.
Ваша конкретная задача может быть легко перебита, проверьте это онлайн: https://3v4l.org/dQmdb
Вот код:
<?php
// Examples:
// Door 2000 1845 3000
// 615mm panel 1 3 5
// 495mm panel 3 0 0
// panel loss 100 0 75
function 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) // Get first combination without waste
return getFormattedResult($big, $small, $waste);
if ($waste > 0) // Omit combinations smaller then door
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";
// Result:
// 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}
Мой предыдущий ответ не верен, но я оставляю это как пример нашей любви к усложнению вещей.
Это классика 1D проблема режущего материала которая может быть сформулирована как целочисленная задача линейного программирования.
Вы должны знать, что это NP-полная проблема:
В основном это означает, что их нельзя гарантировать лучшим решением без проверки каждого возможного решения. Это не означает, что решение, достигнутое одним из следующих алгоритмов, не является оптимальным, это может быть.
Учитывая данную информацию, вы должны самостоятельно реализовать алгоритм: https://neos-guide.org/content/cutting-stock-problem
и видео: https://www.youtube.com/watch?v=NoiPrt4OsQA
Если вы отчаянно хотите использовать машинное обучение, проверьте генетический алгоритм: https://github.com/ffsantos92/2d-cutting-stock-problem
Других решений пока нет …