Avatar billede michdan Nybegynder
15. juli 2005 - 09:49 Der er 9 kommentarer og
2 løsninger

simulering af bevægelse

X hej

Jeg vil gerne kunne simulere en transport bevægelse med henblik på kapacitets problemer.

Problem:
En maskine leverer x antal emner i minuttet ud på en transport strækning på f.eks. 5 transportbånd.
For enden af transportbpndende står en anden maskine der kan modtage y antal emner i minuttet.

Hvis maskinen der modtager emner ikke kan tage fra i samme tempo som maskinen der leverer vil emnerne stille sig i kø på de 5 transportbånd efterhånden som de fyldes, og starte op igen når maskinen der modtager kan følge med igen.

Men hvordan laver man såden en simulering ???

Er der nogen der har prøvet noget ligende eller kender links til steder med simulering af dynamiske fysiske bevægelser ??

alt har interesse...
Avatar billede myplacedk Nybegynder
15. juli 2005 - 10:24 #1
Det er vist en fin øvelse til at lege med OOP og tråde. :)

Ting der skal overvejes:
Jeg går ud fra at maskinerne kører i konstant hastighed under hele simulationen?
Hvor mange emner kan der være på ét transportbånd?
Skal simulationen køre realtime, eller skal den bare kører så hurtigt som muligt ind til fx. alle transportbånd er fyldt, og den første maskine må standste?
Hvad skal man kunne se? Skal der være grafisk brugerflade, eller skal den bare skrive noget tekst ud på konsollen når der sker noget?
Avatar billede michdan Nybegynder
15. juli 2005 - 14:42 #2
svar:
-ja konstant hastighed
-der skal kun være et emne på hvert bånd, bånd er f.eks 600 mm lange

-Ja jeg vil simulere realtime, således at simuleringen viser de faktiske fysiske hændelser.
Ideen er at se hvad der sker hvis den maskine der skal tage fra pludselig går i stå, eller hvis man fylder ind på linien med flere end man kan tage fra.
Hvordan forholder akkumuleringen sig så på de mellemliggende bånd. ??
Hvor hurtig skal maskiner der tager fra køre for at kunne indhente de emner der er akkumuleret ??



-ja havde håbet på at lave noget grafisk, så man kan se emner bevæge sig. Jeg har overvejet om man kune lave en model der simulerer båndtransporten og f.eks hele tiden giver en fysisk position og oven på den kunne man så koble det grafiske, som så følger denne fyske position.
Avatar billede myplacedk Nybegynder
15. juli 2005 - 15:46 #3
Så et transportbånd må kun modtage et element, hvis det er helt tomt? OK.

Simulering af første maskine kunne fx. gøres sådan her (ikke testet):

class Generator extends Thread {
  int SECONDS = 60; // Antal sekunder mellem hvert emne kommer ud af maskinen
  Transportbånd førsteTransportbånd;

  public Generator(Transportbånd førsteTransportbånd) {
    super("Generator");
    this.førsteTransportbånd = førsteTransportbånd;
  }

  public void run() {
    try {
      while (!isInterrupted()) {
        System.out.println("Generator: I gang med at lave næste element.");
        sleep(SECONDS*1000);
        System.out.println("Generator: Element færdigt.");
        if (!førsteTransportbånd.isEmpty()) {
          System.err.println("Generatoren kan ikke komme af med næste element! Venter...");
          // Her kunne der også ske andre ting, fx. at smide elementet væk, eller måske stoppe helt.
          while(!førsteTransportbånd.isEmpty()) {
            førsteTransportbånd.wait();
          }
        }
        førsteTransportbånd.put();
        System.out.println("Generator: Element overført til første transportbånd.");
      }
    } catch (InterruptedException e) {
      System.err.println("Generator afbrudt");
    }
  }
}

Man kan så gøre visning mere fancy. Jeg ville nok lave en klasse til at holde styr på status, lave tekst-baserede "ikoner" (fx. ____ for tomt transport-bånd og _XX_ for brugt transportbånd), lade hver klasse give besked når status ændres, og status-klassen udskriver så ikoner for alle maskiner efter hinanden hver gang der sker en ændring.

