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
Optymalizacja
Idź do strony Poprzedni  1, 2, 3, 4  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ść
SzymonM




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

Ostrzeżeń: 0/5
Skąd: Buk

PostWysłany: Wto 11:21, 14 Gru 2010    Temat postu:

Nie no ogólnie to banał Very Happy przynajmniej ideowo. Ja mam takie pytanie czy była mowa na których miejscach mają się mutować kiepskie wyniki (to ma być wartość znowu losowa czy stała) i co z elementami podczas krzyżowania bo tam też jest index.

I jeszcze takie pytanie ktoś zapisywał może albo wie jak ma się odbywać rzutowanie z doubla na int i odwrotnie, tak żeby nie dochodziło do obcięcia mile widziana wersja dla c++ Wink .


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: Sob 18:08, 18 Gru 2010    Temat postu:

Moje wypociny.
jakoś mi zbyt szybko chodzil i dawal zbyt kiepskie wyniki
normalnie sprawdzam czy wynik poprawil sie o epsilon i jesli powrawil sie mniej to konczylem algorytm
teraz dalem mu trzy szanse: jesli trzy razy z kolei nie poprawil wyniku to koncze algorytm
i tak ma kiepskie wyniki

Kod:


package genetycznealg;

import java.util.Random;

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

    public static void main(String[] args) {
        System.out.println(znajdzMinimum());
        for(int j=0;j<xMin.length;j++)
            System.out.println("   " + xMin[j]);
    }

    static Random r = new Random();

    // mutowanie
    // losowanie jednego bitu i jego zamiana na pozycji index
    public static int M(int A, int index){
        //Random r = new Random();
        boolean random = r.nextBoolean();

        //return random ? (A | (1 << index)) : A & ~(1 << index) ;
        return random ? (A | (1 << index)) : A & (Integer.MAX_VALUE - (1 << index)) ;
    }

    // Krzyzowanie
    public static int K1(int A, int B, int index){
        if( (B & (1 << index))>0 )
              A |= (1 << index);
        else
              A &= (Integer.MAX_VALUE - (1 << index)) ;
        return A;
    }

    public static int K2(int A, int B, int index){
        return K1(B,A,index);
    }

    public final static int LICZBA_OSOBNIKOW_POCZATKOWA = 100000;
    public final static int WYMIAR_BADANCYH = 6;

    /**
     * alg gentyczny
     * 0. wylosuj populacje
     * 1. policzyc srednia
     * 2a. kiepskich mutowac
     * 2b. lepszych krzyzowac
     * 3. jesli nie ma poprawy to koncz
     * 4. jesli jest poprawa idz do kroku 1
     * @return
     */
    public static double znajdzMinimum(){
        double populacja[][] = wylosujPopulacje();
        double srednia = policzSrednia(populacja);
        double wynik = policzMin(populacja);
        do {
            zmutujSlabych(populacja,srednia,wynik);
            krzyzujLepszych(populacja,srednia,wynik);
            srednia = policzSrednia(populacja);
            wynik = policzMin(populacja);
        } while( saPostepy(wynik));
        return wynik;
    }

    public static double[][] wylosujPopulacje(){
        //Random r = new Random();
        double wynik[][] = new double[LICZBA_OSOBNIKOW_POCZATKOWA][WYMIAR_BADANCYH];
        for(int i=0;i<LICZBA_OSOBNIKOW_POCZATKOWA;i++)
            for(int j=0;j<WYMIAR_BADANCYH;j++)
                wynik[i][j] = r.nextDouble();
        return wynik;
    }

    public static double policzSrednia(double populacja[][]){
        double wynik = 0.0;
        for(int i=0;i<LICZBA_OSOBNIKOW_POCZATKOWA;i++)
                wynik+=czarnaSkrzynka(populacja[i]);
        wynik /= LICZBA_OSOBNIKOW_POCZATKOWA;
        return wynik;
    }

    static double xMin[] = null ;

    public static double policzMin(double populacja[][]){
        double wynik = Double.MAX_VALUE;
        if(xMin!=null)
            wynik = czarnaSkrzynka(xMin);
        for(int i=0;i<LICZBA_OSOBNIKOW_POCZATKOWA;i++){
            double nastepny = czarnaSkrzynka(populacja[i]);
            if(nastepny<wynik){
                wynik=nastepny;
                xMin = populacja[i].clone() ;
            }
        }
        return wynik;
    }

    private static void zmutujSlabych(double[][] populacja, double srednia, double wynik) {
        for(int i=0;i<LICZBA_OSOBNIKOW_POCZATKOWA;i++)
            if(czarnaSkrzynka(populacja[i])>srednia){
                zmutuj(populacja[i]);
            }
    }

    private static void zmutuj(double[] slaby) {
        for(int j=0;j<slaby.length;j++)
            slaby[j]=zmutuj(slaby[j]);
    }

    private static double zmutuj(double slaby) {
        return ((double)(M( (int)(slaby*Integer.MAX_VALUE),r.nextInt(Integer.SIZE)))) / ((double)Integer.MAX_VALUE);
    }

    private static void krzyzujLepszych(double[][] populacja, double srednia, double wynik) {
        boolean jedenJuzJest = false;
        double tenJeden[] = null;
        for(int i=0;i<LICZBA_OSOBNIKOW_POCZATKOWA;i++)
            if(czarnaSkrzynka(populacja[i])<srednia){
                if(jedenJuzJest){
                    krzyzuj(populacja[i],tenJeden,srednia,wynik);
                    jedenJuzJest = false;
                } else {
                    tenJeden = populacja[i];
                    jedenJuzJest = true;
                }
            }
    }

    private static void krzyzuj(double[] lepszy1, double[] lepszy2, double srednia, double wynik) {
        double wynikL1 = czarnaSkrzynka(lepszy1);
        double wynikL2 = czarnaSkrzynka(lepszy2);
        double ratio1 = Math.abs((wynikL1-wynik)/(srednia-wynik));
        double ratio2 = Math.abs((wynikL2-wynik)/(srednia-wynik));
        int bitMutacji = (int)Math.round(Integer.SIZE*((ratio1+ratio2)/2.0));
        krzyzuj(lepszy1,lepszy2,bitMutacji);
    }

    private static void krzyzuj(double[] lepszy1, double[] lepszy2, int bitMutacji) {
        double nowy1;
        double nowy2;
        for(int j=0;j<lepszy1.length;j++){
            nowy1=krzyzuj(lepszy1[j],lepszy2[j],bitMutacji);
            nowy2=krzyzuj(lepszy2[j],lepszy1[j],bitMutacji);
            lepszy1[j]=nowy1;
            lepszy2[j]=nowy2;
        }
    }

    private static double krzyzuj(double L1, double L2, int bitMutacji) {
        int iL1 = (int)(L1*Integer.MAX_VALUE);
        int iL2 = (int)(L2*Integer.MAX_VALUE);
        int iK = K1(iL1,iL2,bitMutacji);
        return ((double)iK)/((double)Integer.MAX_VALUE);
    }


    static double staryWynik = Double.MAX_VALUE;
    public static final double EPISLON = 1.0e-10;
    public static final int ILE_BEZ_POSTEPU = 10 ;
    public static int ileBezPostepu = ILE_BEZ_POSTEPU;

    public static boolean saPostepy(double nowyWynik){
        double roznica = Math.abs(nowyWynik-staryWynik);
        staryWynik = nowyWynik;
        if(roznica>EPISLON){
            ileBezPostepu = ILE_BEZ_POSTEPU;
        } else {
            ileBezPostepu--;
            return ileBezPostepu>=0;
        }
        return roznica>EPISLON;
    }

    public static double czarnaSkrzynka(double x[]){
        double wynik = 0.0;
        for(int j=0;j<x.length;j++)
            wynik+=x[j];
        return wynik ;
    }

}



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



