Forum www.zinfa.fora.pl Strona Główna
FAQ Szukaj Użytkownicy Grupy Profil Zaloguj się, by sprawdzić wiadomości
Forum www.zinfa.fora.pl Strona Główna  Zaloguj  Rejestracja
algorytmy kombinatoryczne
Idź do strony Poprzedni  1, 2, 3  Następny
 
Napisz nowy temat   Odpowiedz do tematu    Forum www.zinfa.fora.pl Strona Główna -> Rok IV / Opracowania, pomoce IV
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
zbychup




Dołączył: 17 Paź 2010
Posty: 130
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Nie 10:14, 22 Maj 2011    Temat postu:

wygenerowac w porzadku antyleksykograficznycm wszystkie ciagi dlugosci k zbudowane z liczb od 1 do n

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
zbychup




Dołączył: 17 Paź 2010
Posty: 130
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Nie 10:15, 22 Maj 2011    Temat postu:

jak macie rozwiazania powyzszych zadan wrzucajcie.

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
emil_seba




Dołączył: 22 Lis 2007
Posty: 109
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Nie 10:18, 22 Maj 2011    Temat postu:

porzadek antyleksykograficzny ciagi dlugosci k
Kod:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;




namespace kombinatoryka
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Podaj dlugośc ciagu>>");
            int k = int.Parse(Console.ReadLine());
            Console.WriteLine("Podaj element maksymalny zbioru>> ");
            int n = int.Parse(Console.ReadLine());
            int[] ciag = new int[k];
            int indeks;
            for (int i = 0; i < ciag.Length; i++)
                ciag[i] = 1;
           
         

           
            do
            {
                indeks = 0;
           
                Console.Write("[");
                for (int i = 0; i < k; i++)
                    Console.Write(" {0}", ciag[i]);
                Console.WriteLine(" ]");

                while ((indeks < ciag.Length) && (ciag[indeks] == n))
                {
                    ciag[indeks] = 1;
                    indeks++;
                }
                if (indeks < ciag.Length)
                    ciag[indeks]++;
            } while (indeks < ciag.Length);
       
            Console.ReadKey();
        }
    }
}
[/code]

Post został pochwalony 0 razy

Ostatnio zmieniony przez emil_seba dnia Nie 10:18, 22 Maj 2011, w całości zmieniany 1 raz
Powrót do góry
Zobacz profil autora
Autor Wiadomość
nadroj




Dołączył: 23 Paź 2010
Posty: 14
Przeczytał: 0 tematów

Ostrzeżeń: 0/5

PostWysłany: Nie 10:21, 22 Maj 2011    Temat postu:

Kod:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#Tomasz Nowacki

# wygenerowac wszystkie ciagi dlugosci k zbudowane z liczb
# naturalnych, w ktorych i-ty wyraz jest <= i dla wszystkich
# i = 1,2,...,k


help_txt = """help text
"""

def validate_int(n):
    try:
        return int(n)
    except ValueError:
        raise Exception('%s jest niepoprawna wartocia liczbowa' % n)

def gen(k):
   x = [1, ] * k
   while True:
      yield x
      i = k-1
      while i >= 0:
         if x[i] <= i:
            x[i] = x[i] + 1
            break
         else:
            if i == 0:
               return
            else:
               for j in range(i, k):
                  x[j] = 1
         i = i-1

def main():
    k = raw_input('Podaj k: ')
    try:
        k = validate_int(k)
        for i in gen(k):
            print i
    except Exception, e:
        print e
       

if __name__ == '__main__':
    main()


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
zbychup




Dołączył: 17 Paź 2010
Posty: 130
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Nie 10:27, 22 Maj 2011    Temat postu:

a tego nikt nie ma? wygenerować w porządku leksykograficznym k-elementowe podzbiory zbioru {1,2,..n}.

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
armo




Dołączył: 14 Paź 2010
Posty: 40
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Nie 10:27, 22 Maj 2011    Temat postu: Re: algorytmy kombinatoryczne - podzbiory leksykograficznie

Kod:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package zad20110522zestaw7zad1wszystkiepodzbioryleksykograficznie;

/**
 *
 * @author amanko
 */
public class WszystkiePodzbioryLeksykograficznie {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        int k = 6; // długośc podzbiorów
        int n = 3; // maksymalna wartość elementu ciągu

        if(args.length!=2){
            System.err.println("Powinny byc dokładnie dwa argumenty - liczby całkowite");
            System.exit(1);
        }
        try{
            k = Integer.parseInt(args[0]) ;
            n = Integer.parseInt(args[1]) ;
        }catch(IndexOutOfBoundsException e){
            System.err.println("Powinny być dwa argumenty - liczby całkowite");
            System.err.println("Argumenty: k n");
        }catch(NumberFormatException e){
            System.err.println("Argumenty powinny być liczbami całkowitymi");
            System.err.println("Argumenty: k n");
        }

        int[] zbior = new int[n+1];
        for(int i=1;i<=k;i++)
            zbior[i]=1;
        int i=n;
        while(i>0){
            drukuj(zbior);
            i=n;
            while((i>0) && (zbior[i]==0))
                i--;
            if(i<n){
                zbior[i]=0;
                zbior[i+1]=1;
            } else {
                while((i>0) && (zbior[i]==1))
                    i--;
                int ileJedynek = n-i;
                while((i>0) && (zbior[i]==0))
                    i--;
                if(i>0){
                    zbior[i++]=0;
                    zbior[i++]=1;
                    while(ileJedynek-->0)
                        zbior[i++]=1;
                    while(i<=n)
                        zbior[i++]=0;
                }

            }

        }

    }

    static void drukuj(int[] zbior){
        System.out.print("{");
        boolean pierwszy = true;
        for(int i=0;i<zbior.length;i++)
            if(zbior[i]==1){
                if(!pierwszy)
                    System.out.print(",");
                pierwszy = false;
                System.out.print(i);
            }
        System.out.println("}");
    }

}



Post został pochwalony 0 razy

Ostatnio zmieniony przez armo dnia Nie 10:27, 22 Maj 2011, w całości zmieniany 1 raz
Powrót do góry
Zobacz profil autora
Autor Wiadomość
nadroj




Dołączył: 23 Paź 2010
Posty: 14
Przeczytał: 0 tematów

Ostrzeżeń: 0/5

PostWysłany: Nie 10:37, 22 Maj 2011    Temat postu:

moze sie przydac:

[link widoczny dla zalogowanych]


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
zbychup




Dołączył: 17 Paź 2010
Posty: 130
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Nie 11:01, 22 Maj 2011    Temat postu:

Dear Armo Wink
Wrzucisz pozostałe 2?


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
armo




Dołączył: 14 Paź 2010
Posty: 40
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Nie 11:01, 22 Maj 2011    Temat postu: WszystkiePodciagiAntyleksykograficznie

Kod:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package zwspui1zad20110522zestaw7zad2wszystkiepodciagiantyleksykograficznie;

import java.util.Arrays;

/**
 *
 * @author amanko
 */
public class WszystkiePodciagiAntyleksykograficznie {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int k = 6; // długośc ciągów
        int n = 3; // maksymalna wartość elementu ciągu

        if(args.length!=2){
            System.err.println("Powinny byc dokładnie dwa argumenty - liczby całkowite");
            System.exit(1);
        }
        try{
            k = Integer.parseInt(args[0]) ;
            n = Integer.parseInt(args[1]) ;
        }catch(IndexOutOfBoundsException e){
            System.err.println("Powinny być dwa argumenty - liczby całkowite");
            System.err.println("Argumenty: k n");
        }catch(NumberFormatException e){
            System.err.println("Argumenty powinny być liczbami całkowitymi");
            System.err.println("Argumenty: k n");
        }

        int ciag[] = new int[k]; // kolejny ciąg do drukowania
        int iW; // indeks w ciągu poszukiwany do zwiększenia wartości

        Arrays.fill(ciag, 1);

        do{
            //System.out.println(Arrays.toString(ciag));
            drukujOdwrotnie(ciag);
            iW = k-1;
            while( (iW>=0) && (ciag[iW]==n) ){
                ciag[iW]=1;
                iW--;
            }
            if(iW>=0)
                ciag[iW]++;
        }while(iW>=0);
    }

    static void drukujOdwrotnie(int[] ciag){
        System.out.print("[");
        for(int i=ciag.length-1;i>=0;i--){
            if(i<ciag.length-1)
                System.out.print(",");
            System.out.print(ciag[i]);
        }
        System.out.println("]");
    }

}



Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
armo




Dołączył: 14 Paź 2010
Posty: 40
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Nie 11:02, 22 Maj 2011    Temat postu: SpecyficznePodciagi

Kod:


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package zwspui1zad20110522zestaw7zad3specyficznepodciagi;

import java.util.Arrays;

/**
 *
 * @author amanko
 */
public class SpecyficznePodciagi {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int k = 6; // długośc ciągów

        if(args.length!=1){
            System.err.println("Powinien byc dokładnie jeden argument - liczba całkowita");
            System.exit(1);
        }
        try{
            k = Integer.parseInt(args[0]) ;
        }catch(IndexOutOfBoundsException e){
            System.err.println("Powinien byc dokładnie jeden argument - liczba całkowita");
            System.err.println("Argument: k");
        }catch(NumberFormatException e){
            System.err.println("Powinien byc dokładnie jeden argument - liczba całkowita");
            System.err.println("Argument: k");
        }

        int ciag[] = new int[k]; // kolejny ciąg do drukowania
        int iW; // indeks w ciągu poszukiwany do zwiększenia wartości

        Arrays.fill(ciag, 1);

        do{
            System.out.println(Arrays.toString(ciag));
            iW = k-1;
            //while( (iW>=0) && (ciag[iW]==n) ){
            while( (iW>=0) && (ciag[iW]>iW) ){
                ciag[iW]=1;
                iW--;
            }
            if(iW>=0)
                ciag[iW]++;
        }while(iW>=0);
    }

}




Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
Rind




Dołączył: 24 Wrz 2010
Posty: 74
Przeczytał: 0 tematów

Pomógł: 3 razy
Ostrzeżeń: 0/5

PostWysłany: Pon 10:45, 23 Maj 2011    Temat postu:

Wszystkie moje:
a) Ciągi długości "K" rekurencyjnie
Kod:

def start(n, k)
    @n = n.to_i
    @k = k.to_i

    @t = -1

    @x = []
    @k.times do
        @x << 0
    end
    gen(@n, @k)
end

def gen(n, k)
    @t += 1
    1.upto(n) do |i|
        @x[@t] = i
        if @t == k - 1
            p @x
        else
            gen(@n, @k)
        end
    end
    @t -= 1
end

start(ARGV[0], ARGV[1])


b) Ciągi długości K z liczb N, w których i-ty wyraz jest <= i
Kod:

def start(n, k)
    @n = n.to_i
    @k = k.to_i

    @t = -1

    @x = []
    @k.times do
        @x << 0
    end
    gen(@n, @k)
end

def gen(n, k)
    @t += 1
    1.upto(@t + 1) do |i|
        @x[@t] = i
        if @t == k - 1
            p @x
        else
            gen(@n, @k)
        end
    end
    @t -= 1
end

start(ARGV[0], ARGV[1])


c) Generowanie ciągów dł 'k' ze zbioru (1..n) iteracyjnie, antyleksykograficznie
Kod:

def ciag(n, k)
  # konwersja String -> Integer
  n = n.to_i
  k = k.to_i

  # generujemy tablice o dlugosci k, skladajaca sie z samych jedynek
  tab = []

  k.times do
    tab << 1
  end

  # wykonuje petle
  loop do
    # drukuje aktualna tablice
    p tab

    index = 0

    while index < k && tab[index] == n
      tab[index] = 1
      index += 1
    end

    if index >= k
      return
    else
      tab[index] += 1
    end
  end
end


ciag(ARGV[0], ARGV[1])

d) Generowanie k-elementowych podzbiorów
Kod:

def podzbiory(k, n)
    k = k.to_i
    n = n.to_i

    tab = []
    ## pierwszy element jest podzbiorem [1, 2, ..., k]
    k.times do |i|
        tab << i + 1
    end

    ## najwiekszy element na pozycji 'i'-tej wynosi (n - k + 1)
    ## znajdz 1-sza pozycje t[i] od prawej strony NIEzawierajacej najwiekszego mozliwego elementu
    ## zwieksz t[i] = 1
    ## przypisz elementom lezacym na prawo od t[i] (t[i+1] + 1, t[i + 2] + t[i + 1] + 1 itp)

    loop do
        znaleziony = -1
        p tab

        index = k - 1
        index.downto(0) do |i|
            najwiekszy = n - k + (i + 1)
            if najwiekszy != tab[i]
                znaleziony = i
                break
            end
        end

        if znaleziony == -1
            break
        end

        tab[znaleziony] += 1

        (znaleziony + 1).upto(k - 1) do |j|
            tab[j] = tab[znaleziony] + (j - znaleziony)
        end
    end
end

podzbiory(ARGV[0], ARGV[1])



Wiem, że już dawno po zajęciach, ale może komuś się przyda


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
zbychup




Dołączył: 17 Paź 2010
Posty: 130
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Nie 10:06, 12 Cze 2011    Temat postu:

Proponuje tradycyjnie już wrzucać rozwiązania na forum :]
Z góry dzięki.


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
Mateo




Dołączył: 23 Lis 2007
Posty: 10
Przeczytał: 0 tematów

Ostrzeżeń: 0/5

PostWysłany: Nie 10:10, 12 Cze 2011    Temat postu: Permutacja w kolejności leksykograficznej

/* Permutacje, algorytm Dijkstry
* Sebastian Pawlak, 1999
*/
#include <stdio.h>

void permutacja(int t[], int max);
void wypisz(int t[], int max);

int main(void)
{
#define MAX 3
int t[MAX] = { 1, 2, 3 };
int i, j;

wypisz(t, MAX);
for (i = 0; i < 1 * 2 * 3 - 1; i++) { /* i < n! - 1 */
permutacja(t, MAX);
wypisz(t, MAX);
}

return 0;
}


/* permutacja: generuje nastepnik permutacyjny dla zadanego szeregu liczb
*/
void permutacja(int t[], int max)
{
int i, j, k;

if (max < 2)
return;

/* wyznaczanie pierwszego od prawej elementu
* mniejszego niz jego sasiad z prawej strony
*/
i = max - 1;
while ((i > 0) && (t[i - 1] >= t[i]))
i--;

/* wyznaczanie elementu wiekszego od znalezionego */
if (i > 0) {
j = max;
while ((j > 0) &&(t[j - 1] <= t[i - 1]))
j--;
}

/* zamiana miejscami dwoch znalezionych wyzej elementow */
if ((i > 0) && (j > 0)) {
k = t[i - 1];
t[i - 1] = t[j - 1];
t[j - 1] = k;
}

/* odbicie lustrzane szeregu elementow od indeksu i+1 do konca tablicy */
for (i++, j = max; i < j; i++, j--) {
k = t[i - 1];
t[i - 1] = t[j - 1];
t[j - 1] = k;
}
}


/* wypisz: wypisuje zawartosc tablicy
*/
void wypisz(int t[], int max)
{
int i;

for (i = 0; i < max; i++)
printf("%d%c", t[i], (i < max - 1) ? ' ' : '\n');
}


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
armo




Dołączył: 14 Paź 2010
Posty: 40
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Nie 10:42, 12 Cze 2011    Temat postu: GenerujPermutacje

Kod:

package zwspui1_20110612_generujpermutacje;

import java.util.Arrays;

/**
 *
 * @author amanko
 */
public class GenerujPermutacje {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        int k = -1; // długośc ciągów

        if(args.length!=1){
            System.err.println("Powinien byc dokładnie jeden argument - liczba całkowita");
            System.exit(1);
        }
        try{
            k = Integer.parseInt(args[0]) ;
        }catch(IndexOutOfBoundsException e){
            System.err.println("Powinien byc dokładnie jeden argument - liczba całkowita");
            System.err.println("Argument: k");
        }catch(NumberFormatException e){
            System.err.println("Powinien byc dokładnie jeden argument - liczba całkowita");
            System.err.println("Argument: k");
        }

        int ciag[] = new int[k];

        for(int i=0;i<k;i++)
            ciag[i]=i+1;

        do
            System.out.println(Arrays.toString(ciag));
        while( (ciag = nastepnaPermutacja(ciag)) != null);
                   
    }

    private static int[] nastepnaPermutacja(int[] ciag) {
        int i;
        for(i=ciag.length-1;(i>0)&&(ciag[i-1]>ciag[i]);)
            i--;
        if(i==0)
            return null;
        i--;
        int j = -1;
        int minJ = ciag.length+1;
        for(int k=i+1;k<ciag.length;k++)
            if((ciag[k]>ciag[i])&&(ciag[k]<minJ)){
                j = k ;
                minJ = ciag[j];
            }
        // odwroc P[i] z P[j]

        ciag[j] = ciag[i];
        ciag[i] = minJ;
        // odwracamy ciag p[i+1],...,p[n]
        int k=ciag.length-1;
        for( j=i+1 ; j<k ; j++,k--){
            minJ = ciag[j];
            ciag[j]  = ciag[k];
            ciag[k] = minJ;
        }
        return ciag;
    }

}



Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
nadroj




Dołączył: 23 Paź 2010
Posty: 14
Przeczytał: 0 tematów

Ostrzeżeń: 0/5

PostWysłany: Nie 11:10, 12 Cze 2011    Temat postu:

Generowanie permutacji w pythonie
Kod:

#!/usr/bin/env python
## -*- coding: utf-8 -*-

# Tomasz Nowacki

# generowanie permutacji

def nastepnik(P):
    i = len(P)-2
    while P[i] > P[i+1]:
        i = i - 1
        if i == -1:
            return
    m = i+1
    for j in xrange(i+1, len(P)):
        if P[m] > P[j] > P[i]:
            m = j
    P[i], P[m] = P[m], P[i]
    head, tail = P[:i+1], P[i+1:]
    tail.reverse()
    return head + tail

def generuj_permutacje(n):
    if n < 1:
        raise ValueError('n musi byc > 1')
    P = range(1, n+1)
    yield P
    while True and n > 1:
        P = nastepnik(P)
        if P == None: break
        yield P

def main():
    try:
        n = int(raw_input('Podaj n: '))
        for p in generuj_permutacje(n):
            print p
    except ValueError, e:
        print e

if __name__ == '__main__':
    main()



enjoy!


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum www.zinfa.fora.pl Strona Główna -> Rok IV / Opracowania, pomoce IV Wszystkie czasy w strefie CET (Europa)
Idź do strony Poprzedni  1, 2, 3  Następny
Strona 2 z 3

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2002 phpBB Group
BBTech Template by © 2003-04 MDesign
Regulamin