Problem ze zwracaniem wartosci. Rekurencja.

0

Witam, mam problem. Debugujac w funkcji wszystko jest. Przy wyjsciu z niej, wartoscia UB jest wartosc zadeklarowana na poczatku programu.

public static void main(String[] args) throws IOException
	{
		  long  UB=Integer.MAX_VALUE;
		  Wezel l = new Wezel();
	
                 (...)
	
		l.Branch_And_Bound(Pi,A,rozw,il,UB);
		System.out.println("Wynik"+UB+" ");
	}

W klasie wezel metoda BnB:

public void Branch_And_Bound(LinkedList<Problem> Pi, LinkedList<Problem> A, LinkedList<Problem> rozw, int ilosc, long UB)

W przypadku wyliczenia nowego UB przypisuje wartosc UB=LB i nastepnie return; Moge jakos obejsc problem zwracania wyniku przez wartosc? Tak, zeby po wyjsciu z funkcji wynik UB byl tym UB z metody Branch_And_Bound?

0

Zamiast long użyj klasy Long, ponieważ w javie wszystkie obiekty są przekazywane jako referencje, a typy prymitywne jako wartości :-)

0

Zrobilem tak jak mowiles

public static void main(String[] args) throws IOException
        {
                 Long UB=new Long(Long.MAX_VALUE);
                  Wezel l = new Wezel();
       
                 (...)
       
                l.Branch_And_Bound(Pi,A,rozw,il,UB);
                System.out.println("Wynik"+UB+" ");
        }

i

 public void Branch_And_Bound(LinkedList<Problem> Pi, LinkedList<Problem> A, LinkedList<Problem> rozw, int ilosc, Long UB)

Dalej to samo [glowa]

0

A możesz dać cały kod tej metody ?

0

Sam algorytm nie ma znaczenia, bo dziala poprawnie. Kwestia tego zwracania wyniku. ;-(

public Long Branch_And_Bound(LinkedList<Problem> Pi, LinkedList<Problem> A, LinkedList<Problem> rozw, int ilosc, Long UB)
	{           
		Iterator<Problem> itrPi = Pi.iterator();
		long LB=Oblicz_LB(Pi,A);
               

		int i = ilosc - Pi.size();

		if (LB >= UB) return UB;

		if ((i == 0) && (LB < UB))
		{
			UB = LB;
					                      
		}

		

		for (int k=i; k>0; k--)
		{
			Zejdz_w_dol(A,Pi);
			Branch_And_Bound(Pi,A,rozw,ilosc,UB);
			Do_Gory(Pi,A);
		}

		return UB;
	}
0

To:

long LB=Oblicz_LB(Pi,A);

Zmień na:

Long LB=Oblicz_LB(Pi,A);
0

Bez zmian. Chyba musze wrocic do C :-P

0

Za kazdym razem na koncu zwracana jest wartosc zadeklarowana na poczatku.

public static void main(String[] args) 
        {
                 Long UB=new Long(Long.MAX_VALUE);    //TA WARTOSC.
                  Wezel l = new Wezel();
       
                 (...)
       
                l.Branch_And_Bound(Pi,A,rozw,il,UB);
                System.out.println("Wynik"+UB+" ");
        }

Moze problemem jest to, ze jest to metoda klasy Wezel i wywolujac ja w klasie Main moge poprawna wartosc odczytac tylko w klasie, gdzie zadeklarowana jest metoda?

0

W javie jest to dość skomplikowany. Zazwyczaj wszytko jest przekazywane przez wartość, ale w przypadku obiektów. Następuje "płytkie kopiowanie" wszystkie pola obiektu przekazywanego do metody nie są kopiowane do nowego obiektu. W rzeczywistości zatem może dojść do takiej sytuacji jak tutaj:

package com.hp.sis.szkolenia.xml;

public class LongIReferencja {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		A a = new A();
		System.out.println("początek A :" + a.toString());
		a.a = 10;
		a.b = 10;
		System.out.println("nadanie A :" +a.toString());
		
		metoda(a); //przekazujemy wskaźnik na a, ale zostaje on skopiowany!!!
		
		System.out.println(a.toString());
	}

	private static void metoda(A a) {
		// a jest kopią tego z main() i wszytkie zmiany są robione w kopii!!!
		A b = new A();
		
		System.out.println("początek B :" +b.toString());
		b.a = 11;
		b.b = 11;
		System.out.println("nadanie B :" +b.toString());
		
		a = b; //wskaźnik zaczyna wskazywać na lokalną zmianną b
		System.out.println("A = B :" +a.toString());
	}
}

class A {

	public int a;
	public Integer b;

	@Override
	public String toString() {

		return "a: " + a + "; b: " + b;
	}

}

Do metody zostaje przekazana kopia obiektu, która ma wszystkie pola takie same jako oryginał. Kopii zostaje przypisana nowa wartość, ale jest to kopia więc nie jest to zmiana wprowadzona na oryginalnym obiekcie.
W drugim przypadku nowe wartości są przypisywane polom kopii, które to pola są wspólne dla kopii i oryginału:

package com.hp.sis.szkolenia.xml;

public class LongIReferencja {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		A a = new A();
		System.out.println("początek A :" + a.toString());
		a.a = 10;
		a.b = 10;
		System.out.println("nadanie A :" + a.toString());

		metoda(a); // przekazujemy wskaźnik na a, ale zostaje on skopiowany!!!

		System.out.println(a.toString());
	}

	private static void metoda(A a) {
		// a jest kopią tego z main() i wszytkie zmiany są robione w kopii!!!
		A b = new A();

		System.out.println("początek B :" + b.toString());
		b.a = 11;
		b.b = 11;
		System.out.println("nadanie B :" + b.toString());

		a.a = b.a;
		a.b = b.b;
		System.out.println("A = B :" + a.toString());
	}
}

class A {

	public int a;
	public Integer b;

	@Override
	public String toString() {

		return "a: " + a + "; b: " + b;
	}

}

Jest to ciekawostka w javie. Odpowiednie zrozumienie tego mechanizmu pozwala na opanowanie problemów twojego typu.

0

Rozumiem, ze nie mozna kopiowac obiektow, a pola obiektow. Jednak UB jest obiektem i nie posiada pol, poniewaz klasa Long posiada jedynie interfejs. Co w tym wypadku? Czy jest w ogole rozwiazanie konkretnie mojego problemu? Zeby funkcja Branuch_and_Bound zwracala wartosc poprawna?

0

moim zdaniem jesli masz w metodzie instrukcje:
return UB;
to wartoby wynik do czegos przypisac. czyli:

Long wynik = l.Branch_And_Bound(Pi,A,rozw,il,UB);
System.out.println("Wynik"+wynik+" ");

i w rekurencji to samo
pzdr

0

Lepiej:

UB = l.Branch_And_Bound(Pi,A,rozw,il,UB);
0

chcialem zeby bylo czytelniej a wyszlo jak zwykle :-)

0

Koziolek: Dzieki Wielkie. [browar] Teraz wydaje sie to oczywiste, ale przez 8 godzin praktycznie nad gotowym projektem nie moglem na to wpasc :-D . Dziekuje i pozdrawiam. Trzeba sie uczyc od lepszyc ;).

0

czy sprawdzales sciezki przebiegu tego algorytmu ?? czy aby na pewno sytuacja

if ((i == 0) && (LB < UB))
                {
                        UB = LB;
                                                              
                }

zachodzi ?? Czy LB w momencie przypisywania ma wartość inną niż wejściową ?? Może nie szukasz tam gdzie trzeba...

to samo z for (int k=i; k>0; k--) czy na pewno k jest > 0 ? może wchodzisz do metody i zwracasz to samo bo po prostu nie ma opcji, żeby było inaczej

1 użytkowników online, w tym zalogowanych: 0, gości: 1