BTW: Skal der også tages hensyn til tiden det tager, at overføre noget til/fra transportbånd?

Har du mod på at lave klasser til transportbånd og "anden maskine" (consumer) selve? Eller i hvert fald prøve...
Avatar billede myplacedk Nybegynder
15. juli 2005 - 17:15 #4
Hov, jeg kom til at lave det færdigt. Ikke helt kønt nok til at være skole-eksempel, men det kan det blive. ;-)

Det virker, og i "tegningen" kommer elementerne fra højre til venstre:

public class Consumer extends Thread implements Receiver, StatusItem {
    boolean used = false;
    int SECONDS = 4; // Antal sekunder mellem hvert emne kan modtages;

    public Consumer() {
        super("Consumer");
        Status.addItem(this);
    }

    public boolean isEmpty() {
        return !used;
    }

    public synchronized void put() {
        if (used) {
            while (used) {
                try {
                    wait();
                } catch (InterruptedException e) {
                }
            }
        }
        used = true;
        notifyAll();
        Status.update();
    }

    public void run() {
        while (!isInterrupted()) {
            synchronized (this) {
                while (!used) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        System.err.println(getName() + ": Afbrudt");
                        return;
                    }
                }
                try {
                    sleep(SECONDS*1000);
                } catch (InterruptedException e) {
                    System.err.println(getName() + ": Afbrudt");
                    return;
                }
                used = false;
                Status.update();
                notifyAll();
            }
        }
    }

    public String getStatus() {
        if (used){
            return "_XX_>";
        } else {
            return "___>";
        }
    }
}

class Generator extends Thread implements StatusItem {
    int SECONDS = 3; // Antal sekunder mellem hvert emne genereres
    // ud af maskinen

    Receiver modtager;
    boolean used = false;
   
    public Generator(Receiver modtager) {
        super("Generator");
        this.modtager = modtager;
        Status.addItem(this);
    }

    public void run() {
        try {
            while (!isInterrupted()) {
                synchronized (this) {

                    sleep(SECONDS * 1000);
                    used=true;
                    Status.update();
                    if (!modtager.isEmpty()) {
                        System.err
                                .println("Generatoren kan ikke komme af med næste element! Venter...");
                        // Her kunne der også ske andre ting, fx. at smide
                        // elementet væk, eller måske stoppe helt.
                    }
                    modtager.put();
                    used=false;
                    Status.update();
                }
            }
        } catch (InterruptedException e) {
            System.err.println("Generator afbrudt");
        }

    }

    public String getStatus() {
        if (used){
            return "<_XX_";
        } else {
            return "<__xx";
        }
    }
}

public class Main {

    public static void main(String[] args) {
        int antalBånd = 5;
        Consumer modtager = new Consumer();
        modtager.start();
        Receiver r = modtager;
        Transportbånd t;
        for (int i = 0; i < antalBånd; i++) {
            t = new Transportbånd(r, "Transportbånd " + (antalBånd - i));
            t.start();
            r = t;
        }
        Generator generator = new Generator(r);
        generator.start();
    }
}

public interface Receiver {
    public boolean isEmpty();

    public void put();
}

import java.util.ArrayList;
import java.util.List;
public class Status {

    static Status instance = new Status();
    static List liste = new ArrayList();
   
    private Status() {
       
    }
   
    public static synchronized void addItem(StatusItem item) {
        liste.add(item);
        update();
    }

    public static synchronized void update() {
        for (int i = 0; i < liste.size(); i++) {
            System.out.print(((StatusItem)liste.get(i)).getStatus()+" ");
        }
        System.out.println("");
    }
}

public interface StatusItem {

    public String getStatus();

}

public class Transportbånd extends Thread implements Receiver, StatusItem {
    boolean used = false;

    Receiver modtager;

    public Transportbånd(Receiver modtager, String navn) {
        // modtager er enten næste transportbånd eller maskinen for enden af
        // transportbåndene
        super(navn);
        this.modtager = modtager;
        Status.addItem(this);
    }

    public boolean isEmpty() {
        return !used;
    }

    public synchronized void put() {
        if (used) {
            while (used) {
                try {
                    wait();
                } catch (InterruptedException e) {
                }
            }
        }
        used = true;
        Status.update();
        notifyAll();
    }

    public void run() {
        while (!isInterrupted()) {
            synchronized (this) {
                while (!used) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        System.err.println(getName() + ": Afbrudt");
                        return;
                    }
                }
                modtager.put();
                used=false;
                Status.update();
                notifyAll();
            }
        }
    }

    public String getStatus() {
        if (used){
            return "_XX_";
        } else {
            return "____";
        }
    }
}
Avatar billede michdan Nybegynder
15. juli 2005 - 20:57 #5
hallo....det må jeg nok sige,

Nu er jeg ikke særlig øvet i java, men hvilken compiler har du brugt ??

Jeg vil gerne lige prøve eksempelt og melde tilbage...
Avatar billede myplacedk Nybegynder
15. juli 2005 - 21:41 #6
Jeg bruger bare Suns. Jeg bruger version 1.5, men koden her skulle også fungere fint med 1.4.

For at kompilere skal klasserne lige fordeles i hver sin fil. Dvs. fra "class Generator extends Thread {" og ned til den næste klasse, skal i filen "Generator.java" osv.
De to imports før Status-klassen skal med i Status.java

Jeg kan også smide det hele i en mail til dig, hvis du giver mig adressen.
Avatar billede michdan Nybegynder
15. juli 2005 - 21:46 #7
ok

min mail er michdan@mail.tele.dk
Avatar billede myplacedk Nybegynder
15. juli 2005 - 21:47 #8
Forresten: Når du kigger på output, så kig kun på den sidste linje. Omkring hver anden linje har det samme element to steder, men linjer med den "fejl" bliver lynhurtigt erstattet. :)

Det er som sagt en fin øvelse til at komme i gang med tråde. Prøv at læse en tutorial om tråde i Java, og sammenlign med denne kode.

Hvert simuleret objekt er et Java-object, og kører i sin egen tråd (sådan da, faktisk er det run()-metoden og ikke selve objektet), og kan på den måde "leve sit eget liv" - perfekt til simple simulationer.

Desuden har hver klasse sit eget specifikke ansvar, så der også lidt at lære om at tænke objekt-orienteret.
Avatar billede michdan Nybegynder
15. juli 2005 - 22:21 #9
hej niels

Hvis jeg starter din kode får jeg følgende fejl:

I:\XSOURCE\java>java dk.myplace.eksperten.spm632717.Main
Exception in thread "main" java.lang.NoClassDefFoundError: dk/myplace/eksperten/
spm632717/TransportbÕnd

jeg har også forsøgt at compilere de enkelte sourcekoder men får forskellige fejl ...
i hvilken rækkefølge skal de enkelte filer compileres ??
Avatar billede michdan Nybegynder
15. juli 2005 - 22:38 #10
og lige et spm mere..

de 2 imports i status.java source
import java.util.ArrayList;
import java.util.List;

hvor skal de filer findes ??  når jeg har installeret compiler fra sun ligger der ingen af disse filer ud over i en zip fil med source koder.
Skal man have en sti ind til denne source ??
Avatar billede myplacedk Nybegynder
16. juli 2005 - 09:59 #11
> I:\XSOURCE\java>java dk.myplace.eksperten.spm632717.Main
> Exception in thread "main" java.lang.NoClassDefFoundError: dk/myplace/eksperten/
> spm632717/TransportbÕnd
Jeg har brugt danske bogstaver til navngivning af klasser, noget man normalt fraråder. Det nemmeste er nok at omdøbe dem.

> i hvilken rækkefølge skal de enkelte filer compileres ??
Det kan hurtigt blive et større puslespil. Lad være med at gøre det manuelt, brug et IDE i stedet. Jeg kan anbefale Eclipse http://www.eclipse.org/

> import java.util.ArrayList;
> import java.util.List;
> hvor skal de filer findes ??
Dem finder compileren selv.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester