Maximale Laufzeit verändern?
-

Super. Einfach den ganzen Code reinhauen, auch noch unformatiert. Wir sind alle begeistert.
-
Mechanics schrieb:

Super. Einfach den ganzen Code reinhauen, auch noch unformatiert. Wir sind alle begeistert.
Schnell gemacht.
#include <iostream> #include <cstdlib> #include <cmath> #include <ctime> #include <iterator> #include <algorithm> #include <math.h> #include <iomanip> #include <vector> #include <functional> #include <numeric> #include <boost/random.hpp> #include <time.h> using namespace std; double Round(double, int); void zl(int kappa, vector<double> Z, int c_v, double &Zentrale_Loesung); boost::mt11213b mt; boost::normal_distribution<double> D_verteilung(5, 2); boost::normal_distribution<double> Z_verteilung(106, 5); boost::variate_generator<boost::mt11213b&, boost::normal_distribution<double> > get_Demand(mt, D_verteilung); boost::variate_generator<boost::mt11213b&, boost::normal_distribution<double> > get_Zahlbereit(mt, Z_verteilung); int main () { int c_v = 87; //variable Kosten 87*1.15=100.05 int kappa = 450; //Kapazität, knappa Ressource int h=100; //Anzahl Händler int delta; //Nachfragemenge auf dem Markt double b_f=100; double b_rs = 90; int verh_ite=4; //gute Begründung oder Schranken programmieren double ave_b_zul=0; double hilfe=0; int anz_ite=7; //Vektoren Defintion für die Wiedergabe vector<double> ave_zentrale_loesung(anz_ite, 0); vector<double> ave_Z_max(anz_ite, 0); vector<double> ave_Z_min(anz_ite, 0); for (int q=0; q<anz_ite; q++) { //Normalverteilung Anfang cout << clock() << " "; double D[h]; /*Nachfragemenge jedes Händlers*/ //std::generate_n(D, h, normal_distribution(5.0, 2.0)); for (int i=0; i < h; i++) { D[i] = get_Demand(); D[i] = Round (D[i], 0); } double d=0; for (int i=0; i < h; i++) { d += D[i]; } delta = static_cast<int>(d); vector<double> Z(delta,0); //Zahlungsbereitschaft //std::generate_n(Z.begin(), delta, normal_distribution(106.0, 6.0)); //std::copy(Z, Z+kappa, std::ostream_iterator<double>(std::cout, "\n")); for (int i=0; i<delta; i++) { Z.at(i)=get_Zahlbereit(); // cout << Z.at(i) << endl; cout << clock() << " "; } //Normalverteilung Ende //Zuordnung Anfang //vector<vector<double> > Z_Handler; double** Z_Handler=NULL; Z_Handler = new double*[h]; int w = 0; for (int i=0; i<h ; i++) { d = D[i]; w = static_cast<int>(d); Z_Handler[i] = new double [w]; cout << clock() << " "; } //Einspeisung der Werte int w_kum = 0; for (int i=0; i<h; i++) { //Z_Handler.resize(i); d = D[i]; w = static_cast<int>(d); // cout << endl << w << endl; //Z_Handler[i].resize(w); for (int j=0; j<w; j++) { //Z_Handler[i].push_back(Z.at(w_kum+j)); Z_Handler[i][j]=Z.at(w_kum+j); } w_kum += w; } //Zuordnung Ende //ZENTRALE LÖSUNG Anfang //std::sort(Z.begin(), Z.end(), std::greater<double>()); //std::copy(Z.begin(), Z.end(), std::ostream_iterator<double>(std::cout, " ")); double Zentrale_Loesung=0; //zl(kappa, Z, c_v, Zentrale_Loesung); // ave_zentrale_loesung.at(0)=Zentrale_Loesung; // ave_Z_max.at(0)=Z.at(0); // ave_Z_min.at(0)=Z.back(); //Zentrale Lösung Ende delete[] Z_Handler; } return 0; } //Funktionsdefinition double Round(double amount, int power_of_ten) { double pten; /* 10 to the power_of_ten */ double intpart; /* Integerteil der durch pten geteilten Zahl */ double halfsign; /* Plus oder Minus 0.5 für korrekte Rundung */ double temp; temp = (double)power_of_ten; pten= pow((double)(10), temp); /* auf Zehnerpotenz definieren */ halfsign = (amount < 0.0) ? - 0.5 : 0.5; modf( (double)(amount * pten + halfsign), &intpart); return ((double)(intpart / pten) ); } void zl(int kappa, vector<double> Z, int c_v, double &Zentrale_Loesung) { for (int i=0; i<kappa; i++) { Zentrale_Loesung+=10; } /*Das Ergebnis der zentralen Lösung entspricht dem maximalen Gewinn, den die Supply Chain erzielen kann auf dem Markt*/ //std::copy(Z, Z+kappa, std::ostream_iterator<double>(std::cout, "\n")); //cout << fixed << endl << "Das ist das Ergebnis der Zentralen Loesung:" << endl << Zentrale_Loesung << endl; //cout << fixed << endl << "Hoechster Wert der Zahlungsbereitschaft:" << endl << Z.at(0) << endl; //cout << fixed << endl << "Niedrigster Wert der Zahlungsbereitschaft:" << endl << Z.back() << endl; }Stellt sich noch die Frage was wir damit sollen.
-
Ich würde sagen dein Speicher läuft irgendwann voll, weil du die Elemente von Z_Handler nie deletest.
Warum sind da eigentlich Kommentare mit std::vector usw. drin? Das wäre der Code den du eigentlich schreiben solltest ...
-
Erstmal dankeschön für die schnellen Antworten.
Mechanics schrieb:
CppKnecht schrieb:
Der Code ist soweit richtig
Falsch.
CppKnecht schrieb:
Kann mir jemand sagen, wie ich die maximale Laufzeit verändern kann?
Es gibt keine maximale Laufzeit. Dein Code ist sicher von vorne bis hinten falsch. Wahrscheinlich hast du das ganze auch komplett falsch implementiert und bei einer besseren Implementierung würde der Algorithmus wesentlich schneller durchlaufen.
Gut zu wissen, dass es keine Laufzeitbeschränkungen gibt...trotzdem kommt diese Meldung bei anz_ite=7, aber bei 6 nicht.
Eigentlich muss das ganze auch mit h=1000 und kappa=4500 bei anz_ite=100 durchführen.Übrigens ist das nur ein Auszug aus meinem Programm, weil angefangen haben alles Schritt für Schritt zu checken...aber hier hakt es schon.
Hacker schrieb:
CppKnecht schrieb:
"This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information."Äh, das ist, was kommt, wenn eine Exception geworfen wird und kein entsprechendes
catch()gefunden wird. Zeig Code.Eigentlich habe ich keinen try block eingefügt, also sollte auch kein catch() verlangt sein. Außer es passiert bei der Normalverteilung bei boost, was ich nicht glaube, da es ja auch bei anderen funktioniert.
Mechanics schrieb:
CppKnecht schrieb:
Der Code ist soweit richtig
Falsch.
CppKnecht schrieb:
Kann mir jemand sagen, wie ich die maximale Laufzeit verändern kann?
Es gibt keine maximale Laufzeit. Dein Code ist sicher von vorne bis hinten falsch. Wahrscheinlich hast du das ganze auch komplett falsch implementiert und bei einer besseren Implementierung würde der Algorithmus wesentlich schneller durchlaufen.
Man kann es mit Sicherheit schneller gestalten, aber da habe auch einfach nicht die Erfahrung...und bald keine Zeit mehr

