2013-02-27, 11:22
  #1
Medlem
Hej!

Behöver hjälp med att räkna ut avstånden mellan olika noder med hjälp av att vikta bågarna.
Hur ska en generel kod se ut för att få ut avstånden?
Nedanför är koden för algoritmen, jag har skrivit in "här ska båglängderna vara" i koden för att markera ut vart den nya koden ska in.

Om någon vet hur man löser detta är jag tacksam för lite hjälp.

Mvh

Citat:
package robotcontrol;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class OptPan {

private List<Vertex> nodes;
private List<Edge> edges;
private DataStore ds;

public OptPan(DataStore ds) {
this.ds = ds;

}

public void createPan() {

nodes = new ArrayList<Vertex>();
edges = new ArrayList<Edge>();
// Set up network
for (int i = 0; i < ds.nodes; i++) {
Vertex location = new Vertex("" + (i + 1), "Nod #" + (i + 1));
nodes.add(location);
}

for (int i = 0; i < ds.arcs; i++) {
// här ska båglängderna vara
Edge lane = new Edge("" + (i + 1), nodes.get(ds.arcStart[i] - 1), nodes.get(ds.arcEnd[i] - 1), 1);
edges.add(lane);
}
Graph graph = new Graph(nodes, edges);
DijkstraAlgorithm dijkstra = new DijkstraAlgorithm(graph);
// Compute shortest path
dijkstra.execute(nodes.get(13));
LinkedList<Vertex> path = dijkstra.getPath(nodes.get(23));
// Get shortest path
for (int i = 0; i < path.size();
i++) {
System.out.println(path.get(i));
}
// Arcs in the shortest path
for (int i = 0; i < path.size() - 1; i++) {
for (int j = 0; j < ds.arcs; j++) {
if (ds.arcStart[j] == Integer.parseInt(path.get(i).getId()) && ds.arcEnd[j] == Integer.parseInt(path.get(i + 1).getId())) {
System.out.println("Arc: " + j);
ds.arcColor[j] = 1;
}
}
}
}
}

Citera
2013-03-09, 18:34
  #2
Medlem
dethalvabarnets avatar
OT Humor: Var det du som skrev pathfinding-algorithmen för trafik i Simcity 5?

Ont:
Rörig kod utan indentering eller kommentering.
Kod saknas även.
Ser ut som JME dessutom.
Varför inte A* eller D*-lite?

Skäl för reply -> slöbrowsade SC5 tråden + uttråkad + tittar på min första implementation av A* i nostalgi + snegling på D*-lite.
Citera
2013-04-03, 11:14
  #3
Medlem
Dijkstras algorithm, förmodligen får du inte allt för många svar på den här tråden då det antagligen inte är allt för många ingenjörer här

Function Dijkstra(s : Nodeid) : Nodearray*Nodearray // returns (d, parent)
d = {arraybörjan .... arrayslut} : Nodearray av Reella tal U {infinite} //tentative distance from root
parent = {n1 .... nx} : Nodearray of NodeId
parent[s]:=s //self-loop signals root
Q : NodePQ //Unscanned reached nodes
d[s]:=0; Q.insert(s)

while Q != 0
do
u:=Q.deleteMin //we have d[u] = micro(u)
foreach edge e = (u,v) Epsilon E do
if d[u]+c(e) < d[v] then //relax
d[v]:=d[u]+C(e)
parent[v]:=u //update tree
if v Epsilon Q then Q.decreaseKey(v)
else Q.insert(v)
return (d,parent)
Citera
2013-04-03, 11:15
  #4
Medlem
Citat:
Ursprungligen postat av Sleevemaster
Dijkstras algorithm, förmodligen får du inte allt för många svar på den här tråden då det antagligen inte är allt för många ingenjörer här

Function Dijkstra(s : Nodeid) : Nodearray*Nodearray // returns (d, parent)
d = {arraybörjan .... arrayslut} : Nodearray av Reella tal U {infinite} //tentative distance from root
parent = {n1 .... nx} : Nodearray of NodeId
parent[s]:=s //self-loop signals root
Q : NodePQ //Unscanned reached nodes
d[s]:=0; Q.insert(s)

while Q != 0
do
u:=Q.deleteMin //we have d[u] = micro(u)
foreach edge e = (u,v) Epsilon E do
if d[u]+c(e) < d[v] then //relax
d[v]:=d[u]+C(e)
parent[v]:=u //update tree
if v Epsilon Q then Q.decreaseKey(v)
else Q.insert(v)
return (d,parent)

Efter att ha gjort all denna vackra indentering ville flashback kasta tillbaka dem till hörnet!
Citera
2013-04-03, 12:22
  #5
Medlem
kh31d4rs avatar
Citat:
Ursprungligen postat av Sleevemaster
Efter att ha gjort all denna vackra indentering ville flashback kasta tillbaka dem till hörnet!

Då kanske du använder code eller php taggar nästa gång?
Citera
2013-04-03, 14:34
  #6
Medlem
Citat:
Ursprungligen postat av kh31d4r
Då kanske du använder code eller php taggar nästa gång?

Om jag orkar från min iphone
Citera
2013-04-06, 01:40
  #7
Medlem
Tänkte ifall jag kunde låna tråden liten...

Uppgift: Rita ut en linje mellan två noder(Done), gör linjen klickbar(50%Done), Vissa vikten när man klickar på linjen(Done).

Problem: När jag ritar ut linjen så blir klickområdet alldeles för mycket utanför linjen alternativt hela kartan blir klickbar.

Tror att jag har gjort fel på antingen Räta vinkelns ekvation eller setBounds men stirrat mig blind på programmet i timmar nu, så tänkte ifall en vänlig själ kunde peka mig lite åt rätt håll...


Försökt lösa den utan setBounds men då ritas inte linjen ut...

Mvh, c
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in