Dołączył: 21 Lis 2007
Posty: 342
Przeczytał: 0 tematów

Pomógł: 2 razy
Ostrzeżeń: 0/5
Skąd: Elbląg

PostWysłany: Nie 12:26, 19 Gru 2010    Temat postu:

Rozwiązanie zadania, uogólnionej cośtam newtona. Nie ma tu kodu skrzynki, ale se poradzicie Wink

Napisane w C#

Kod:

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

namespace GdalaNewton
{
    class Program
    {
        const double EPSILON = 0.000001;
        protected FancySkrzynka box = new FancySkrzynka();

        public List<Double> results = new List<Double>();

        public int count = 0;

        static void Main(string[] args)
        {
            Program app = new Program();

            app.checkInterval(0, 1);

            Console.WriteLine(app.count);
            Console.ReadKey();
        }

        public void checkInterval(double leftPoint, double rightPoint)
        {
            this.count++;
            double leftValue = Math.Abs(this.box.value(leftPoint));
            double rightValue = Math.Abs(this.box.value(rightPoint));

            double length = Math.Abs(leftPoint - rightPoint);

            if (length < Program.EPSILON)
            {
                if (leftValue < Program.EPSILON)
                {

                    Console.WriteLine("Punkt: "+leftPoint+ " value: "+leftValue);
                }
                if (rightValue < Program.EPSILON)
                {
                    Console.WriteLine("Punkt: " + rightPoint + " value: " + rightValue);
                }
            }
            else
            {
                if (leftValue + rightValue > length)
                {
                    //odrzucamy
                    return;
                }
                else
                {
                    this.checkInterval(leftPoint, rightPoint - length / 2);
                    this.checkInterval(leftPoint + length / 2, rightPoint);
                }
            }
        }
    }
}



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




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

