Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von egrath
Thema: Roulette Wheel Selection Algorithm
Am im Forum: .NET-Komponenten und C#-Snippets

Hallo,

da ich mich gerade mit genetischen Algorithmen beschäftige, ist dabei ein netter Algorithmus abgefallen:

Roulette Wheel Selection

  • Eine mit Objekten gefüllte Liste, wobei jedem Eintrag ein bestimmter Fitness Score zugewiesen ist
  • Wenn man sich nun ein Objekt zurückgeben lässt, so wird wahrscheinlich jenes genommen welches den höchsten Fitness Score hat (Die wahrscheinlichkeit ist proportional zu seinem Score)

Siehe: http://en.wikipedia.org/wiki/Fitness_proportionate_selection


/*
 * Roulette Wheel Algorithm (aka Fitness proportionate selection)
 * See: [URL]http://en.wikipedia.org/wiki/Fitness_proportionate_selection[/URL]
 * 
 * March 2008 Egon A. Rath 
 *
 */

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

namespace egrath.tools.algo
{
	public class RouletteWheelSelection<T>
	{
		private List<RouletteItem> m_Items;
		private Random m_RandomGenerator = new Random();

		public RouletteWheelSelection()
		{
			m_Items = new List<RouletteItem>();
		}

        /// <summary>
        /// Adds a new Item to the Wheel
        /// </summary>
        /// <param name="item"></param>
        /// <param name="score"></param>
		public void Add( T item, double score )
		{
			m_Items.Add( new RouletteItem( item, m_Items.Count == 0 ? 0 : m_Items[m_Items.Count-1].TotalScore + score, score ));
		}

        /// <summary>
        /// Returns a Item according to the Roulette Wheel Algorithm
        /// </summary>
        /// <returns>Selected Item</returns>
		public T GetItem( bool remove )
		{
            if( m_Items.Count == 0 )
                return default( T );

			int select = m_RandomGenerator.Next(( int ) m_Items[m_Items.Count-1].TotalScore );
			for( int index = 0; index < m_Items.Count; index ++ )
			{
                double lowerLimit = 0;
                if( index > 0 )
                    lowerLimit = m_Items[index-1].TotalScore;

                double upperLimit = m_Items[index].TotalScore;

				if( select ≥ lowerLimit && select ≤ upperLimit )
                {
                    T item = m_Items[index].Item;
                    if( remove )
                    {
                        RemoveItem( index );
                    }

					return item;
                }
			}

			throw( new Exception( "RouletteWheelSelection internal error!" ));
        }

        /// <summary>
        /// Number of Items contained within the Wheel
        /// </summary>
        public int NumItems
        {
            get { return m_Items.Count; }
        }

        /// <summary>
        /// Internal usage: Removes the Item at the specified index from the Wheel
        /// </summary>
        /// <param name="index"></param>
        private void RemoveItem( int index )
        {
            double baseScore = m_Items[index].TotalScore - m_Items[index].ItemScore;
            m_Items.RemoveAt( index );
            for( int i = index; i < m_Items.Count; i ++ )
            {
                m_Items[index].TotalScore = baseScore + m_Items[index].ItemScore;
                baseScore = m_Items[index].TotalScore;
            }
        }

#if DEBUG
        public void DumpProbability()
        {
            double total = m_Items[m_Items.Count-1].TotalScore;

            foreach( RouletteItem item in m_Items )
            {
                Console.Out.WriteLine( "Item: [{0}], Score = {1}, Probability = {2:F4}%",
                    item.Item,
                    item.ItemScore,
                    ( 100 / total ) * item.ItemScore );
            }
        }
#endif

        #region Roulette Item
        private class RouletteItem
		{
			private T m_Item;
            private double m_ItemScore;
			private double m_TotalScore;

			public RouletteItem( T item, double score, double itemScore )
			{
				Item = item;
				TotalScore = score;
                ItemScore = itemScore;
			}

			public T Item
			{
				get
				{
					return m_Item;
				}

				set
				{
					m_Item = value;
				}
			}

            public double ItemScore
            {
                get
                {
                    return m_ItemScore;
                }

                set
                {
                    m_ItemScore = value;
                }
            }

			public double TotalScore
			{
				get
				{
					return m_TotalScore;
				}

				set
				{
					m_TotalScore = value;
				}
			}
        }
        #endregion
    }

