przeprosiny, ale to będzie raczej układ logiczny niż kod ...
to nie jest dla mnie jasne, czy array (1,2,3,4) są wyniki za pierwsze danie lub z pierwszego kucharza, ale to pewnie używać tablicy tak, że
$array[$cook_id][$dish_number] = $score;
() każda tablica tak, aby $ array [$ cook_id] = array ($ lowest_scored _dish, ..., $ najwyższy);
Należy rozważyć ważoną preferencję dla konkretnego kucharza, aby danie stanowiło różnicę między wynikiem najlepszego dania a innym.
Jako bardzo prosty przykład gotuje, a, b, c oraz naczynia 0,1,2
$array['a'] = array(0=>100, 1=>50, 2=>0); // cook a prefers 0 over 1 with weight 50, over 2 with weight 100
$array['b'] = array(0=>100, 1=>100, 2=>50); // cook b prefers 0,1 over 2 with weight 50
$array['c'] = array(0=>50, 1=>50, 2=>100); // cook c prefers 2 with weight 50
Po asort(): $ tablica [ 'a'] = array (0 => 100 , 1 => 50, 2 => 0); $ array ['b'] = array (0 => 100, 1 => 100, 2 => 50); $ array ['c'] = array (2 => 100, 0 => 50, 1 => 50);
Zacznij od kucharza "a", który woli danie 0 od swojej następnej najlepszej potrawy o 50 punktów (waga). Cook 'b' również preferuje dih 0, ale o wadze 0 w stosunku do następnego dania. Dlatego jest prawdopodobne (choć nie jest jeszcze pewne, że kucharz "a" powinien przygotować danie 0.
Rozważ danie 0, które ma być zarezerwowane i przejdź do gotowania "b" Z wyjątkiem dania 0, gotuj "b" preferuje danie 1. Nie inny kucharz preferuje danie 1, więc gotować „b” jest przypisany potrawie 1.
kucharska „c” dostaje danie 2 domyślnie.
jest to bardzo wygodne przykład gdzie każdy kucharz dostaje ugotować coś, co jest osobisty max, ale mam nadzieję, że jest to ilustracja jakiejś logiki, która by zadziałała.
Zrobimy to mniej wygodnie:
$array['a'] = array(0=>75, 1=>50, 2=>0);
$array['b'] = array(0=>100, 1=>50, 2=>50);
$array['c'] = array(0=>100, 1=>25, 2=>25);
Powtórzyć Cooka a "i 0 zauważyć, że jest korzystne, ale tym razem z wagi 25. Cooka b 'preferuje o gramaturze od 50 do gotowania„c”preferuje o wadze 75. gotowania "c" wygrywa danie 0.
Wracając do listy dostępnych kucharzy, "a" preferuje 1 o wadze 50, ale "b" preferuje wagę 0. "a" dostaje danie 1 i "b" "dostaje danie 2.
To nadal nie zajmuje się wszystkimi złożonościami, ale jest krokiem we właściwym kierunku. Czasami założenie przyjęte dla pierwszej kombinacji dania/dania będzie błędne.
WAY mniej wygodne:
$array['a'] = array(0=>200, 1=>148, 2=>148, 3=>0);
$array['b'] = array(0=>200, 1=>149, 2=>0, 3=>0);
$array['c'] = array(0=>200, 1=>150, 2=>147, 3=>147);
$array['d'] = array(0=>69, 1=>18, 2=>16, 3=>15);
'a' dostaje 0, ponieważ jest to max i nikt inny, kto preferuje 0 ma wyższą masę 'b' wygrywa 1 o wadze 149 'd' wygrywa 2 od „c” nie posiada pierwszeństwo z dostępnych opcji „C” dostaje 3
wynik: 200 + 149 + 147 + 16 = 512
Mimo, że jest to dobry przypuszczenie, że zebrali bez sprawdzania każda permutacja, t może być nie tak. Stąd zapytaj: "Gdyby jeden kucharz wymienił się z kimś innym, czy całkowity wzrost?"
odpowiedź brzmi tak, a (0) + d (2) = 200 + 16 = 216, ale (2) + d (0) = 148 + 69 = 217.
Zostawię to do ciebie, aby napisać kod dla „najlepszego odgadnięcia” stosując metodę ważonego, ale po tym, tutaj jest to dobry początek dla Ciebie:
// a totally uneducated guess...
$picks = array(0=>'a', 1=>'b', 2=>'c', 3=>'d');
do {
$best_change = false;
$best_change_weight = 0;
foreach ($picks as $dish1 => $cook1) {
foreach ($picks as $dish2 => $cook2) {
if (($array[$cook1][$dish1] + $array[$cook2][$dish2]) <
($array[$cook1][$dish2] + $array[$cook2][$dish1]))
{
$old_score = $array[$cook1][$dish1] + $array[$cook2][$dish2];
$new_score = $array[$cook1][$dish2] + $array[$cook2][$dish1];
if (($new_score - $old_score) > $best_change_weight) {
$best_change_weight = $new_score - $old_score;
$best_change = $dish2;
}
}
}
if ($best_change !== false) {
$cook2 = $picks[$best_change];
$picks[$dish1] = $cook2;
$picks[$dish2] = $cook1;
break;
}
}
} while ($best_change !== false);
nie mogę znaleźć przykład licznik, aby pokazać, że to nie robi” działa, ale jestem podejrzliwy wobec przypadku, w którym ($ array [$ cook1] [$ dish1] + $ array [$ cook2] [$ dish2]) == ($ array [$ cook1] [$ dish2 ] + tablica $ [$ cook2] [$ dish1])
Może ktoś inny odpowie na to pytanie "Co, jeśli?"
Biorąc pod uwagę to macierz, w której elementy w nawiasach są "rozgrywki"
[a1] a2 a3
b1 [b2] b3
c1 c2 [c3]
Jeśli a1 + a2 + b2 == b1, a następnie 'a' i 'b' nie przejdzie potraw. Sprawa nie jestem 100% pewny jest, jeśli istnieje taka macierz taką, że jest lepszym wyborem:
a1 [a2] a3
b1 b2 [b3]
[c1] c2 c3
Pierwsze z pierwszego stanu do drugiego wymaga dwa przełączniki, z których pierwszy jest arbitralne, ponieważ nie zmienia sumy. Ale tylko przechodząc przez tę arbitralną zmianę, można dokonać ostatniego przełączenia.
Próbowałem znaleźć przykład 3x3 taki, że w oparciu o model "ważonej preferencji", o którym pisałem powyżej, pierwszy zostałby wybrany, ale także taki, że prawdziwy optymalny wybór jest podawany przez drugi. Nie mogłem znaleźć przykładu, ale to nie znaczy, że nie istnieje. Nie mam ochoty robić więcej algebry macierzy teraz, ale może ktoś podchwyci to, gdzie skończyłem. Heck, może sprawa nie istnieje, ale myślałem, że powinienem zwrócić uwagę na problem.
Jeśli to zadziała i zaczniesz od prawidłowego wyboru, powyższy kod przejdzie tylko 64 razy (8x8) dla 8 smażonych potraw/potraw. Jeśli pick nie jest poprawny, a pierwszy kucharz ma zmianę, to osiągnie 72. Jeśli ósmy kucharz ma zmianę, to jest to 128. Możliwe, że do-while będzie się zapętlać kilka razy, ale wątpię pojawi się w pobliżu cykli procesora wymaganych do zsumowania wszystkich kombinacji 40k.
Jeżeli max (N sub-macierze) = 8, a następnie max (trwała ondulacja) = 4^8 = 65536. – HamZa
Z tego co zrozumienia tego problemu, z których każdy można ugotować tylko jedno gotować receptury więc liczba faktyczne permutacje to 4 * 3 * 2 * 1 = 4! = 24. Mając to na uwadze, nie byłoby tak rozciągać się na brutalną siłę, aby obliczyć, jeśli jest tylko 4 kucharzy/przepisy kulinarne. – Pudge601
Dzięki chłopaki! Myślę, że to jest 8! który = 40 320. – Gamemorize