<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Unauffindbarer Fehler bei einem Optimierungsproblem]]></title><description><![CDATA[<p>Hallo,</p>
<p>das ist mein erster Post hier, also bitte verzeiht mir alles, was ich falsch mache <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ich habe eine Funktion, bei der ich den Fehler nicht finde.</p>
<p>Ziel ist es, ein Programm zu schreiben, dass folgendes leistet:</p>
<p>Gegeben sind n Elemente.<br />
Jedes Element hat die Zuverlässigkeit ZV.<br />
Jedes Element darf beliebig oft genutzt werden (um die gesammtzuverlässigkeit zu erhöhren).<br />
Jedes Element kostet einen bestimmten Betrag.<br />
Ein bekanntes Budget darf nicht überschritten werden. Jedes Element muss mindestens einmal vorkommen.</p>
<p>So, das waren die Bedingungen.</p>
<p>Der Code der Funktion, die die eigentliche Optimierung leistet, ist folgender:</p>
<pre><code class="language-cpp">// ===== Rekursive Funktion zur Bestimmung des Optimums =====

double f(int Stufen,double Budget, double* ZV, double* Ko, int* Vielf){
	FunkAuf++;
	if (Stufen&gt;1) {

		double Restkosten=0;
		//Bestimmung der Kosten fuer das restliche System (ausgenommen die jetzige Stufe).
		for (int i=1; i&lt;Stufen; i++)
			Restkosten=Restkosten+Ko;

		/*
		opt: Wahrscheinlichkeit der bisher besten Loesung.
		result: speichert die aktuelle Loesung.
		momkost: Kosten fuer die aktuelle Stufe.
		*/
		double opt=0;
		double result=0;
		double momkost=Ko[0];
		for (int i=1; Budget-momkost&gt;=Restkosten;i++){
			result=(1-Power(1-ZV[0],i))*f(Stufen-1,Budget-momkost,&amp;ZV[1],&amp;Ko[1],&amp;Vielf[1]);
			if (result&gt;opt) {
				opt=result;
				Vielf[0]=i;
			}
			momkost=momkost+Ko[0];
		}
		return opt; 
	} else {
		/*
		opt: Wahrscheinlichkeit der bisher besten Loesung.
		result: speichert die aktuelle Loesung.
		momkost: Kosten fuer die aktuelle Stufe.
		*/
		double opt=0;
		double result=0;
		double momkost=Ko[0];
		for (int i=1; Budget-momkost&gt;=0;i++){
			result=1-Power(1-ZV[0],i);
			if (result&gt;opt) {
				opt=result;
				Vielf[0]=i;
			}
			momkost=momkost+Ko[0];
		}
		return opt; 		
	}
}
</code></pre>
<ul>
<li></li>
</ul>
<p>Die Ausgabe dazu lautet:</p>
<pre><code>Beispiel 1:

 Stufe   Vielf.   Kosten   Zuv. Komp.   Zuv. Stufe
---------------------------------------------------
   1        7      2.20       0.50       0.992188
   2        1      1.60       0.90       0.900000  Fehler!
   3        1      3.20       0.80       0.800000  Fehler!
   4        1      5.10       0.90       0.900000  Fehler!
   5        1      1.10       0.40       0.400000  Fehler!
---------------------------------------------------
 Gesamt           26.40                  0.976159

Von dem Budget 56 haben Sie 26.4 verbraucht.
Ihre Zuverlaessigkeit von 0.976159 ist Ok.
Sie haben 0 Sekunden und 5898 Funktionsaufrufe benoetigt.
Eigentlich benoetigt man 9546 Aufrufe.
Die Musterloesung brauchte 0 Sekunden.
</code></pre>
<p>Man sieht:<br />
Es wird nicht das gesammte Budget aufgebraucht.<br />
Es werden unkluge Entscheidungen getroffen (Stufe 2 ist billiger und Zuverlässiger als Stufe 1, wurde aber nur einmal gewählt).</p>
<p>Bei Bedarf reiche ich gerne den gesamte Quelltext nach.</p>
<p>Gruß,<br />
SaM</p>
<p>[i]edit*<br />
Nachtrag:<br />
Ich vermute, dass der Fehler hier liegt:</p>
<pre><code class="language-cpp">if (result&gt;opt) {
    opt=result;
    Vielf[0]=i;
}
</code></pre>
<p>Dort wird immer wieder das Array für die Vielfachkeiten (also wie oft Element n vorhanden ist) immer wieder überschrieben.<br />
Dementsprechend werden dort komplett falsche Informationen aufgesammelt.... Wie kann man das beheben?</p>
<p><em>edit2</em><br />
Ich hab das Programm nun modifiziert:</p>
<pre><code class="language-cpp">//tmpVielf speichert die Vielfachen der momentan optimalsten Lösung ab. 
		//Dadurch kommt es vermutlich zu den Verzögerungen im Programmablauf. 
		//TODO:	Bessere Lösung finden!
		int *tmpVielf = new int[Stufen];
		for (int i=1; Budget-momkost&gt;=Restkosten;i++){
		result=(1-Power(1-ZV[0],i))*f(Stufen-1,Budget-momkost,&amp;ZV[1],&amp;Ko[1],&amp;Vielf[1]);
			if (result&gt;opt) {
				opt=result;
				tmpVielf[0]=i;
				for (int j=1; j&lt;Stufen; j++)
					tmpVielf[j]=Vielf[j];
			}
			momkost=momkost+Ko[0];
		}
		for (int j=0; j&lt;Stufen; j++)
			Vielf[j]=tmpVielf[j];		
		delete tmpVielf;
		return opt;
</code></pre>
<p>Jetzt funktioniert dsa Programm, aber das umkopieren der Arrays scheint sehr viel zeit zu benötigen (ca. 10 mal länger als die Musterlösung). Hat jemand eine Idee, wie man das effizienter machen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/212294/unauffindbarer-fehler-bei-einem-optimierungsproblem</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 17:24:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/212294.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 04 May 2008 12:11:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unauffindbarer Fehler bei einem Optimierungsproblem on Sun, 04 May 2008 13:01:12 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>das ist mein erster Post hier, also bitte verzeiht mir alles, was ich falsch mache <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ich habe eine Funktion, bei der ich den Fehler nicht finde.</p>
<p>Ziel ist es, ein Programm zu schreiben, dass folgendes leistet:</p>
<p>Gegeben sind n Elemente.<br />
Jedes Element hat die Zuverlässigkeit ZV.<br />
Jedes Element darf beliebig oft genutzt werden (um die gesammtzuverlässigkeit zu erhöhren).<br />
Jedes Element kostet einen bestimmten Betrag.<br />
Ein bekanntes Budget darf nicht überschritten werden. Jedes Element muss mindestens einmal vorkommen.</p>
<p>So, das waren die Bedingungen.</p>
<p>Der Code der Funktion, die die eigentliche Optimierung leistet, ist folgender:</p>
<pre><code class="language-cpp">// ===== Rekursive Funktion zur Bestimmung des Optimums =====

double f(int Stufen,double Budget, double* ZV, double* Ko, int* Vielf){
	FunkAuf++;
	if (Stufen&gt;1) {

		double Restkosten=0;
		//Bestimmung der Kosten fuer das restliche System (ausgenommen die jetzige Stufe).
		for (int i=1; i&lt;Stufen; i++)
			Restkosten=Restkosten+Ko;

		/*
		opt: Wahrscheinlichkeit der bisher besten Loesung.
		result: speichert die aktuelle Loesung.
		momkost: Kosten fuer die aktuelle Stufe.
		*/
		double opt=0;
		double result=0;
		double momkost=Ko[0];
		for (int i=1; Budget-momkost&gt;=Restkosten;i++){
			result=(1-Power(1-ZV[0],i))*f(Stufen-1,Budget-momkost,&amp;ZV[1],&amp;Ko[1],&amp;Vielf[1]);
			if (result&gt;opt) {
				opt=result;
				Vielf[0]=i;
			}
			momkost=momkost+Ko[0];
		}
		return opt; 
	} else {
		/*
		opt: Wahrscheinlichkeit der bisher besten Loesung.
		result: speichert die aktuelle Loesung.
		momkost: Kosten fuer die aktuelle Stufe.
		*/
		double opt=0;
		double result=0;
		double momkost=Ko[0];
		for (int i=1; Budget-momkost&gt;=0;i++){
			result=1-Power(1-ZV[0],i);
			if (result&gt;opt) {
				opt=result;
				Vielf[0]=i;
			}
			momkost=momkost+Ko[0];
		}
		return opt; 		
	}
}
</code></pre>
<ul>
<li></li>
</ul>
<p>Die Ausgabe dazu lautet:</p>
<pre><code>Beispiel 1:

 Stufe   Vielf.   Kosten   Zuv. Komp.   Zuv. Stufe
---------------------------------------------------
   1        7      2.20       0.50       0.992188
   2        1      1.60       0.90       0.900000  Fehler!
   3        1      3.20       0.80       0.800000  Fehler!
   4        1      5.10       0.90       0.900000  Fehler!
   5        1      1.10       0.40       0.400000  Fehler!
---------------------------------------------------
 Gesamt           26.40                  0.976159

Von dem Budget 56 haben Sie 26.4 verbraucht.
Ihre Zuverlaessigkeit von 0.976159 ist Ok.
Sie haben 0 Sekunden und 5898 Funktionsaufrufe benoetigt.
Eigentlich benoetigt man 9546 Aufrufe.
Die Musterloesung brauchte 0 Sekunden.
</code></pre>
<p>Man sieht:<br />
Es wird nicht das gesammte Budget aufgebraucht.<br />
Es werden unkluge Entscheidungen getroffen (Stufe 2 ist billiger und Zuverlässiger als Stufe 1, wurde aber nur einmal gewählt).</p>
<p>Bei Bedarf reiche ich gerne den gesamte Quelltext nach.</p>
<p>Gruß,<br />
SaM</p>
<p>[i]edit*<br />
Nachtrag:<br />
Ich vermute, dass der Fehler hier liegt:</p>
<pre><code class="language-cpp">if (result&gt;opt) {
    opt=result;
    Vielf[0]=i;
}
</code></pre>
<p>Dort wird immer wieder das Array für die Vielfachkeiten (also wie oft Element n vorhanden ist) immer wieder überschrieben.<br />
Dementsprechend werden dort komplett falsche Informationen aufgesammelt.... Wie kann man das beheben?</p>
<p><em>edit2</em><br />
Ich hab das Programm nun modifiziert:</p>
<pre><code class="language-cpp">//tmpVielf speichert die Vielfachen der momentan optimalsten Lösung ab. 
		//Dadurch kommt es vermutlich zu den Verzögerungen im Programmablauf. 
		//TODO:	Bessere Lösung finden!
		int *tmpVielf = new int[Stufen];
		for (int i=1; Budget-momkost&gt;=Restkosten;i++){
		result=(1-Power(1-ZV[0],i))*f(Stufen-1,Budget-momkost,&amp;ZV[1],&amp;Ko[1],&amp;Vielf[1]);
			if (result&gt;opt) {
				opt=result;
				tmpVielf[0]=i;
				for (int j=1; j&lt;Stufen; j++)
					tmpVielf[j]=Vielf[j];
			}
			momkost=momkost+Ko[0];
		}
		for (int j=0; j&lt;Stufen; j++)
			Vielf[j]=tmpVielf[j];		
		delete tmpVielf;
		return opt;
</code></pre>
<p>Jetzt funktioniert dsa Programm, aber das umkopieren der Arrays scheint sehr viel zeit zu benötigen (ca. 10 mal länger als die Musterlösung). Hat jemand eine Idee, wie man das effizienter machen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1503038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1503038</guid><dc:creator><![CDATA[SaMJaF]]></dc:creator><pubDate>Sun, 04 May 2008 13:01:12 GMT</pubDate></item><item><title><![CDATA[Reply to Unauffindbarer Fehler bei einem Optimierungsproblem on Sun, 04 May 2008 14:17:58 GMT]]></title><description><![CDATA[<p>Du musst dir nur das merken, was rückgängig zu machen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1503110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1503110</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 04 May 2008 14:17:58 GMT</pubDate></item><item><title><![CDATA[Reply to Unauffindbarer Fehler bei einem Optimierungsproblem on Mon, 05 May 2008 07:45:58 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Du musst dir nur das merken, was rückgängig zu machen ist.</p>
</blockquote>
<p>Aber wie soll ich das denn machen? Das Problem dabei ist ja, dass auch, wenn bereits ein Optimum gefunde wurde (also das korrekte Optimum), weitere Moeglichkeiten getestet werden. Und mir wuerde keine Moeglichkeit einfallen, fuer die anderen rekursionsstufen die Information bereit zu stellen, in wie fern die neuen Ergebnisse gespeichert werden sollen bzw. rueckgaengig gemacht werden sollen...</p>
<p>Ich habe auch schon ueberlegt, am Anfang eine Art Dreiecksmatrix zu uebergeben, sodass jede Rekursionsstufe ein eigenes Feld hat, um darin zu arbeiten. Aber das erspart mir ja noch kein dauerndes umkopieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1503444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1503444</guid><dc:creator><![CDATA[SaMJaF]]></dc:creator><pubDate>Mon, 05 May 2008 07:45:58 GMT</pubDate></item></channel></rss>