	public class RouletteTest
	{
		public static void Main( string[] args )
		{
			RouletteWheelSelection<string> rws = new RouletteWheelSelection<string>();

            char[] c = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
                                    'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
            Random rnd = new Random();
            for( int cnt = 0; cnt < c.Length; cnt ++ )
            {
                rws.Add( new string( c[cnt], 10 ), cnt+1 );
            }

#if DEBUG
            rws.DumpProbability();
#endif

			for( int i = 0; i < 30; i ++ )
            {                
                string item = rws.GetItem( false );
                if( item != default( string ))
				    Console.Out.WriteLine( item );
                else
                {
                    Console.Out.WriteLine( "No more items!" );
                    break;
                }
            }
		}
	}
}

Vielleicht kanns ja jemand ausser mir brauchen ;-)

Grüsse,
Egon

Thema: Quellen zum Thema: virtuellen PC erstellen
Am im Forum: Buchempfehlungen

Hallo,

such mal nach "Emulator Programming" in der Suchmaschine deine Wahl und Du wirst fündig werden.

Grüsse,
Egon

Thema: Kommunikation MFC mit .Net
Am im Forum: Netzwerktechnologien

Hallo,

wenn die Applikation in C++ geschrieben ist und du die möglichkeit hast, diese für .NET zu übersetzen (/cli), dann: Remoting

ansonsten gibt es einige Wege:

  • Native Socket Kommunikation
  • CORBA (nicht in .NET direkt enthalten; 3rd Party)

Grüsse,
Egon

Thema: probleme mit variablen (anfänger)
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

auch wenn Du es vielleicht nicht hören willst - aber das hier ist am besten:

:obvc:

Es mangelt an grundlegendem. Arbeite das Buch durch, dann hast Du ein solides Basiswissen mit dem Du dann was bewerkstelligen kannst.

Grüsse,
Egon

Thema: SFTP Fingerprint, was passiert dabei???
Am im Forum: Netzwerktechnologien

Hallo,

du musst von der Klasse Sftp erben und dann selbst die Config setzen (m_session.setConfig). Der übergibst Du eine Hashtable mit:


Hashtable configTable = new Hashtable();
configTable.Add( "StrictHostKeyChecking", "no" );

Dann gehts.

Grüsse,
Egon

Thema: SFTP Fingerprint, was passiert dabei???
Am im Forum: Netzwerktechnologien

Hallo,

das kommt daher dass Du dich zum ersten mal auf den Server verbindest und der HostKey deinem Rechner noch nicht bekannt ist. Dafür gibts zwei Lösungen:

1.) Den Host über das known_hosts File bekannt machen (SetKnownHosts oä)
2.) Die Option StrictHostKeyChecking ausschalten (wäre einfacher)

Leider kann ich dir nicht genau sagen wie das in der API genau ausschat, da es schon ziemlich lange her ist dass ich damit was gemacht hab und auch nicht zuhause bin um nachzusehen.

Grüsse,
Egon

Thema: [erledigt] Problem mit Koordinate auf einer Geraden
Am im Forum: Rund um die Programmierung

Hallo,

hast Du dir folgendes Snippet schon angesehen:

[Snippet] Berechnung von Punkten einer Geraden

Grüsse,
Egon

Thema: leerzeichen wegschneiden in ganzem String
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

die Replace Methode kann genauso gut mit Leerzeichen umgehen:


using System;
using System.Diagnostics;

public class Test
{
        public static void Main( string[] args )
        {
                string str = "Das ist ein Test";
                Console.Out.WriteLine( str.Replace( @" ", String.Empty ));
        }
}

Grüsse,
Egon

Thema: VS2008 - My Places customizen?
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo,

wenn Du den My Places Bereich im File Open/Save Dialog meinst, den kannst du mit TweakUI anpassen.

Grüsse,
Egon

Thema: Linux-Shell # Verzeichnis der Datei
Am im Forum: Rund um die Programmierung

Hallo,


dirname /tmp/test.txt

ergibt: /tmp

Im Shell Script kannst Du also z.B. das machen:

FPATH=`dirname /tmp/test.txt`

damit hast du dann den Pfad in der Variable FPATH drinnen.

Grüsse,
Egon

Thema: Byte Array in Hex Format konvertieren
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

ich glaube er meint so etwas wie das:


byte[] ba = new byte[] { 0x43, 0x48, 0xBF, 0xCE, 0xDF, 0x82 };
StringBuilder sb = new StringBuilder();
foreach( byte b in ba )
    sb.Append( String.Format( "{0:X2}", b ));
		
Console.Out.WriteLine( sb.ToString() );

Grüsse,
Egon

