VB, POMOC!

pex35

Početnik
Poruka
44
Pisem neki programcic u vb2005 pa sam zaglavio oko kombinacija! Naime, ako imam niz nekih brojeva od n elemenata, treba mi funkcija koja ce da izvrti sve moguce kombinacije k elemenata tog niza (n<k). Uvek imam problem posto neku kombinaciju izostavi!!!!
Zahvaljujem unapred!!!
 
Metod grube sile je postavljanje n ugnježdenih for petlji (sad će bojan da vrisne zbog trošenja resursa).
Prva petlja ide od 1 do (k-n+1), druga od 2 do (k-n+2) ..., n-ta od n do (k-n+n) tj do k.
PHP:
for i1 = 1 to (k-n+1)
   for i2 = 2 to (k-n+2)
      for i3 = 3 to (k-n+3)
        ....
          for in = n to k
               'niz brojeva i1, i2, i3,..., in predstavlja jednu kombinaciju
               'ovdje ide prikaz kombinacije na način koji ti odgovara
          next in
        ....
      next i3
   next i2
next i1
 
Pisem neki programcic u vb2005 pa sam zaglavio oko kombinacija! Naime, ako imam niz nekih brojeva od n elemenata, treba mi funkcija koja ce da izvrti sve moguce kombinacije k elemenata tog niza (n<k). Uvek imam problem posto neku kombinaciju izostavi!!!!
Biće da ovde ima neke greške. Valjda imaš ukupno k elemenata i trebaju ti sve kombinacije n elemenata ili je (k < n).

@MasterYoda
Manje više resursi, ali problem s ovim rešenjem je što unapred mora da se zna broj elemenata kombinacije.
 
Ups, nisam ni primijetio ovu zamjenu simbola. U onim gornjim petljama treba zamijeniti simbole n i k.

@bojan da, naravno. Samo, oni koji traže da im se nekako pomogne trebali bi barem pitanje postaviti precizno. Neće im niko ukrasti neku blistavu ideju pa da kriju detalje.
 
Da, ok, zamenio sam n i k (k<n)!! Hvala!
Visual basic 2005 postoji, kao i Visual studio 2005! Ne odgovaraju mi ugnježdene petlje jer ne znam koliko su n i k! Ja sam nesto uradio, prilazem, ali se postavlja pitanje sta ako su elementi niza isti??? Nece vratiti sve kombinacije! Naravno, nista ne krijem, i ja sam tu da bih nekome pomogao, ako treba!!!

PHP:
Function sledKombinacija(ByVal n As Integer, ByRef k As Integer, ByVal komb() As Double, ByRef pomocniNiz() As Double) As Integer
        Dim l As Integer = k
        Dim x As Double
        Dim i, y As Integer


        Do While (l > 0 And komb(l) = pomocniNiz(n))
            l = l - 1
            n = n - 1
        Loop
        If (l < 1) Then
            Return 0
        End If

        x = komb(l)
        For i = 1 To n
            If pomocniNiz(i) = x Then
                y = i
            End If
        Next

        Do
            komb(l) = pomocniNiz(y + 1)
            y = y + 1
            l = l + 1
        Loop While l <= k
        Return 1

    End Function
 
Ne vraća sve kombinacije? Izvini, ali koliko mogu vidjeti onako na brzinu, ovo parče koda koje si dao ne vraća ništa.

I jedan savjet koji sam do sada dao mnogima: probaj izbjegavati malo slovo l u imenima. To je izvor čestih grešaka koje se teško otkrivaju.
 
Probaj,
ako je pomocniNiz niz sa od n elemenata, u nizu komb dobijam sve kombinacije od k elemenata, s tim da se pre toga niz komb napuni sa prvih k elemenata niza pomocniNiz!! Mozda zvuci malo komplikovano ali nije. I pomocu ove f-je u nizu komb dobijam sigurno sve kombinacije!!! Jedino dolazi do greske ako su elementi isti!! To sam resio tako sto sam sve iste elemente povecao za 0.00001 ali to nije lepo resenje pa sam zbog toga pitao da li neko zna neku bolju f-ju!
Hvala za savet!!! :razz:
 
