Gå til innhold

Fred7555

Medlemmer
  • Innlegg

    1 381
  • Ble med

  • Besøkte siden sist

Innlegg skrevet av Fred7555

  1. Tror den indre loopen ikke fungerer slik du har tenkt.

     

    Husk at uttrykket blir sjekket etter hver loop, som betyr at et nytt tall blir generert for hver sjekk.

    Så hvis det tallet er lavere enn j, så vil loopen stoppe opp.

    Sannsynligheten for å alltid få høye tall er veldig lav.

     

    Om du heller oppretter en midlertidig variabel i 1. loop som genererer tallet, så vil det funke.

    Noe ala:

     

     

    import java.util.*;
    public class Exercise05 {
    
    public static void main(String[] args) {
     randomLines();
    }
    public static void randomLines() {
     Random rand = new Random();
     String chars = "abcdefghijklmnopqrstuvwxyz";
     int lines = rand.nextInt(5) + 5;
     int maxCh = 80;
     for(int i = 1; i <= lines; i++) {
      int randNumb = rand.nextInt(maxCh);
      for(int j = 1; j <= randNumb + 1; j++) {
    System.out.print(chars.charAt(rand.nextInt(26)));
      }
      System.out.println();
     }
    }
    
    }

     

     

  2. Hei, har støtt på et problem jeg ikke helt skjønner.

     

    Jeg holder på å løse sudoku via brute-force, som skjer i klassen Square (hver rute har en neste-peker).

    Når en løsning lagres, så lagrer brettet det i en SudokuContainer (brett har et to-dimensjonalt array av ruter, og en peker til beholderen).

    Den metoden blir kalt i klassen rute.

     

    Slik ser metoden ut i Square:

     

     

    public void fillInnRemainingOfBoard() {
     if (this instanceof PrefilledSquare) {
      if (next == null)
    board.saveSolution();
      else
    next.fillInnRemainingOfBoard();
     }
    
     else {
      for (int value = 1; value <= board.getLength(); value++) {
    if (legalValue(value)) {
     this.value = value;
     if (next == null)
      board.saveSolution();
     else
      next.fillInnRemainingOfBoard();
    }
      }
      this.value = 0;
     }
    }

     

     

     

    Slik lagres løsningen:

     

     

     public void saveSolution() {
     solutions.insert(squares);
     sc.updateSolutions();
    }

     

     

     

    Slik blir det lagret i SudokuContainer:

     

    public boolean insert(Square[][] solution) {
     String[][] temp = new String[solution.length][solution[0].length];
     for (int i = 0; i < temp.length; i++) {
      for (int j = 0; j < temp[i].length; j++) {
    temp[i][j] = solution[i][j].getStringValue();
      }
     }
     return solutions.add(temp);
    }
    

     

     

    Selve metoden som begynner, ser slik ut:

     

     

     public void solveBoard() {
     squares[0][0].fillInnRemainingOfBoard();
    }

     

     

     

    Metoden over blir kalt i doInBackground() i SwingWorker, som ser slik ut:

     

     

    @Override
    protected Void doInBackground() {
     System.out.println("began");
     mf.updateStatus("Working...");
     board.solveBoard();
     return null;
    }
    
    @Override
    public void done() {
     System.out.println("finished");
     mf.doneSolving();
     board.getSolutions().print();
    }
    

     

     

     

    Ideén er at SwingWorker skal starte en ny thread med løsningen, så skal GUI vises, så skal løsninger oppdateres på GUI imens de blir funnet, og til slutt blir done() i SwingWorker kalt som oppdaterer status på GUI til ferdig.

    Det funker på store brett som tar tid.

     

    Problemet er at om sudokuen er veldig liten/går fort å løse, så ser det ikke ut som at alle løsningene blir lagret.

    F.eks. en 6x6 som skal ha 28 løsninger, skifter mellom 1 og 28 løsninger hver gang.

    Og f.eks. en tom 4x4 som skal ha 288 løsninger, for én løsning.

     

    Om jeg gjør noe som tar litt tid i fillInnRemainingOfBoard() i Square (regner ut noe, skriver ut noe via System.out.println() eller lignende), så klarer den å regne det ut.

     

    Slik jeg ser det, så klarer den å regne ut alt, men løsningene får ikke tid til å bli lagret i beholderen.

    Så vidt jeg vet, så skjer alt det på samme tråden (worker thread), så selve utførelsen av utregningen skulle skje sekvensielt, så alt skulle bli lagret.

    Men det skjer altså ikke.

     

    Noen som ser noen feil eller har forslag til løsning?

     

    Takk :)

  3. Fant ut feilen med koden min.

     

    Den i 1. eksempel skrev seg selv til 0 uansett etterpå, og eneste måten å lagre verdiene var en exception, da den hoppet ut av stacken.

     

    Den i 2. eksmpel oppførte seg likt, siden jeg lagret løsningen i Board-klassen, og Square alt hadde tilbakestilt seg når det var gjort.

     

    Eksempelet over funket bra, og klarer å finne alle løsninger.

    Takk for hjelpen :)

  4. Det kan ha rett med at det kun tar lang tid. Siden 9x9 kun brukte 1 sekund, testet jeg bare rundt 10 sekunder. Vil la den gå en god stund for å teste. Du hadde rett, den klarte det etter en stund.

     

    Har planer om å innføre raskere algoritmer, men slik oppgaven er definert så skal brute-forcing brukes. Så må få den til før jeg begynner med andre algoritmer.

     

    Tenker noe ala det samme med å alle løsninger, men sliter med å finne hvordan å begynne på neste.

    Si at jeg nå har funnet en løsning, og på den siste ruten. Jeg kan da komme meg tilbake til den 1. ruten, men hvordan vet jeg hvilken verdi den brukte?

    Må jeg ha en slags liste med alle verdier alle rutene ha brukt, for å så øke den 1. med en?

    Om jeg eventuelt finner en til løsning slik, så er det kanskje en til løsning med at rute x og rute y kan bytte verdier i slutten av brettet.

     

    Kan være mye enklere enn det jeg tenker, men klarer ikke å finne noe gjennomførbar metode akkurat nå.

  5. Hei, har nå i oppgave å løse en sudoku via brute-force.

     

    Så vidt jeg vet, er den beste måten å bruke recursive backtracking, siden du må ha muligheten til å kunne bevege deg bakover om du finner ikke-løsbare ruter.

     

    Har prøvd litt på dette nå, og får det ca. til å funke, og det ser slik ut hittil:

    Med rad-og kolonnenummer:

     

     

    http://pastebin.com/9xBC3jt5

     public void solveWithout(int row, int col) {
     if(row > squares.length - 1) {
      solutions.insert(squares);
      return;
     }
     if(squares[row][col] instanceof PrefilledSquare)
      nextWithout(row, col);
     else {
      for (int value = 1; value <= squares.length; value++) {
    	  if(squares[row][col].legalValue(value)) {
    		  squares[row][col].setValue(value + "");
    		  nextWithout(row, col);
    	  }
      }
    	  squares[row][col].setValue(0 + "");
     }
    }
    
    public void nextWithout(int row, int col) {
     if(col < squares.length - 1)
      solveWithout(row, ++col);
     else
      solveWithout(++row, 0);
    }

     

     

     

    Med neste-peker i Square:

     

     

    http://pastebin.com/6RssQBfc

     public void fillInnRemainingOfBoard() throws Exception {
     if (next == null && this.legalValue(this.getNumericValue()))
      return;
    
     if (this instanceof PrefilledSquare)
      next.fillInnRemainingOfBoard();
     else {
      for (int value = 1; value <= row.getLength(); value++) {
    if (legalValue(value)) {
     value = value + "";
     next.fillInnRemainingOfBoard();
    }
      }
      value = 0 + "";
     }
    }

     

     

     

    Men jeg har problemer med 3 ting:

    - Eneste muligheten å "lagre" løsningen på, er å møte på en exception (enter å kaste selv eller å ha feil i koden). Om jeg bare bruker return og lar den avslutte seg selv, oppdateres ikke value i Square. Dette skjønner jeg ikke helt hvorfor skjer, da jeg kan sa at verdiene lagres om jeg skriver de ut inni metoden.

     

    - Jeg skal finne alle mulige løsningen for brett. Jeg har klart å finne 1 løsning nå, men jeg er usikker hvordan jeg skal finne alle. Slik jeg har det nå, så avslutter den om den er på siste rute og verdien stemmer, fordi da er brettet utfylt.

    Tenker at jeg må få den til å begynne på nytt med kanskje en høyere verdi eller lignende, men klarer ikke å finne en god måte å løse det på.

     

    - Koden klarer 6x6 og 9x9-brett, men fortsetter i det uendelige om den får høyere. Alt er dynamisk i forhold til det den leser inn, og i koden er A = 10, B = 11 ol., så usikker hvorfor den ikke klarer de, da selve metoden er akkurat lik.

    Square har en value (som er String) og to metoder, getValue() og getNumericValue(), og den siste er brukt for sjekking om lovlige tall.

     

    Noen som ser problemer med koden eller har ideer til løsninger på problemene?

     

    Takk :)

  6. Har bare en beholder (som holder personer, som igjen holder bilene i sine egne beholdere), så ignorerer alle ikke-eide biler i innlesingen.

     

    Slik ble resultatene på programmet jeg leverte inn:

     

    -----------------------------------------------

    STATESTICS:

    -----------------------------------------------

    [Persons]

    Just persons: 197

    Owners: 278

    Just Owners: 262

    Mechanics: 98

    Just Mechanics: 82

    Owners and Mechanics: 16

    Total Persons: 557

     

    [Vehicles after calculating tax. Vehicles with no owners are ignored]

    Cars: 288

    Trucks: 35

    Buses: 65

    Vehicles: 388

     

     

     

     

    Har ikke sett så altfor mye over de, men tror de er omtrent riktige.

  7. De som er kun under personer, og ikke under mekanikere eller eierskap, er personer.

    Resten er der de hører hjemme (mekaniker, eier eller begge).

    Det finnes både personer kun under Personer, noen kun i Mekaniker, noen i Personer og Mekaniker osv.

    Litt sjekking må til for å få til riktig mengde :p

     

    Ja, lister kun opp kjøretøy med eier, da det er 400 eierskap i alt (69 biler uten eier).

     

    Når jeg teller opp antall, går jeg bare gjennom listen å sjekker alt innholdet.

    Tallene over er fra en eldre versjon, så usikker om de stemmer.

     

    Kan poste de nye resultatene når jeg gjør den ferdig i morgen, og se om vi får likt til slutt.

  8. Har også gjort det slik, bare en klasse Person med booleans og metoder som sier hvilken rolle de har.

    Leser da inn filene slik at jeg i konstruktøren sier om de er eier eller mekaniker (eller begge).

    Ifølge foreleseren, skal du egentlig ha en superklasse Person, med 3 underklasser, da Mekaniker, Eier og MekanikerOgEier. Så skal du lese filen fra toppen og legge inn alle personene, og deretter lese videre med mekaniker ol. Om du finner en mekainer, så skal personen slettes, og du skal opprette et nytt mekainer-objekt, og legge det inn i listen.

     

    Gjorde som sagt ikke slik selv, da jeg følte å oprette og slette objekter føltes feil og tungvindt.

     

    Ikke sikker om det jeg har stemmer, men dette fikk hvertfall jeg (kjøretøy er før beregnTaks-metoden, og mekaniker- og eier-tallene er de som har en mekaniker/eier-egenskap):

    Owners: 278

    Mechanics: 98

    Owners and Mechanics: 16

    Total Persons: 392

    Cars: 296

    Trucks: 36

    Buses: 68

    Vehicles: 400

    Total vehicles (includes vehciles with no owners): 469

     

    Kjedelig å måtte oversatte alle metodene til norsk :(

  9. Tror de fleste retninger innenfor informatikk har INF1000 første semester, noe som er Introduksjon til objektorientert programminger Java.

    Så hvis du lærer deg litt generell Java, så er du godt forbredt, og hvis du eventuelt skal ha et annen språk, er det lett å sette seg inn i det om du har den rette tankegangen og kunnskapen.

     

    Bare være obs på at om du lærer deg mye, så vil starten gå veldig sakte.

    Det er ingen krav om programmering fra før, så starten er helt fra starten, og går sakte fremover.

    Hvis du vil begynne nå, så bare begynn, men vær obs på at starten kan bli litt kjedelig innenfor det faget.

  10. Har nå møtt to problemer som gjør at løsningen med forskjellige interfaces ikke funker.

     

    - Jeg må kunne sjekke hvilken rolle en person har, f.eks. om personen er ansatt eller student.

     

    Prøvde først med instance of, men den ser kun ut til å sjekke om interfaces er implementert i klassen.

    Alle interfacesene er jo implementert, bare objektet/pekeren av av typen interfaces, så metoden returnerer true uansett hvilket av interfacene jeg tester.

     

    - Alle objektene skal kunne legges inn i en beholder, f.eks. HashMap eller en List.

    Om jeg f.eks. bruker klassen Person som parameter, så vil den kun akseptere objekter av Person eller dens subklasser, og ikke objekter av typen interface som Person implementerer.

    Om de skal inn i listen, så må de kastes til Person, noe som gjør fjerner spesialiseringen/interface-pekeren, som jeg må ha.

     

    Finnes det noen gode løsninger på problemene ovenfor, slik at jeg kan fortsette metoden med interface?

     

    Eller må jeg bruke super- og subklasser igjen?

    - Hvis ja, hva er en god måte å løse det på, mens det samtidig overholder kravene?

     

    Sammendrag av kravene:

     

     

    Programmet skal holde rede over personer. Person kan være ansatte, studenter, begge deler, eller ingen av delene.

    Ansatte skal ha en liste av alle sine studenter, ha en metoder for å legge til og fjerne fra denne listen, og ha en metode for å undervise.

    Studenter skal ha en metode for å undervise, men om de blir tatt for det (i en sjekk i slutten av programmet), så skal noe skje.

     

    Slik jeg tenker, så må jeg kunne skille hvilken rolle de har, slik de bare kan ha tilgang til det de skal ha.

    Må også kunne sjekke hvilken rolle de har.

    De må også kunne legges inn i en generisk liste.

     

     

     

    Takk for hjelpen :)

  11. Etter litt tenking, tror jeg at jeg har kommet fram til en brukbar løsning.

    Men en ting jeg lurer på.

     

    Jeg velger å kun ha én klasse, Person, istedenfor å ha en superklasse og subklasser.

    Person implements IAnsatt, IStudent, slik at den har metodene som trengs.

    Når jeg lager objektet, så lager jeg enten av type IAnsatt, IStudent eller Person.

    På den måten har den bare adgang til de metodene som er ment for typen.

     

    Men siden det er mulig å være verken ansatt eller student, så må jeg ha en mulighet for at objektet ikke skal ha adgang til noen av metodene.

    Hittil har jeg laget et tomt interface, implementert det i Person, og bruker det om personen er verken student eller ansatt.

    Men usikker på om det er den beste måten?

     

    Tenkte også litt på å ha diverse boolean og metoder for å bestemme typen(ansatt, student, begge eller ingen), men da må jeg sjekke i hver metode hvilken rolle objektet har + at det har tilgang til metodene.

    I mitt hode virker metoden med interface bedre.

     

    Virker metoden min hittil (med ineterface) som en god/brukbar metode?

    Og hvis ja, er metoden med et tomt interface den beste måten å lage objetet uten noen roller, men samtidig av klassen Person?

     

    Takk for hjelpen hittil :)

  12. Hadde tenkt noe lignende i starten, men i oppgaven er det noen krav slik at det dessverre ikke er mulig, som jeg glemte å nevne.

     

    Det kreves at det er subklasser (og eventuelt interfaces) i hirakiet.

    Og en ansatt skal ha en liste over sine studenter (ansatt som lærer/underviser/professor), og det er bare ansatt som skal ha en slik liste, ingen andre.

    Om jeg da bare har alt i en klasse, med metoder og variabler som bestemmer tilstanden, så vil fremdeles ansatt ha en slik liste(kan "gjemme" den, men den vil fremdeles være der).

  13. Hei, står litt fast på hvordan jeg skal lage et godt klassehiraki med lignende beskrivelser/funksjoner.

     

    Systemet skal ta hånd om personer.

    Noen er ansatt, noen er studenter, noen er begge og andre er ingen.

     

    Slik jeg har tenkt hittil, så har vi en superklasse Person, med to subklasser Ansatt og Student. Om du verken er ansatt eller student, er du en person.

     

    Men det jeg sliter med er hvis du er begge, og dermed trenger variabler og metoder fra klasser(her Ansatt og Student).

    Kan alltids lage en 3. klasse, AnsattOgStudent og extende Person, men da blir det mye duplikat av kode + jeg synes det blir helt feil.

     

    Tenkte litt på å ha noe i et interface, men variabler ol. blir automatisk public, static, final så vidt jeg husker, så da funker ikke det.

    Føler også det blir litt feil.

     

    Det jeg helst vil ha, er en klasse, AnsattOgStudent, som arver fra både Ansatt og Student.

    Har da enkelt tilgang til alt som trengs, blir ikke my duplikat av kode, og kan enkelt sjekke hvem som er hvem, men usikker på hvordan det skal lages/gjøres.

     

    Noen som er noen forslag til en god måte å få til dette på?

  14. Har ikke spilt så mye enda (en i lvl 25 og en i 66), men slik jeg ser kommer det an på.

     

    Vet du at et spesielt skill bare fungerer med et type våpen, og du bygger rundt det, så er det greit å fokusere på det.

    Eller om du vet at et spesielt våpen fungerer best med skillsene du har valgt, så er det også greit.

     

    Men om du ikke vet akkurat hvilket type våpen du kommer til å ende opp med, er det kanskje mest å velge de generelle typene (1h, 2h ol.).

     

    Nå vet ikke jeg om de generelle nodene er like gode som de passive, eller bedre/dårligere, så du må nesten tenke i fremtiden, sjekke skillsene og våpnene, sjekke nodene og se hva som er verdt/best.

×
×
  • Opprett ny...