ghf schrieb:
CppKnecht schrieb:
Kann mir jemand sagen, wie ich die maximale Laufzeit verändern kann?
weniger ein und ausschalten.
Was meinst du damit?
-
Bashar schrieb:
Ich würde sagen dein Speicher läuft irgendwann voll, weil du die Elemente von Z_Handler nie deletest.
Warum sind da eigentlich Kommentare mit std::vector usw. drin? Das wäre der Code den du eigentlich schreiben solltest ...
Ich delete doch Z_Handler am Ende von main()... es ist auch innerhalb der letzten schleife, sodass bei jedem Durchlauf der Speicher wieder frei gegeben wird. Oder lieg ich falsch?
Mechanics schrieb:

Super. Einfach den ganzen Code reinhauen, auch noch unformatiert. Wir sind alle begeistert.
Sorry für das Nicht-Formatieren.
-
CppKnecht schrieb:
Bashar schrieb:
Ich würde sagen dein Speicher läuft irgendwann voll, weil du die Elemente von Z_Handler nie deletest.
Warum sind da eigentlich Kommentare mit std::vector usw. drin? Das wäre der Code den du eigentlich schreiben solltest ...
Ich delete doch Z_Handler am Ende von main()
Warum muss man eigentlich immer alles zweimal schreiben? Die Elemente von Z_Handler deletest du nicht.
double** Z_Handler=NULL; Z_Handler = new double*[h]; // <- wird deletet int w = 0; for (int i=0; i<h ; i++) { d = D[i]; w = static_cast<int>(d); Z_Handler[i] = new double [w]; // <- wird nicht deletet cout << clock() << " "; }
-
und warum kommentierst du den tollen std::vector aus?
-
Bashar schrieb:
CppKnecht schrieb:
Bashar schrieb:
Ich würde sagen dein Speicher läuft irgendwann voll, weil du die Elemente von Z_Handler nie deletest.
Warum sind da eigentlich Kommentare mit std::vector usw. drin? Das wäre der Code den du eigentlich schreiben solltest ...
Ich delete doch Z_Handler am Ende von main()
Warum muss man eigentlich immer alles zweimal schreiben? Die Elemente von Z_Handler deletest du nicht.
double** Z_Handler=NULL; Z_Handler = new double*[h]; // <- wird deletet int w = 0; for (int i=0; i<h ; i++) { d = D[i]; w = static_cast<int>(d); Z_Handler[i] = new double [w]; // <- wird nicht deletet cout << clock() << " "; }for(int i=0;i<h;i++) delete Z_Handler[i]; delete[] Z_Handler;Ich delete es jetzt, aber funzt noch immer nicht.
otze schrieb:
und warum kommentierst du den tollen std::vector aus?
Weil es mit dem vector auch nicht geklappt hat. Es bricht dann sogar bei einer geringeren Iteration ab.
-
Irgendwas stimmt an der Logik nicht. get_Demand kann dir auch negative Werte liefern. Wenn du das dann als Größe für ein double-Array benutzt, geht das natürlich in die Hose.
-
CppKnecht schrieb:
Hacker schrieb:
CppKnecht schrieb:
"This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information."Äh, das ist, was kommt, wenn eine Exception geworfen wird und kein entsprechendes
catch()gefunden wird. Zeig Code.Eigentlich habe ich keinen try block eingefügt, also sollte auch kein catch() verlangt sein.
Nein, wenn du keinen try-Block einfügst dann kommt es auch (bei jeder Exception).
-
MFK schrieb:
Irgendwas stimmt an der Logik nicht. get_Demand kann dir auch negative Werte liefern. Wenn du das dann als Größe für ein double-Array benutzt, geht das natürlich in die Hose.
Ja!!! Du hast recht! Das war der große Fehler!
Ich habe es folgend behoben:double a=0; for (int i=0; i < h; i++) { a=get_Demand(); if (a>=0) { D[i] = a; D[i] = Round (D[i], 0); } else D[i]=0; }Ich werde gleich gucken, ob der Rest des Programms funzt. Wenn nicht, dann werde ich mich noch mal melden. An sonsten ein großes Dankeschön an alle, die kommentiert haben! Vor allem MFK und Bashar!

-
CppKnecht schrieb:
otze schrieb:
und warum kommentierst du den tollen std::vector aus?
Weil es mit dem vector auch nicht geklappt hat. Es bricht dann sogar bei einer geringeren Iteration ab.
Dann liegt es natürlich am std::vector und garantiert nicht daran, dass du etwas dummes tust. Fürs nächste mal: an einer Stelle wo std::vector steht, kannst du keine Speicherlecks erzeugen. Strebe Einfachheit des Codes an. Das beinhaltet gut getesteten Code von anderen zu verwenden, anstatt den Eigenen.
-
otze schrieb:
CppKnecht schrieb:
otze schrieb:
und warum kommentierst du den tollen std::vector aus?
Weil es mit dem vector auch nicht geklappt hat. Es bricht dann sogar bei einer geringeren Iteration ab.
Dann liegt es natürlich am std::vector und garantiert nicht daran, dass du etwas dummes tust. Fürs nächste mal: an einer Stelle wo std::vector steht, kannst du keine Speicherlecks erzeugen.
Doch, wenn man so dumm ist und das aufruft.
