Mogelijkheden van pionnen op een Veld

Wiskunde is niet alleen een vak op school. Kom je ergens in de praktijk (bijvoorbeeld tijdens je werk) een wiskundig probleem tegen dan kun je hier om hulp vragen.
Plaats reactie
Whrothus
Nieuw lid
Nieuw lid
Berichten: 3
Lid geworden op: 13 dec 2015, 21:08

Mogelijkheden van pionnen op een Veld

Bericht door Whrothus » 13 dec 2015, 21:48

Ik heb een veld van 5*5
Waar ik 2 kleuren van 5 pionnen op zet
Deze zijn onderling uitwisselbaar zonder een probleem
Ik besef dat Voor de eerste kleur er 53130 mogelijkheden zijn (Gevonden in programma)
ik reken op 20 velden die nog kunnen ingevuld
En de andere kleur is dan 15504 (want er zijn maar 15 lege velden meer (5 afgevallen door de andere kleur))
Dus in het totaal zijn er 823 727 520 mogelijkheden
Ik heb dit wel gevonden door een programma

Als ik de eerste kleur * 15504 doe
en dan de 2de kleur er bij op tel
kom ik voor elk getal een unieke stelling (De spiegelgetallen ga ik er uithalen door het kleinste getal te nemen)
Voor kleur 1 te bereken veronderstel ik dat kleur 2 niet bestaat (werkt gemakkelijker voor kleur 2)
Geg[0] = aantal lege velden tot de eerste pion
Geg[1] = aantal lege velden tussen pion 1 en 2
Geg[2] = aantal lege velden tussen pion 2 en 3
Geg[3] = aantal lege velden tussen pion 3 en 4
Geg[4] = aantal lege velden tussen pion 4 en 5
Geg[5] = aantal lege velden tussen pion 5 en einde

De som van deze getallen is dus altijd 20

Ik heb het volgende gevonden

Mijn nummer van mijn stelling is dan
(Kleur 1 * aantalmogelijkheden kleur 2) + kleur 2

Enkel Kleur 1 interesseer me
Ik heb mogelijkheid 0 als begin mogelijkheid en daar is alles 0 buiten Geg[5] die is 20
Kleur1 = Geg[4] + (Geg[3]+Geg[4]+Geg[5]+1.5 - Geg[3]/2)*Geg[3])+ ?Iets met Geg[2] + ?iets met Geg[1] + Iets met Geg[0]

Het volgende kan helpen
Wanneer Geg[2]=1 en Geg[5] =19 kom ik op 231
Wanneer Geg[2]=2 en Geg[5] =18 kom ik op 441
Wanneer Geg[2]=3 en Geg[5] =17 kom ik op 631
...
Veel geluk
Ik heb er al 5h aan besteed maar niet meer gevonden

arie
Moderator
Moderator
Berichten: 3911
Lid geworden op: 09 mei 2008, 09:19

Re: Mogelijkheden van pionnen op een Veld

Bericht door arie » 13 dec 2015, 22:48

Kijk eens naar https://nl.wikipedia.org/wiki/Combinatie_(wiskunde).
Om k=5 witte pionnen te verdelen over n=25 velden zijn er



mogelijkheden.
Om vervolgens k=5 zwarte pionnen te verdelen over de n=20 overgebleven velden zijn er



mogelijkheden.
Op veel wetenschappelijke rekenmachines vind je een nCr-toets (of iets wat daarop lijkt) om deze aantallen uit te rekenen.


Volgens mij wil je nu elk van die combinaties voorzien door een rangnummer, en wil je:
- bij elke combinatie het rangnummer kunnen bepalen
- bij elk rangnummer de bijbehorende combinatie bepalen.
Klopt dat?

En in welke programmeertaal werk je?

Whrothus
Nieuw lid
Nieuw lid
Berichten: 3
Lid geworden op: 13 dec 2015, 21:08

Re: Mogelijkheden van pionnen op een Veld

Bericht door Whrothus » 13 dec 2015, 23:22

Van elke combinatie de rangnummer bepalen is uiteindelijk de bedoeling
De rangnummer naar de combinatie zou handig zijn maar als ik het bovenliggende kan dan kan ik dat door benadering
Vul in tot het groter is dan de combinatie die ik wil hebben moet ik eentje minder nemen en dan met de volgende zijn lege velden schuiven
Ik heb dit enkel nodig voor mijn database op te kuisen

Ik werk met c# (dus die zal misschien wel zo een functie bevatten)

arie
Moderator
Moderator
Berichten: 3911
Lid geworden op: 09 mei 2008, 09:19

Re: Mogelijkheden van pionnen op een Veld

Bericht door arie » 14 dec 2015, 08:58

Mocht je het kunnen gebruiken: hieronder wat C code voor je probleem.
Deze code kan je waarschijnlijk redelijk eenvoudig omzetten naar C#.
Mogelijk moet je de output functie printf vervangen door cout.

De tabel comb[26][6] bevat alle combinaties die we nodig hebben (= van 0C0 t/m 25C5).
Deze worden in wf_pionnen() berekend zoals in de driehoek van Pascal
(zie https://nl.wikipedia.org/wiki/Driehoek_van_Pascal).

De 25 vakken van het speelveld zijn gecodeerd met nummers 1 t/m 25,
De plaats van de pionnen zit in de vector v: v[0] t/m v[4] bevatten (in oplopende volgorde) de positie van de pionnen op het veld:

Code: Selecteer alles

vak:   1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
r=1   v0 v1 v2 v3 v4
r=2   v0 v1 v2 v3    v4
r=3   v0 v1 v2    v3 v4
r=4   v0 v1    v2 v3 v4
r=5   v0    v1 v2 v3 v4
r=6      v0 v1 v2 v3 v4
r=7   v0 v1 v2 v3       v4
r=8   v0 v1 v2    v3    v4
...
r=53129                                                        v0    v1 v2 v3 v4
r=53130                                                           v0 v1 v2 v3 v4
Onderstaande code geeft deze output:

v = [1, 2, 3, 5, 7]
heeft rangnummer 8

rangnummer 5 geeft
v = [1, 3, 4, 5, 6]


Code: Selecteer alles

int comb[26][6];
int v[5];

// print vector v op beeldscherm:
void printv(void)
{
int i;

printf("v = [%d", v[0]);
for(i=1;i<5;i++)
	printf(", %3d",v[i]);
printf("]\n");
}

// zet rangnummer r om naar vector v:
void rangnummer2vector(int r)
{
int idx;
int c;

r--;
for(idx=4;idx>=0;idx--){
	v[idx]=idx+1;
	c = comb[v[idx]][idx+1];
	while(r>=c){
		v[idx]++;
		c = comb[v[idx]][idx+1];
		}
	r-=comb[v[idx]-1][idx+1];
	}
}

// zet vector v om naar rangnummer:
int vector2rangnummer(void)
{
int r=1;
int idx;

for(idx=0;idx<5;idx++)
	r += comb[v[idx]-1][idx+1];
return(r);
}

// combinatie <=> rangnummer demo:
void wf_pionnen(void)
{
int n,k,r;

// maak combinatietabel:
comb[0][0]=1;
for(k=1;k<6;k++)
	comb[0][k]=0;
for(n=1;n<26;n++){
	comb[n][0]=1;
	for(k=1;k<6;k++)
		comb[n][k] = comb[n-1][k-1] + comb[n-1][k];
	}

// voorbeeld 1: vector -> rangnummer
v[0]=1;
v[1]=2;
v[2]=3;
v[3]=5;
v[4]=7;
printv();
printf("heeft rangnummer %d\n\n", vector2rangnummer());

// voorbeeld 2: rangnummer -> vector
r=5;
rangnummer2vector(r);
printf("rangnummer %d geeft\n", r);
printv();
}

Whrothus
Nieuw lid
Nieuw lid
Berichten: 3
Lid geworden op: 13 dec 2015, 21:08

Re: Mogelijkheden van pionnen op een Veld

Bericht door Whrothus » 14 dec 2015, 21:05

mijn Excuses

De Volgende dingen zoek ik te vermijden
Een databank op te slaan met 823 727 520 waar telkens de indexers in zitten
Dan Zoek ik gewoon in de databank op de positie

en Alle voorliggende mogelijkheden te berekenen
telkens ik een bepaalde wil berekenen
Anders zou ik
Telkens laten rekenen eerst het eerste getal overeenkomt dan de volgende ...
Maar dat zou te lang duren (denk ik)

Code: Selecteer alles

 private void GenereerMogelijkeSpeelvelden(int MogelijkeVerplaatsvelden, int AantalPionen, int ActievePion, int ReedsGebruikteVerplaatsvelden)
{
    if (AantalPionen == ActievePion)
    {
          Counter++; // Deze Schrijf ik weg 
    }
    else
    {
         for (int i = 0; i < MogelijkeVerplaatsvelden - ReedsGebruikteVerplaatsvelden + 1; i++)
         {
          DezeMogelijkheid[ActievePion] = i;
          GenereerMogelijkeSpeelvelden(MogelijkeVerplaatsvelden, AantalPionen, ActievePion + 1,  
          ReedsGebruikteVerplaatsvelden + i);
          }
    }
}

David
Moderator
Moderator
Berichten: 4927
Lid geworden op: 14 mei 2009, 16:22

Re: Mogelijkheden van pionnen op een Veld

Bericht door David » 15 dec 2015, 12:26

Whrothus schreef:Van elke combinatie de rangnummer bepalen is uiteindelijk de bedoeling
De oplossing die arie je gaf helpt hierbij en vermijdt wat je noemt denk ik. Denk je van niet? Zo ja, hoezo?
Stap 1 van het oplossen van een probleem is te erkennen dat je een probleem hebt.
(Raffiek Torreman)

Plaats reactie