Schrift
[thread]6892[/thread]

Ein Constraint System



<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten
kabel
 2005-04-14 11:33
#53793 #53793
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
ziel: modellierung des satzes von pythagoras als Constraint System (CS).

was ist ein CS? jeder hat doch schonmal ne tabellenkalkulation benutzt :) dahinter steht ein CS. wenn die zelle A4 den constraint "=A2+A3" enthält, dann wird bei jeder änderung einer der beiden zellen A2 oder A3 die zelle A4 mitgeändert, und zwar so, dass A4=A2+A3 gilt.

wikipedia.org sagt zu constraint:
Quote
A constraint is a limitation of possibilities.


also ist "=A2+A3" ein constraint, denn die zelle A4 kann nun mitnichten alle möglichen werte annehmen, sondern ist immer gleich dem wert von A2+A3.

wie funktioniert das ganze? $tabellenkalkulation stellt fest, dass der eingegebene wert mit "=" anfängt.
- falls nun hinter dem "=" ein ausdruck anfängt, der ohne referenzen auf andere zellen berechnet werden kann (z.b. "=1+2+3"), dann wird der wert direkt berechnet und eingetragen, wobei die formel erhalten bleibt. diesen fall lass ich unter den tisch fallen.
- der interessantere fall ist einer mit referenzen auf andere zellen. sagen wir z.b. zelle A4 mit dem constraint "=A2+A3". zelle A4 muss nun lauschen, ob sich A2 oder A3 geändert hat, denn bei jeder änderung müssen wir den constraint einhalten (klingeling an die pattern fraktion).

nun weg von den tabellenkalkulationen hin zu einer implementierung:

die zellen in der tabellenkalkulation entsprechen den variablen in der gleichung.
die constraints geben eine rechenbedingung an.

eine mögliche modellierung ist also ein Addierer objekt "a", das referenzen zu drei Variablen objekte "v1", "v2", "summe" hält.
ebenso enthalten alle variablen referenzen auf die constraints.

http://wwwcip.informatik.uni-erlangen.de/~sisthank...

wenn sich nun v1 ändert, dann teilt "v1" die änderung dem adder mit. der weiss nun, dass sich die variable "v1" geändert hat. also wird er den wert von summe neu berechnen und dann den wert von "summe" neu setzen. (weitergedacht: jetzt hat sich summe geändert, also wird summe wiederum eine änderung propagieren usw. das geht durch das ganze system durch, bis sich wieder ein stabiler zustand einpendelt)

bei binären operatoren gibts dann noch eine schwierigkeit, die ich verschweige :)

die anderen operatoren die wir für den pythagoras brauchen sind (fast) genauso aufgebaut. die wurzel operation und das quadrieren können mit objekten des typs "Exponierer" modelliert werden, der den exponenten als parameter bekommt. das endgültige system sieht so aus:

http://wwwcip.informatik.uni-erlangen.de/~sisthank...

bei meiner lösung dürfen operatoren nur mit variablen und andersrum verbunden werden, deswegen habe ich noch temporäre variablen ti eingefügt.

have fun 8)
-- stefan
esskar
 2005-04-14 13:25
#53794 #53794
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
sollen variablen schon existieren, bevor man sie referenzieren kann?
pKai
 2005-04-14 16:07
#53795 #53795
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Ist das à la Rätsel der Woche gedacht?
Wenn ja wie ist dann das Vorgehen (Lösungen an wen, posten ab wann,...)?
I sense a soul in search of answers.
kabel
 2005-04-14 17:03
#53796 #53796
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
@pKai: noe, da ich das thema selbst nicht durchdringe ;-)
einfach posten, wie du es loesen wuerdest, oder code, oder whatever.

@esskar: ich hatte das so gedacht:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
my $sum1= Variable->new( "first_summand" );
my $sum2= Variable->new( "second_summand" );
my $sum3= Variable->new( "result" );
my $adder= Addierer->new();
$adder->connectFirstSummand( $sum1 );
$adder->connectSecondSummand( $sum2 );
$adder->connectResult( $sum3 );

$sum1->setValue( 5 );
$sum2->setValue( 3 );
print $sum3->getValue(); # should print 8