Thema: Kleine Code-Rätsel für Zwischendurch
Am im Forum: Smalltalk

Hallo Herbivore,

danke für die Information!

(Ich komm mir grad irgendwie so vor: Kinners seit jetzt ruhig, Papa is da und erklärt euch jetzt mal wie das geht)

Grüsse,
Egon

Thema: Kleine Code-Rätsel für Zwischendurch
Am im Forum: Smalltalk

Zitat von Golo Roden
Preisfrage ist nun, wieso die Leerstellen an dieser Stelle für den Compiler wichtig sind, ich dachte immer, die wären in C# egal?!?

... weils im ECMA-334 so spezifiziert ist ;-)

Grüsse,
Egon

Thema: Kleine Code-Rätsel für Zwischendurch
Am im Forum: Smalltalk

Hallo Golo,

das ja mal interessant. Hab folgenden Code:


using System;
using System.Diagnostics;

public class Test
{
        public static void Main( string[] args )
        {
                int i = 3;
                i = i+++++i;
                Console.Out.WriteLine( i );
        }
}

weder der 2.0.50727, 3.5 noch der 1.9er gmcs (Mono) frisst den Code. Welche Compilerversion benutzt du genau?

Grüsse,
Egon

Thema: Kleine Code-Rätsel für Zwischendurch
Am im Forum: Smalltalk

C#:


test.cs(9,24): error CS1059: The operand of an increment or decrement operator must be a variable, property or indexer

Java:

test.java:8: unexpected type
required: variable
found   : value
                i = i+++++i;
                     ^
test.java:8: operator + cannot be applied to <any>,int
                i = i+++++i;
                       ^
test.java:8: incompatible types
found   : <nulltype>
required: int
                i = i+++++i;
                         ^
3 errors

C:

test.c:6: error: invalid lvalue in increment

Na rück schon raus, welche Sprache isses (das ist hier die eigentliche Frage ^^) ;-)

Grüsse,
Egon

Thema: Kleine Code-Rätsel für Zwischendurch
Am im Forum: Smalltalk

Zitat von Golo Roden
Mein Lieblingsbeispiel, warum Klammern und Kommentare eben DOCH wichtig sind ;-):

++i+++++i++;

Hallo Golo,

in welcher Sprache ist das gültiger Syntax? Habs mit C# und C getestet und weder als Ausdruck noch als rhs Value ist das gültig ;-)

Danke und Grüsse,
Egon

Thema: CVS / SVN einrichten sowie MonoDevelop Add-In für CVS?
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo,

  • Das Problem kenn ich nur wenn das Directory in das Du auscheckst auf einem Filesystem liegt, welches die entsprechenden Berechtigungsstrukturen nicht kenn (z.B. ein über Samba gemounteter Windows Share) oder eine externe Festplatte mit FAT32 oder NTFS.
  • Das CVS Add-In für MonoDevelop ist noch in der entwicklung. zzt. wird nur Subversion unterstützt, das CVS soll später folgen (steht schon auf der Roadmap als ToDo)

Grüsse,
Egon

Thema: Eigene Windows Recovery-CD erstellen
Am im Forum: Smalltalk

Hallo,

um eine eigene, angepasste Windows XP CD zu erstellen willst du nlite nehmen.

Grüsse,
Egon

Thema: Wie "backupt" ihr eure Daten?
Am im Forum: Smalltalk

Hallo,

da ich relativ faul in dem Bereich bin (DVD einlegen, Bänder wechseln, etc.) mach ich es folgendermassen:

Beim runterfahren des Rechners wird über ein Script eine kleine Applikation (was selbstgeschriebenes: JoboCoyp) angeworfen, was alle Daten mit einem Zielverzeichnis synchronisiert - dieses liegt auf einer externen Platte.

Somit hab ich den vorteil:

  • Es geht automatisch
  • Ich habe noch Zugriff auf versehentlich gelöschte Daten (vorm Runterfahren)
  • Kost fast nix

Grüsse,
Egon

/edit: Wirklich wichtige Daten kopier ich auf mein Home Directory in der Firma. Da kümmert sich ne ganze Abteilung ums Backup ^^

Thema: Robotik: Sensorik, Motorik und Software vom Feinsten
Am im Forum: Smalltalk

Hallo,

schaut euch das an und schlackert mit den Ohren:

http://www.bostondynamics.com/content/sec.php?section=BigDog

(Das Video anschauen)

Musste ich einfach posten, was die Ingenieure da geleistet haben ist einfach so was von unglaublich.

Grüsse,
Egon

Thema: Variable to byte[]
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

ich hab mal vor einiger Zeit ein Example dafür erstellt: http://www.geocities.com/egon_rath/serialization.html

Serialisiert zwar binär in eine Datei, aber das sollte kein hindernis sein, da man vom benutzten MemoryStream ein byte[] bekommen kann.

Grüsse,
Egon

Thema: Nicht veränderbarer Wert eines Computers?
Am im Forum: Rund um die Programmierung

Hallo,

also wenn Du es wirklich relativ sicher machen willst, dann würde ich auf einen Hardware USB Dongle setzen (z.B. Aladdin HASP) und teile der Applikation verschlüsselt im internen Speicher ablegen - diese werden dann nach erfolgreicher Authentifizierung gegenüber dem Dongle nachgeladen und benutzt.

Der nachteil einer solchen Lösung ist halt dass Ihr ein paar Euro's pro Lizenz für den Dongle ausgeben müsst.

Grüsse,
Egon

Thema: In einer C#-Klassenbibliothek eine MessageBox anzeigen
Am im Forum: Rund um die Programmierung

Hallo,

System.Windows.Forms.MessageBox.Show ?

Grüsse,
Egon

Thema: Auf C-Funktionen zugreifen über Dll einbindung
Am im Forum: Rund um die Programmierung

Hallo,

ja stimmt das hab ich vorher übersehen als ich das example zusammen gestellt habe. StringBuilder hat per Default eine Größe von 16 Chars. Wenn der SB in unmanaged Code benutzt wird, wird die Kapazität nicht erweitert wenn mehr als diese reingeschrieben werden.

Grüsse,
Egon

Thema: Auf C-Funktionen zugreifen über Dll einbindung
Am im Forum: Rund um die Programmierung

Hallo,

hört sich für mich so an, als ob mit deiner nativen DLL was nicht stimmt. So weit ich mich erinner musst du beim Microsoft Compiler explizit sagen dass eine Funktion als Export bestimmt ist - ist die zweite Funktion exportiert? (Siehe Link)

Grüsse,
Egon

Thema: Vista SP1 ist RTM, aber...
Am im Forum: Szenenews

Hallo,

nicht MSDN Abonnenten bekommen "nur" das SP1. Im MSDN sind Vista Versionen mit integriertem SP1 verfügbar. Ansonsten alles gleich.

Grüsse,
Egon

Thema: Auf C-Funktionen zugreifen über Dll einbindung
Am im Forum: Rund um die Programmierung

Hallo,

ich würd einen StringBuilder nehmen. Untenstehend ein Beispiel dafür:

Native DLL:


#include <stdio.h>
#include <stdlib.h>

void GetName( char* name )
{
        strcpy( name, "Hello" );
}

Managed:


using System;
using System.Text;
using System.Runtime.InteropServices;

public class Test
{
        [DllImport( "./native.so" )]
        public static extern void GetName( StringBuilder msg );

        public static void Main( string[] args )
        {
                StringBuilder sb = new StringBuilder();
                GetName( sb );
                Console.Out.WriteLine( sb );
        }
}

Grüsse,
Egon

Thema: Technologie für Projekt "nGame", Strategiespiel
Am im Forum: Rund um die Programmierung

Hallo,

ich als alternativer Open-Sourcler werf hier mal Tao und SDL.NET in den Raum ;-) Für einen Fat Client sicher eine Überlegung wert da:

  • Relativ hohe Performance (HW accelerated where supported)
  • Platformunabhängig (Win,OSX,Linux)

Grüsse,
Egon

Thema: Was sind für Euch die wirklich spannenden, neuen Themen für die nächsten 12 Monate?
Am im Forum: Smalltalk

Hallo,

für 2008 hab ich vor mich privat intensiver mit folgenden Themen (weiter) zu beschäftigen:

  • GUI Entwicklung mit GTK#
  • Multiplatform Spieleentwicklung mit Tao
  • AI Entwicklung

betrieblich kommen dann noch so Themen wie WCF dazu. WPF und Workflow sind für mich nicht interessant, ebenso ist LINQ kein Thema.

Grüsse,
Egon

Thema: MonoDevelop 1.0 fertig
Am im Forum: Szenenews

Hallo,

nach langer Zeit hat Novell nun endlich die 1.0er von MonoDevelop fertig gestellt:

Download
Release Notes

immer noch als experimentell muss man allerdings den Windows Port betrachten :-( - aber ansonsten ein schönes Stück Software.

Grüsse,
Egon