алгоритм — Использование PHP ML — Библиотека машинного обучения, для генерации решений на основе одного входного значения

Проблема:

У меня есть дверь высотой 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-Ближайшие соседи или
Наивный байесовский

Пожалуйста, смотрите картинку, которую я прикрепил. Вы поймете, что я хочу сказать.

Я хочу использовать эту библиотеку, чтобы она могла вернуть мне несколько решений для данной высоты и оптимальное.

введите описание изображения здесь

-1

Решение

Ваша конкретная задача может быть легко перебита, проверьте это онлайн: 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

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector