mboost-dp1

programering i JAVA!


Gå til bund
Gravatar #1 - bhf05
29. dec. 2007 18:26
hej! jeg har lige et lille problem som jeg ikke helt kan løse!

n = fil.size();

afstande = new Vektor(n);
for (int r = 0 ; r < n ; r ++)
for(int k =0 ; k < r ; k ++)
afs.set(r,fil.get(r).afstand(fil.get(k)));

jeg har tre koordinater: (paranteset betyder ikke noget det er til linien senere at det bruges)

10 30 (0)
50 40 (1)
30 10 (2)

så jeg skal finde afstanden mellem koordinaterne (0,1) , (1,2) og (2,0) altså jeg burde for

(42 36 28)

men det er ikke helt det som jeg få. (hvordan kan jeg så summe de n tal)

Og hvis jeg har nogen andre koordinater
10 20 (0)
50 70 (1)
50 30 (2)

(64 40 41)

så jeg ved ikke helt hvad jeg skal skrive for at jeg for den korteste afstand af de 2.

NB: det som regner afstanden ud er den almindelige afstandsformel for afstanden mellem 2 punkter i xy-planen. Og vektor klassen har jeg også lavet (der indsættes bare tal mellem 2 paranteser [***** ])
Gravatar #2 - myplacedk
29. dec. 2007 19:42
Æh, hvad var problemet siger du? At metoden afstand() ikke regner rigtigt?
Gravatar #3 - bhf05
29. dec. 2007 19:46
ok! nu har jeg fået noget der ligner.

vha disse ting

n = fil.size();

afstande = new Vektor(n);
for (int r = 0 ; r < n ; r ++)
for(int k =0 ; k < r ; k ++)
afs.set(r,fil.get(r).afstand(fil.get(k)));

og

public void enumerate (ArrayList<By> byer ,int i){

if (i >= byer.size() ){

System.out.println("permutation: " + byer);

System.out.println("afstand: " + afs);
} else {

for (int j = i ; j < byer.size(); ++j){

Collections.swap(byer, i, j);

enumerate(byer , i+1);

Collections.swap(byer, j, i);
}

}

}

for jeg nu

10 30 (0)
50 40 (1)
30 10 (2)

og

10 30 (0)
30 10 (2)
50 40 (1)

som passer vha. permutationen.

men når jeg regner sfatanden ud for de 2 for jeg

[0 41 36]

som passer for den øverste men jeg for det samme for den nederste [0 41 36]

hvilket ikke burde være tilfælde.

(så jeg mangler lige afstanden mellem den sidste koordinat og den første og JEG VED IKKE HVAD DER ER GALT MED DEN NEDERSTE)
Gravatar #4 - bhf05
29. dec. 2007 19:47
til #2)

jeg var lige i gang med at skrive da du svarede men ja den regner ikke rigtigt ud!
Gravatar #5 - lorenzen
29. dec. 2007 19:48
Overveje at bruge pastebin eller lign til at henvise til kildekode, det der er ikke videre overskueligt.
Gravatar #6 - bhf05
29. dec. 2007 19:56
ud over at jeg mangler at justere det der står i #3 så mangler lige at summe afstandene i [****] og finde den mindste (DET VED JEG NEMLIG IKKE). jeg skal nemlig køre nogle støre filer og se hvilken af afstandene der er bedst.
Gravatar #7 - bhf05
29. dec. 2007 19:57
der skal stå i paranteset (DET VED JEG NEMLIG IKKE HVORDAN JEG KAN GØRE).

HÅBER VIRKELIG AT DER ER NGEN SOM KAN HJÆLPE MIG!
Gravatar #8 - bhf05
29. dec. 2007 20:18
nu har jeg fået dem udskrevet i denneher rækkefølge
[0 41 36 28] hvilket passer for den øverste permutation men jeg for den samme for den ande så jeg ved ikke helt hvad der er galt. Jeg ved ikke helt hvilken kode jeg skal skrive for at summe disse tal og hvordan jeg så til sidst kan finde den mindste afstand.
Gravatar #9 - myplacedk
29. dec. 2007 20:24
Nu har jeg studeret din kode i flere minutter, og jeg har på fornemmelsen af du er lige så forvirret som jeg er. :)

Har jeg forstået dette rigtigt:

n = fil.size(); [/quote]
fil er en liste med koordinater. Det er ikke en fil, men det kalder du den alligevel.

[code]afstande = new Vektor(n); [/quote]
Denne Vektor kalder du så afs længere nede.

[code]for (int r = 0 ; r < n ; r ++)
for(int k =0 ; k < r ; k ++)
afs.set(r,fil.get(r).afstand(fil.get(k)));

For hver koordinat beregner du afstanden til alle efterfølgende koordinat, og overskriver resultaterne med hinanden.

Forestil dig at n er 3. Hold styr på variablerne (især r og k) på et stykke notespapir, og kør de to løkker igennem i hovedet.

Så sker der et eller andet magisk, hvor metoden enumerate bliver kaldt med nogle argumenter, som er grebet ud af luften. Eller også har du glemt noget væsentligt. :)

enumerate ser ud til at være en rekursiv funktion, som starter ved nul. Men hvad er formålet med den? Det ligner en sortering, men tilsyneladende skal du kun bruge ét tal: Det mindste. Hvorfor så sortere?
Gravatar #10 - myplacedk
29. dec. 2007 20:25
Damn, kom til at klikke mig forbi preview, plejer ikke at bruge tags. :)
Gravatar #11 - bjerh
29. dec. 2007 21:33
Kæft java er det krudsedulle-sprog..
Gravatar #12 - bhf05
30. dec. 2007 18:12
hej!
jeg har sidet og leget med det men kan stadigvæk ikke for det til at fungere.
jeg har fået den til at regne rigtigt med den første permutation hvor:

10 30 (0)
50 40 (1)
30 10 (2)

der for jeg:
[0 41 36 28]

hvilket passer men problemet er at jeg ikke forstå hvorfor denne her permutation:

10 30 (0)
30 10 (2)
50 40 (1)

også giver
[0 41 36 28]

i stedet for

[0 28 36 41]


(Jeg kan godt forstå at afstanden her er den samme da det er ligegyldigt hvilken en man tager først men det bliver anderledes når der kommer flere koordinater så derfor skal jeg summe dem og finde den mindste)
Gravatar #13 - myplacedk
30. dec. 2007 19:03
Jeg kan kun hjælpe, hvis du tager stilling til mine kommentarer. Hvis du ikke kan finde rundt i #9 fordi mine tags er fucked up, kan jeg da godt rette dem.
Gravatar #14 - bhf05
30. dec. 2007 19:22
n = ny.size();

afstande = new Vektor(n);
for (int r = 0 ; r < n ; r ++)
for(int k =0 ; k < r ; k ++)
afsstande.set(r,ny.get(r).afstande(ny.get(k)));

nu har jeg rette i det så der ikke er noget forvering!
(det du skrev i #9 er helt fint)

jeg tror ikke at jeg overskriver resultaterne, bliver de ikke bare puttet ind i afstande. (eller gør jeg måske :-( )

hvad der angår enumerate så er det er rekursiv funktion den første koordinat skal altid være nummer 1 vi må ikke flytte rundt på den. vi må kun flytte på dem fra 1-n (0 indexering).

mit problem er at jeg ikke kan ved hvorfor den udregner det samme 2 gange!
Gravatar #15 - myplacedk
30. dec. 2007 20:04
Jeg piller lige en lille bitte anelse, jeg har også indsat punktummer for at få lidt indrykning:

for (int r = 0 ; r < n ; r ++) {
. for(int k =0 ; k < r ; k ++) {
. . x = ny.get(r).afstande(ny.get(k));
. . afsstande.set(r, x);
. }
}

Stedet du gemmer resultatet, bestemmes i den yderste løkke.
For mig at se kunne du helt droppe den inderste løkke, og bare sætte k = r - 1.

En måde at komme videre kunne være refactoring.
Find på bedre navne til variabler og metoder. Måske skal koden deles op i metoder på en anden måde, for at få gode navne.

Hvis du ikke kan finde på et godt navn, er det et tegn på at du ikke selv helt kender formålet.


Jeg har nu nærstuderet din enumerate-metode. Jeg har ingen anelse om hvad den burde gøre, men så vidt jeg kan se gør den ikke andet end at få tiden til at gå.
Prøv at tænke den igennem igen (især formålet med den!), eller forklar hvad den burde gøre.
Gravatar #16 - bhf05
30. dec. 2007 20:34
ok!
nu har jeg prøvet at skrive det du har ind men det giver stadigvæk det samme som før. begge gange for jeg samme tal ud. Ang enumerate så er det vores lære der har lavet den og den må der ikke laves om på vi skal lave om på print funktionen (inde i enumerate) for at finde længden af den enkelte permutation.

Håber ikke at jeg er alt for besværlig men jeg kan ikke for det til at gå op!
Gravatar #17 - myplacedk
30. dec. 2007 20:47
nu har jeg prøvet at skrive det du har ind men det giver stadigvæk det samme som før.

Det skulle det også gerne, det er er nøjagtigt det samme, bare skrevet på en anelse anderledes måde. Jeg prøvede at gøre det lidt tydeligere at se, at den inderste løkke er spild af tid, da kun resultatet af den sidste gennemkørsel bliver gemt.

Ang enumerate så er det vores lære der har lavet den og den må der ikke laves om på vi skal lave om på print funktionen

Jeg tænkte nok det var en skole-opgave. :)

Anyway:
Jeg kender ikke opgaven. Jeg kender ikke din kode. Hvis du viser mig de to ting kan jeg hjælpe dig.
Jeg skriver ikke opgaven for dig (det ville være at snyde dig og spilde både din og min tid), men jeg vil pege hvilken retning jeg synes du skal gå. Hvad jeg synes du skal koncentrere dig om for at komme videre med ogpaven, hvis du var min elev.
Gravatar #18 - bhf05
30. dec. 2007 21:05
jeg er helt med på hvad du mener! det var heller ikke meneing at der var nogen der skulle lave det, da jeg ikke vil få noget ud af det!

Jeg er ikke så meget for at sætte hele min opgave på internettet.

men tak for hjælpen! jeg tror at jeg ved hvad der er galt!
Gravatar #19 - myplacedk
30. dec. 2007 21:47
Fint. :)

Ellers må du i gang med noget "Divide and conquer" - del opgaven op i mindre opgaver, som kan løses selvstændigt. Fx. den med at beregne afstanden mellem to koordinater er helt oplagt, men den har du vist allerede trukket ud.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login