« 1 2 »
Autor Zpráva
gaminn
Profil *
Zdravím,
sháním funkci na vytvoření kombinací n-tého stupně z x definovaných prvků. Nevíte o nějaké takové... ??
ninja
Profil
Ja bych bral i funkcni permutace, co by jako zdroj brala 2-rozmerne pole.
gaminn
Profil *
Trochu jsem se spletl v tom, co potřebuju, resp. jsem myslel, že kombinace mne nakopnou správným směrem. To, co potřebuji, má vypadat následovně:

Mám zadané např elementy array(1,2,3,4) a z nich potřebuji vytvořit jiné elementy, které budou obsahovat kombinace (tedy nezáleží na pořadí) z jakýchsi skupiny utvořených ze základních elementů přičemž každý bude použit právě jednou. Takže chci dostat něco jako

array(array(1), array(2), array(3), array(4))
array(array(1), array(2), array(3,4))
array(array(1), array(2,3), array(4))
array(array(1), array(2,3,4))
array(array(1,2,3,4))
array(array(2), array(1,3), array(4))
array(array(2), array(3), array(1,4))
array(array(2), array(3,1,4))
array(array(1,2), array(3,4))
array(array(1,3), array(2,4))

atd.......
tiso
Profil
a na čo to má byť dobré?
gaminn
Profil *
Mělo by to sloužit k optimalizaci - každý prvek (1,2,3,4) má několik parametrů a já chci vypočítat, jaké rozložení těchto prvků ve skupinách má nejoptimálnější rozložení těchto parametrů.
gaminn
Profil *
Nikdo nemá tušení, jak takový algoritmus udělat? Už jsem popsal několik papírů, ale nemůžu se dobrat k algoritmu, který by spolehlivě udělal všechny možné kombinace těch skupin... Prosím, nakopněte mě někdo správným směrem...
krteczek
Profil
sry dvakrát se to odeslalo
krteczek
Profil
jestli to chápu správně tak máš dvě pole a každý prvek obou polí chceš spolu kombinovat
něco jako

function najdi($array1, $array2)
{
$neco = array();
for($i = 0; $i < count($array1);$i++)
{
for(j$ = 0; $j < count($array2);$j++)
{
$neco[] = $array1[$i] * $array2[$j];
}
}
return $neco;
}

ale nevím jestli je to to co chceš
procházíš dve pole tak že každý prvek prvního pole vynásobíš prvkem sruhého pole a uložíš výsledek do třetího a ten je zároveň návratovou hodnotou
samozřejmě to jde udělat i tak že jedno z polí má natvrdo definovaný obsah(nepředávášho fci a celý cyklus se podle toho upraví
krteczek
gaminn
Profil *
Tohle nebude to, co chci, dám tu ještě jiný příklad:

Mám např. tři osoby- Milan, Petra, Pavel - a chci je různě poseskupovat, ale samozřejmě v rámci jedné možnosti může být každá osoba jen v jedné skupině.

Milan+Petra+Pavel (1. možnost - všichni tři dohromady v jedné skupině)
Milan | Petra+Pavel (2. možnost dvě skupiny - jeden člověk je sám, druzí dva v jedné skupině)
Milan+Petra | Pavel (to samé)
Milan+Pavel | Petra (to samé)
Milan | Petra| Pavel (5. možnost - všichni budou sami ve své skupině)

Jestli se nepletu, tak jsem zde napsal všechny varianty. Samozřejmě, pokud přidám další osobu, tak počet možností prudce roste.
krteczek
Profil
jak by to bylo u čtyř?
dodatek a u dvou?
gaminn
Profil *
Milan, Petra:

Milan | Petra (každý ve své skupině)
Milan + Petra (oba v jedné skupině)

Milan, Petra, Pavel, Hanka:

Milan + Petra + Pavel + Hanka
Milan | Petra + Pavel + Hanka
Milan | Petra | Pavel + Hanka
Milan | Petra + Hanka | Pavel
Milan + Pavel | Petra | Hanka
Milan + Pavel | Petra + Hanka

a milion dalších kombinací.....
k
Profil *
gaminn
S opakovanim nebo bez?
(Milan | Petra + Pavel) == (Milan | Pavel + Petra) ??
gaminn
Profil *
k
Obě uvedené možnosti jsou naprosto ekvivalentní. Tím opakováním jsi zřejmě myslel, zda záleží na pořadí - nezáleží.
k
Profil *
gaminn
jo presne tak:) Stredni uz je nejaky cas za mnou, takze presne nazvy lezi v ...
OK. Chce to chvili casu.
gaminn
Profil *
No já se s tím peru už celý den, takže chvíli času to určitě bude chtít... Kombinatorika nikdy nebyla můj koníček...
k
Profil *
gaminn
Tak ted na to jdu ale potrebuju jeste jednu radu.
mam 3 prvky R G B
mozne kombinace:
R G B
R+G B
R G+B
R+B G
R+G+B

chybi nejaka?
k
Profil *
a pri 2 prvcich:
R G
R+G
gaminn
Profil *
Ano, takhle přesně to má vypadat, je to úplně to stejné, jako když jsem dával příklady s těmi jmény, viz výše.
k
Profil *
gaminn
Ja radsi pro jistotu
gaminn
Profil *
Jestli se tím zabýváš, tak ti mohu poslat funkci, která vytváří kombinace všech stupňů z daných prvků. Možná to pomůže, možná ne...
k
Profil *
jeste jsem se k tomu poradne nedostal ale posli ji. Dej ji sem i pro ostatni.
gaminn
Profil *

function combinations($elements) {
if(is_array($elements)) {

$combinations = array(array()); # don't forget the empty arrangement!

foreach($elements as $element) {
$new_combinations = array();

foreach($combinations as $combination) {
$new_combination=array_merge($combination, array($element));
array_push($new_combinations, $new_combination);
}

$combinations = array_merge($combinations,$new_combinations);
}


return $combinations;
}
else {
return false;
}
}
k
Profil *
$combinations = array(array()); # don't forget the empty arrangement!

foreach($elements as $element) {
$new_combinations = array();
foreach($combinations as $combination) {
$new_combination=array_merge($combination, array($element));
array_push($new_combinations, $new_combination);
}
$combinations = array_merge($combinations,$new_combinations);
}

$out = array();
foreach($combinations as $k => $v){
if(count($v)>1){
$out[] = $v;
}
}
return $out;

Snad to dela to co chces.
k
Profil *
Nejsem si jistej jestli to opravdu funguje tak jak pozadujes, jelikoz mi reseni prijde hodne trivialni, kazdopadne mi prijde ze to dela to co ma.
gaminn
Profil *
No, já nevím, ale tahle funkce přece neudělá to, co chci. Ze všech kombinací jen vytřídí ty prvního stupně, jinak vrací stejný výsledek. Dej této funkci jako parametr např. ten příklad s R G B a uvidíš, že nedostaneš výsledek, jaký je očekáván.
gaminn
Profil *
Vysvětlím to ještě jednou na R G B - mám tedy tři tyto prvky. Chci abych po projetí funkce, kterou hledáme, byl výsledek:


array(5) {
[0]=>
array(3) {
[0]=>
array(1) {
[0]=>
string(1) "R"
}
[1]=>
array(1) {
[0]=>
string(1) "G"
}
[2]=>
array(1) {
[0]=>
string(1) "B"
}
}
[1]=>
array(2) {
[0]=>
array(2) {
[0]=>
string(1) "R"
[1]=>
string(1) "G"
}
[1]=>
array(1) {
[0]=>
string(1) "B"
}
}
[2]=>
array(2) {
[0]=>
array(2) {
[0]=>
string(1) "R"
[1]=>
string(1) "B"
}
[1]=>
array(1) {
[0]=>
string(1) "G"
}
}
[3]=>
array(2) {
[0]=>
array(2) {
[0]=>
string(1) "B"
[1]=>
string(1) "G"
}
[1]=>
array(1) {
[0]=>
string(1) "R"
}
}
[4]=>
array(1) {
[0]=>
array(3) {
[0]=>
string(1) "R"
[1]=>
string(1) "G"
[2]=>
string(1) "B"
}
}
}


Už si rozumíme?
k
Profil *
gaminn
naprosto.
gaminn
Profil *
A ještě jeden příklad, tentokrát přímo ze života. Vytvářením těchto kombinací chci např. zjistit, v jakých různých skupinách můžu 10 různých věcí balíky poštou. Mohu např.

poslat všechny najednou v 1 balíku
1. věc v 1. balíku a zbytek ve 2. balíku
1. dvě věci v 1. balíku, zbytek ve druhém
1. a poslední věc v 1 balíku zbytek ve druhém
1., 3.,5. věc v 1. balíku, 2 věc ve 2. balíku, 4 a 6 věc ve třetím balíku, 7 věc ve 4. balíku, 8 a 10. v 5. balíku a 9. v 6. balíku
atd..... milion možností....
gaminn
Profil *
Tzn. v rámci jedné možnost musím vždycky použít všechny prvky právě jednou. Ale mohu je různě porozhazovat do různých skupin.
k
Profil *
gaminn
Neboj uz chapu. Ted jsem v praci takze nemam moc casu se tim zabyvat ale do zitra se na to mrknu.
« 1 2 »
Toto téma je uzamčeno. Odpověď nelze zaslat.