Алгоритм Логика Требуется для поиска лучшего решения

сценарий

  1. Список автомобилей, доступных со следующими свойствами:

    vehicle1 {пассажиров: 4, багажа: 2, чемоданов: 8}

    vehicle2 {пассажиров: 5, багажа: 3, чемоданов: 10}

    транспортное средство3 {пассажиров: 6, багажа: 3, чемоданов: 10}

    vehicle4 {пассажиров: 8, багажа: 4, чемоданов: 10}

  2. Теперь, если пользователь требует поездки с (13 пассажиров, 6 багажа, 15 чемоданов), то наилучшим эффективным результатом будет:

    транспортное средство2 + транспортное средство4

Определение проблемы:
Я был в состоянии разработать поток / алгоритм до этого (но только с учетом количества пассажиров), но когда количество пассажиров / чемоданов / багажа превышает потребность в 3 транспортных средствах или больше, я не могу разработать алгоритм для Это.

Код:

function ajax_getVehicles() {

$vehicleType = $_POST['vehicle_type'];
$passengers = intval($_POST['passengers']);
$luggage = intval($_POST['luggage']);
$suitcases = intval($_POST['suitcases']);

$requiredVehicles = array();

// 1. Check if all passengers fit in a single car
if (!$requiredVehicles) {
$vehicle = $this->common_model->get_where('fleets', array('vehicle_type' => $vehicleType, 'passengers >=' => $passengers), 'passengers ASC');
if ($vehicle)
array_push($requiredVehicles, $vehicle[0]);
}

// 2. Try sending duplicate vehicles
$vehicles = $this->common_model->get_where('fleets', array('vehicle_type' => $vehicleType), 'passengers ASC');
if (!$requiredVehicles) {
foreach ($vehicles as $v) {
if ($v['passengers'] * 2 == $passengers) {
array_push($requiredVehicles, $v, $v);
}
}
}

// 3. Find best possible solution
if (!$requiredVehicles) {
$totalPermutation = gmp_fact(count($vehicles)) / (gmp_fact(count($vehicles) - 2) * gmp_fact(2));

$total_pax_array = array();
for ($i = 0; $i < $totalPermutation; $i++) {
for ($count = $i + 1; $count < count($vehicles); $count++) {
$total_pax = $vehicles[$i]['passengers'] + $vehicles[$count]['passengers'];

if ($total_pax >= $passengers) {

if (count($total_pax_array) < 1) {
$requiredVehicles = array($vehicles[$i], $vehicles[$count]);
} else if ($total_pax < min($total_pax_array)) {
$requiredVehicles = array($vehicles[$i], $vehicles[$count]);
}

array_push($total_pax_array, $total_pax);
}
}
}
}

// 4. check if requirement can be acheived by sending duplicate vehicles
if (!$requiredVehicles) {

foreach ($vehicles as $v) {
if ($v['passengers'] * 2 > $passengers) {
array_push($requiredVehicles, $v, $v);
}
}
}

if (!$requiredVehicles)
jsonOutput('ERROR', 'call for 3 vehicles required.');
else
jsonOutput('SUCCESS', 'criteria matching vehicles', $requiredVehicles);
}

0

Решение

Это может быть решено с помощью Динамическое программирование (DP) следуя рекурсивной формуле:

D(p,l,s,0) =   infinity        if p>0 or l>0 or s>0
0               otherwise
D(p,l,s,i) = min { D(p,l,s,i-1), D(p-cars[i].passangers, l-cars[i].luggage, s-cars[i].suitcases) + 1}

Идея в том, что D (p, l, s, i) представляет минимальное количество автомобилей между автомобилями 1,2,3 …, i — которое может занять p пассажиры, l багаж и багаж s чемоданы.

Сложность по времени (при применении методики DP): O(n*p*l*s), где n количество доступных автомобилей, p необходимое количество пассажиров, l — необходимое количество багажа, и s — необходимое количество чемоданов.


Альтернативное решение состоит в том, чтобы сгенерировать все подмножества автомобилей, для каждой проверки подмножества проверить, является ли это возможным решением, и выбрать минимальное подмножество размеров из возможных решений. Сложность времени: O(2^n)

4

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

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

По вопросам рекламы [email protected]