ein parser waere natuerlich auch nett 8)
-- stefan
renee
 2005-04-14 17:35
#53797 #53797
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ok, wenn wir gleich posten dürfen...

Variable.pm:
Code: (dl )
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package Variable;

sub new{
my ($class) = @_;
my $self = {value => 0};
bless $self,$class;
return $self;
}

sub setValueAdderVar{
my ($self,$val) = @_;
$self->{old} = $self->{value};
$self->{value} = $val * $val;
$self->{Adder}->refresh($self->{old},$self->{value});
}

sub connectAdder{
my ($self,$var) = @_;
$self->{Adder} = $var;
}

sub connectSqrt{
my ($self,$var) = @_;
$self->{Sqrt} = $var;
}

sub setValueSqrtVar{
my ($self,$val) = @_;
$self->setValue($val);
$self->{Sqrt}->refresh($self->getValue());
}

sub setValue{
my ($self,$val) = @_;
$self->{value} = $val;
}

sub getValue{
my ($self) = @_;
return $self->{value};
}

1;


Adder.pm:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package Adder;

sub new{
my ($class) = @_;
my $self = {sum => 0};
bless $self,$class;
return $self;
}

sub connectSum{
my ($self,$var) = @_;
$self->{SumVar} = $var;
}

sub refresh{
my ($self,$old,$new) = @_;
$self->{sum} += ($new - $old);
$self->{SumVar}->setValueSqrtVar($self->{sum});
}

1;


Sqrt.pm:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package Sqrt;

sub new{
my ($class) = @_;
my $self = {};
bless $self,$class;
return $self;
}

sub connectRes{
my ($self,$var) = @_;
$self->{Result} = $var;
}

sub refresh{
my ($self,$val) = @_;
$self->{Result}->setValue(sqrt($val));
}

1;


Skript:
Code: (dl )
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
26
27
28
29
#! /usr/bin/perl

use strict;
use warnings;
use lib qw(.);
use Variable;
use Adder;
use Sqrt;

my $alpha = Variable->new();
my $beta = Variable->new();
my $gamma = Variable->new();
my $delta = Variable->new();

my $adder = Adder->new();
my $sqrt = Sqrt->new();

$alpha->connectAdder($adder);
$beta->connectAdder($adder);

$adder->connectSum($gamma);
$gamma->connectSqrt($sqrt);

$sqrt->connectRes($delta);

$alpha->setValueAdderVar(3);
$beta->setValueAdderVar(4);

print $delta->getValue(),"\n";


@kabel: so wie Du das kurz umrissen hast, würde nicht die veränderte Variable sich bei der nächsten Instanz (z.B. Adder oder Sqrt) melden, sondern die nächste Instanz müsste sich von der vorherigen Instanz die Werte holen...

Ist wahrscheinlich keine besonders gute Lösung, aber mal eine Diskussionsgrundlage ;)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pKai
 2005-04-14 18:05
#53798 #53798
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
@renee: Wie würde ich da jetzt bei dir beta aus vorgegebenen alpha und gamma bekommen?
I sense a soul in search of answers.
renee
 2005-04-14 18:07
#53799 #53799
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
stimmt, man muss in beide Richtungen referenzieren... mmmhhh... mach ich mir nochmal ein paar Gedanken...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
kabel
 2005-04-14 19:01
#53800 #53800
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
ein bissi generischer bitte ;)
ich hab bis vor kurzem vergeblich den quadrierer gesucht ... lol
-- stefan
pKai
 2005-04-14 19:15
#53801 #53801
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
"generisch" ja, aber letztlich tut's natürlich auch eine Constraint, die "Pythagoras" heißt ;)

--
Tangent: Welches grammatikalische Geschlecht hat "Constraint" im Deutschen?
I sense a soul in search of answers.
renee
 2005-04-14 21:41
#53802 #53802
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich habe ja nicht den ganzen Tag Zeit, mich um sowas zu kümmern ;) Mal schauen, wann ich daran weiterarbeiten kann... Ich muss ja auch irgendwann mal mein Geld verdienen ;)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten



View all threads created 2005-04-14 11:33.