Ostrzeżeń: 0/5

PostWysłany: Nie 16:56, 19 Gru 2010    Temat postu:

Co było na 2 części ćwiczeń? Tzn po tym jak wyszedł na przerwę?

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: Pon 13:08, 20 Gru 2010    Temat postu:

Dzieki Wiedzmin,
Wrzuć prosze kody także zadania z pierwszych zajeć i zadania z drugich zajec, nie chce dowiedziec sie 09.01 ze moje rozwiazania sa zle.


//np. Moje rozwiazanie 2 zadania odrzucil po analizie pierwszych linijek kodu, bo populacje losowalem "w locie" wprowadzajac ja do tablicy, a nie odrebnym obiektem.


Post został pochwalony 0 razy

Ostatnio zmieniony przez zbychup dnia Pon 14:09, 20 Gru 2010, w całości zmieniany 2 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 21:16, 20 Gru 2010    Temat postu:

Czyli 2011.01.09 jest zaliczenie? O tej 14?

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: Wto 14:32, 21 Gru 2010    Temat postu:

tak.

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: Wto 16:04, 21 Gru 2010    Temat postu:

ma ktos może w pdf książkę:
"Optymalizacja
Wybrane metody z przykładami zastosowań"
Jan Kusiak, Anna Danielewska-Tułecka, Piotr Oprocha.
Albo skan stron rozdziałów fragmentów rozdziałów 4(metoda newtona) i 8(monte carlo i algorytmy genetyczne)?


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: Czw 20:01, 23 Gru 2010    Temat postu:

Metoda uogólniona Newtona w Javie

Kod:

package uogolniona_newtona;

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

    public static void main(String[] args) {
        SprawdzObszar(0.0,1.0);
    }

    static double czarnaSkrzynka(double x){
        return Math.abs(x-0.5)-1/(2*Math.sqrt(5));
    }

    static final double EPSILON = 0.00000001;

    private static void SprawdzObszar(double L, double P) {
        if( Math.abs(L-P)<EPSILON ){ // jesli obszar jest malutki
            if(Math.abs(czarnaSkrzynka(L))<EPSILON || Math.abs(czarnaSkrzynka(P))<EPSILON) // jesli wyniki sa wystarczajaco male
                dodajDobryObszar(L,P);
           }
        else
          if(Math.abs(czarnaSkrzynka(L))+Math.abs(czarnaSkrzynka(P))>P-L)
                return; // nie pasuje
            else { // rozbijamy obszar na dwa kawalki
                SprawdzObszar(     L   , (P+L)/2  );
                SprawdzObszar( (P+L)/2 ,     P    );
            }
    }

    private static void dodajDobryObszar(double L, double P) {
        System.out.println("Znaleziony x:" + L);
        System.out.println("Znaleziony f(x):" + czarnaSkrzynka(L));
    }

}


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: Czw 20:08, 23 Gru 2010    Temat postu:

metoda poprawiona uogólniona Newtona która bada jeden wektor z całej przestrzeni argumentów. Roznice w funkcjach
    czarnaSkrzynka zamienia x na wektory [x1,x2] i wywoluje FczarnaSkrzynka

    FczarnaSkrzynka oblicza wynik dla wektora

    dodajDobryObszar drukuje znaleziony wynik dopasowany do wektora


Kod:

package uogolniona_newtona;

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

    public static void main(String[] args) {
        SprawdzObszar(0.0,1.0);
    }

    static double czarnaSkrzynka(double x){
        return FczarnaSkrzynka(0.1+3.0/5.0*x,0.1+4.0/5.0*x);
    }

    private static double FczarnaSkrzynka(double x1, double x2) {
        if(x1<0.5)
            return x2-0.25;
        else
            return Math.sqrt((x1-0.5)*(x1-0.5)+x2*x2)-0.25;
    }

    static final double EPSILON = 0.00000001;

    private static void SprawdzObszar(double L, double P) {
        if( Math.abs(L-P)<EPSILON ){
            if(Math.abs(czarnaSkrzynka(L))<EPSILON || Math.abs(czarnaSkrzynka(P))<EPSILON)
                dodajDobryObszar(L,P);
           }
        else
            if(Math.abs(czarnaSkrzynka(L))+Math.abs(czarnaSkrzynka(P))>P-L)
                return; // nie pasuje
            else {
                SprawdzObszar(     L   , (P+L)/2  );
                SprawdzObszar( (P+L)/2 ,     P    );
            }
    }

    private static void dodajDobryObszar(double L, double P) {
        System.out.println("Znaleziony f(x):" + czarnaSkrzynka(L));
        System.out.println("Znaleziony x:" + (0.1+3.0/5.0*L) + "," + (0.1+4.0/5.0*L));
        System.out.println("Znaleziony t:" + L);
    }

}


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: Pon 21:41, 03 Sty 2011    Temat postu:

moze komus sie przyda :
[link widoczny dla zalogowanych]!download|653tl|235114398|Algorytmy_genetyczne_struktury_danych_programy_ewolucyjne_-_Z.Michalewicz.pdf|22173

powodzenia na kole


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: Czw 15:04, 06 Sty 2011    Temat postu:

Dzieki. a nie ma ktoś słynnej niebieskiej ksiązki z której Gdala czerpie inspiracje?

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 14:53, 10 Sty 2011    Temat postu:

Ktoś coś wie gdzie się znajduje to zadanie z kolokwium? Gdala mówił, że będzie na jego hołmpejdżu, ale niestety jest tam tylko znak '?'. Na contact.dirze w jego katalogu jest pusto, a na mailu też nic nie ma.

Ktoś coś wie?


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




Dołączył: 25 Lis 2007
Posty: 46
Przeczytał: 0 tematów

Pomógł: 2 razy
Ostrzeżeń: 0/5
Skąd: Poznań

PostWysłany: Pon 19:00, 10 Sty 2011    Temat postu:

Oj oj, nie słuchałeś uważnie Smile
Kod:
http://www.staff.amu.edu.pl/~tgdala/ZAD.zip


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 19:04, 10 Sty 2011    Temat postu:

Sprawdzałem 'zad' zamiast 'ZAD' Razz

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, 4  Następny
Strona 2 z 4

 
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