Dart und Informatik und Mathematik
Allgemein Mathematik C# Microsoft Solver Foundation
Also Dart ist ja so ein einfaches Spiel, wenn ich mich Recht erinnere, hat man 3 Pfeile die wirft man und man muß mit einem Double oder Bull beenden.
Genauer kann man es logischerweise auf WIKIPEDIA nachlesen.
Theoretisch kann man die Frage auch so stellen, finde eine Summenzerlegung für eine Zahl, welche die kleinste Anzahl von Summanden hat und mindestens eine gerade Zahl zwischen 2 und 40 oder die 50 enthalten ist.
Kategorie Also Dart ist ja so ein einfaches Spiel, wenn ich mich Recht erinnere, hat man 3 Pfeile die wirft man und man muß mit einem Double oder Bull beenden.
Genauer kann man es logischerweise auf WIKIPEDIA nachlesen.
Theoretisch kann man die Frage auch so stellen, finde eine Summenzerlegung für eine Zahl, welche die kleinste Anzahl von Summanden hat und mindestens eine gerade Zahl zwischen 2 und 40 oder die 50 enthalten ist.
Hierfür kann man das allgemeine Problem
lösen, finde zu einer Zahl für eine definierte Menge von Summanden die
mit der geringsten Anzahl Summanden. Eine Lösung in C# kann dann wie folgt
aussehen ->
Wenn man dann noch die Sache mit dem Double-Out or Bull in Betracht zieht kommt man in etwa auf die Lösung in dem angehängten C#-File.
Gefallen ... mir nicht richtig
Wenn man es aber mal rein mathematischen betrachtet hat man ja ein kleine LOP = Lineares Optimierungs Problem
Welches man in OML -> die Sprache der Microsoft Solver Foundation wie folgt definieren kann ->
Dass gefällt mir richtig gut
Gruß JJR
P.S.: Dass Excel habe ich auch angehängt!
static ListSummandDecomposition(int n, List xValidSummands) {
Listresult = new List ();
// Clean up the Summands -> sicher ist sicher
xValidSummands.RemoveAll(item => item > n);
// No elements -> Nothing todo
if (xValidSummands.Count == 0) return null;
// Find a solution
result.Add(xValidSummands[xValidSummands.Count - 1]);
if (n != xValidSummands[xValidSummands.Count - 1]) {
result.AddRange(SummandDecomposition(
n - xValidSummands[xValidSummands.Count - 1],
new List(xValidSummands)
));
}
// is the length of the solution the theoretical minimum -> finished
if (result.Count == calculateMinimumLengthInTheory(n,xValidSummands[xValidSummands.Count-1])) {
return result;
}
// there is another possibility with a theoretical shorter length?
if (xValidSummands.Count >= 2 && result.Count > calculateMinimumLengthInTheory(n,xValidSummands[xValidSummands.Count-2])) {
// remove the greatest summand, make a decomposition and check
xValidSummands.RemoveAt(xValidSummands.Count-1);
Listresult2 = SummandDecomposition(n,xValidSummands);
if (result2.Count < result.Count) {
return result2;
}
}
return result;
}
static int calculateMinimumLengthInTheory(int n, int l) {
return n / l + ((n % l) == 0 ? 0 : 1);
}
Wenn man dann noch die Sache mit dem Double-Out or Bull in Betracht zieht kommt man in etwa auf die Lösung in dem angehängten C#-File.
Gefallen ... mir nicht richtig
Wenn man es aber mal rein mathematischen betrachtet hat man ja ein kleine LOP = Lineares Optimierungs Problem
Welches man in OML -> die Sprache der Microsoft Solver Foundation wie folgt definieren kann ->
Model|
Parameters|
Sets|Integers|0, Infinity||,
Throws,
Outs
|,
Parameters|
Integers|0, Infinity|,
Annotation|ThrowValue|Throws|, "description", "Possible Throws"|,
Annotation|ResultToThrow, "description", "This must be reached"|,
Annotation|PossibleOuts|Outs|, "description", "Possible Outs"|
|,
Decisions|
Integers|0, Infinity|,
Decision1|Throws|
|,
Constraints|
Constraint1 -> Sum|{i,Throws},Decision1|i|*ThrowValue|i|| == ResultToThrow,
Constraint2 -> Sum|{i,Outs},Decision1|i||>=1
|,
Goals|
Minimize|
Goal1 -> Annotation|Sum|{i,Throws},Decision1|i||, "order", 0|
|
|
|
Dass gefällt mir richtig gut
Gruß JJR
P.S.: Dass Excel habe ich auch angehängt!