MasterYoda:
A gdje si podacima napunio taj pomocniniz? Vidim deklaraciju niza, vidim da iz njega uzimaš elemente, ali ne vidim da si nešto u taj niz upisao.

OK, elementi niza se unose preko interfejsa, znaci, korisnik unosi koji sistem hoce (npr. 3/7) a zatim mu se otvara 7 text boxova gde unosi elemente (problem je jos i slozeniji, postoji vise sistema koji se kombinuju), ali to sam odradio. Ja pokupim ono sto je on uneo, u mom slucaju kvote (kladionicarski problem), smestim u pomocniNiz i racunam. Da bih izracunao ukupnu kvotu, moram imati kombinaciju svaka tri elementa od 7. Ostalo znas, jedini problem su iste kvote.
 
Zašto su jednake kvote problem? Ako su svih 7 kvota jednake onda su sve kombinacije od 3 elementa jednake, bar što se tiče vrednosti kvota, ali su one s matematičke tačke gledišta različite jer prva kombinaciju čine prvi, drugi i treći element, drugu prvi drugi i četvrti i tako dalje.
 
Nisam komentarisao kod, već problem. Da pojednostavim pitanje. Ako imaš sledeće elemente: (1, 1, 2, 3), da li su ti potrebne sve sledeće naveden kombinacije od dva elementa ili ne?

(1, 1) (1, 2) (2, 3)
(1, 2) (1, 3)
(1, 3)

Ovo je inače neuređeni izbor bez ponavljanja, bozirom da na osnovu postavke problema ureženi izbor nema smisla, a ni ponavljanje nije dozvoljeno.
 
Evo klase u Java programskom jeziku koja radi tačno to što ti treba.
Kod:
//--------------------------------------
// Systematically generate combinations.
//--------------------------------------

import java.math.BigInteger;

public class CombinationGenerator {

  private int[] a;
  private int n;
  private int r;
  private BigInteger numLeft;
  private BigInteger total;

  //------------
  // Constructor
  //------------

  public CombinationGenerator (int n, int r) {
    if (r > n) {
      throw new IllegalArgumentException ();
    }
    if (n < 1) {
      throw new IllegalArgumentException ();
    }
    this.n = n;
    this.r = r;
    a = new int[r];
    BigInteger nFact = getFactorial (n);
    BigInteger rFact = getFactorial (r);
    BigInteger nminusrFact = getFactorial (n - r);
    total = nFact.divide (rFact.multiply (nminusrFact));
    reset ();
  }

  //------
  // Reset
  //------

  public void reset () {
    for (int i = 0; i < a.length; i++) {
      a[i] = i;
    }
    numLeft = new BigInteger (total.toString ());
  }

  //------------------------------------------------
  // Return number of combinations not yet generated
  //------------------------------------------------

  public BigInteger getNumLeft () {
    return numLeft;
  }

  //-----------------------------
  // Are there more combinations?
  //-----------------------------

  public boolean hasMore () {
    return numLeft.compareTo (BigInteger.ZERO) == 1;
  }

  //------------------------------------
  // Return total number of combinations
  //------------------------------------

  public BigInteger getTotal () {
    return total;
  }

  //------------------
  // Compute factorial
  //------------------

  private static BigInteger getFactorial (int n) {
    BigInteger fact = BigInteger.ONE;
    for (int i = n; i > 1; i--) {
      fact = fact.multiply (new BigInteger (Integer.toString (i)));
    }
    return fact;
  }

  //--------------------------------------------------------
  // Generate next combination (algorithm from Rosen p. 286)
  //--------------------------------------------------------

  public int[] getNext () {

    if (numLeft.equals (total)) {
      numLeft = numLeft.subtract (BigInteger.ONE);
      return a;
    }

    int i = r - 1;
    while (a[i] == n - r + i) {
      i--;
    }
    a[i] = a[i] + 1;
    for (int j = i + 1; j < r; j++) {
      a[j] = a[i] + j - i;
    }

    numLeft = numLeft.subtract (BigInteger.ONE);
    return a;

  }
}
[/i]
Ne bi trebalo da imaš neki problem da algoritam dat u metodi getNext
napišeš u VB-u.
 

Back
Top