Login
C- Kod
NEW 03.03.07 18:03
Люди добрые, помогите,
кто хорошо разбирается в А*, Дийкстра-Аlgorithmus и т.д.
Где можно найти Код А* на C (только не C++ или Java)?
Заранее очень признательна
кто хорошо разбирается в А*, Дийкстра-Аlgorithmus и т.д.
Где можно найти Код А* на C (только не C++ или Java)?
Заранее очень признательна
NEW 03.03.07 18:48
in Antwort lena12345 03.03.07 18:03
Не совсем понятно для чего тебе это. И почему С а не С++. Если ты разбираешься в объектно-ориентированном программировании, то тебе не составит труда переделать программу на С++ в программу на С. Тема алгоритмов и структур данных очень обширная. Сомневаюсь, что ты найдешь решение сразу же, будь то один ответ в форуме или какая-то найденная страничка в интернете.
Что конкретно интересует-то?
Что конкретно интересует-то?
http://denis-aristov.ucoz.com
NEW 03.03.07 19:03
in Antwort kashej 03.03.07 18:48
Хм, к сожалению я не очень хорошо разбираюсь в обектно ориентированном програмировании.
Мне нужно написать А* на C, который находит кратчайший путь в Graphe (от Startknoten до Zielknoten). Als Eingabe nimmt er
Knoten, Kanten und Kantengewichte. Пересмотрела все странички в инете, но на C ничего похожего не нашла..
Мне нужно написать А* на C, который находит кратчайший путь в Graphe (от Startknoten до Zielknoten). Als Eingabe nimmt er
Knoten, Kanten und Kantengewichte. Пересмотрела все странички в инете, но на C ничего похожего не нашла..
NEW 03.03.07 19:35
in Antwort lena12345 03.03.07 19:03
Я как-то готовился к экзамену по алгоритмам и структурам данным. Писал разные программы по спискам, деревьям, стэкам и графам. Алгоритм Дийкстры я тоже реализовал. В моем варианте реализации это функция класса Graph.
http://denis-aristov.ucoz.com
NEW 03.03.07 19:54
in Antwort kashej 03.03.07 19:35
А ты не помниш, какие библиотеки в C ты использовал ( или эта функция не из C)?
Я имею ввиду,такие как:
#include <stdio.h>
Что конкретно надо includen?
И где можно найти описание этой функции?
Я имею ввиду,такие как:
#include <stdio.h>
Что конкретно надо includen?
И где можно найти описание этой функции?
NEW 03.03.07 21:04
in Antwort kashej 03.03.07 18:48
Если ты разбираешься в объектно-ориентированном программировании, то тебе не составит труда переделать программу на С++ в программу на С.
------
Ну-ну... например весьма "легко" заменить вывов С++ виртуальной фукнкции... в классе, в котором она не реализована...
------
Ну-ну... например весьма "легко" заменить вывов С++ виртуальной фукнкции... в классе, в котором она не реализована...
NEW 03.03.07 21:30
in Antwort Murr 03.03.07 21:04
Я выразился чересчур обобщенно, не спорю. Просто я ориентировался именно на проблемы алгоритмов и структур данных. Если разбираешься в С++, то большинство этих классических программок по деревьям, стэкам, графам, спискам и т.д. и т.п. можно переделать в С.
http://denis-aristov.ucoz.com
NEW 03.03.07 23:07
in Antwort lena12345 03.03.07 19:54, Zuletzt geändert 03.03.07 23:09 (kashej)
Из стандартной библиотеки я использовал map и set
#include <map>
#include <set>
#include <map>
#include <set>
http://denis-aristov.ucoz.com
04.03.07 00:12
in Antwort lena12345 03.03.07 18:03
Учебное задание? Тогда можно элементарно псевдокод из вики перевести в С - http://de.wikipedia.org/wiki/A%2A-Algorithmus#Algorithmus
Иначе можно просто взять готовую либу из буста - http://www.boost.org/libs/graph/doc/astar_search.html
Иначе можно просто взять готовую либу из буста - http://www.boost.org/libs/graph/doc/astar_search.html
NEW 04.03.07 00:24
in Antwort kashej 03.03.07 21:30
я ориентировался именно на проблемы алгоритмов и структур данных.
-----
Да ну? Ох, и ленив я стал... вот scorpy_ может объяснит что к чему и что тебе изучать...
-----
Да ну? Ох, и ленив я стал... вот scorpy_ может объяснит что к чему и что тебе изучать...
NEW 04.03.07 16:19
in Antwort kashej 03.03.07 23:07
NEW 04.03.07 16:47
in Antwort Chipolino 04.03.07 16:19
STL - Стандартная библиотека шаблонов по русски. Это я и имел ввиду.
http://denis-aristov.ucoz.com
NEW 06.03.07 12:09
in Antwort kashej 04.03.07 16:47
Люди добрые, спасибо за советы,
я к сожалению так и не продвинулась дальше с этим Алгоритмом.
Кто обладает свободным временем и желанием обьяснить это life?
Пишите на емаил: viovio27729@yahoo.de
я к сожалению так и не продвинулась дальше с этим Алгоритмом.
Кто обладает свободным временем и желанием обьяснить это life?
Пишите на емаил: viovio27729@yahoo.de
06.03.07 14:14
in Antwort lena12345 06.03.07 12:09
Давай по порядку.
0. Это что, домашнее задание? Или работа? От этого советы могут весьма различаться.
1. Моя ссылка на вики проработана? Что непонятно?
0. Это что, домашнее задание? Или работа? От этого советы могут весьма различаться.
1. Моя ссылка на вики проработана? Что непонятно?
NEW 06.03.07 17:25
in Antwort scorpi_ 06.03.07 14:14
это типа домашней работы, только очень обьемной
суть состоит в том, чтобы написать А* или лутше Dijkstra на C
Библиотека из буста очень хорошая, но я не очень хорошо разбираюсь в
обектно ориентированном программировании.
Для C я не нашла графических библиотек, поетому решила делать на "doppelt verketteten listen".
Я застряла наверное в самом начале: как запаковать елементы графа (Knoten, Kanten und Kantengewichte) в лист и параллельно Abhängigkeiten
zwischen den Knoten definieren? Так чтобы Algorithmus мог на составленной структуре спокойно искать оптимальный путь
Надеюсь, я не очень путанно написала
суть состоит в том, чтобы написать А* или лутше Dijkstra на C
Библиотека из буста очень хорошая, но я не очень хорошо разбираюсь в
обектно ориентированном программировании.
Для C я не нашла графических библиотек, поетому решила делать на "doppelt verketteten listen".
Я застряла наверное в самом начале: как запаковать елементы графа (Knoten, Kanten und Kantengewichte) в лист и параллельно Abhängigkeiten
zwischen den Knoten definieren? Так чтобы Algorithmus мог на составленной структуре спокойно искать оптимальный путь
Надеюсь, я не очень путанно написала
NEW 06.03.07 23:26
in Antwort lena12345 06.03.07 17:25
Кто ж это над вами так издевается, что заставляет в голом С писать?
Двусвязный список здесь собственно не нужен, можно и односвязным. А можно и массивами, например так:
При этом мы исходим из того, что файл с графом выглядит так:
например
При этом вместо названий городов должны собственно стоять цифры.
Двусвязный список здесь собственно не нужен, можно и односвязным. А можно и массивами, например так:
В ответ на:
struct Edge
{
int target;
int weight;
};
struct Node
{
int node_id;
int edge_number;
Edge* edges;
};
struct graph
{
int node_number;
Node* nodes;
} graph_;
void read_nodes( FILE * graph_file )
{
int node_index, edge_index;
for( node_index = 0; node_index < graph_.node_number; ++node_index )
{
struct Node *node = graph_.nodes[node_index];
if ( 3 != fscanf( graph_file, "%i%i", &node->node_id, &node->edge_number ) ) {
printf( "Syntaxfehler in Graph-Datei - Fehlerhafter Knoteneintrag" );
exit( EXIT_FAILURE );
}
node->edges = ( struct Edge* ) calloc( node->edge_number * sizeof( struct Edge ) );
if ( ! node->edges ) {
printf( "Fehler bei Speicherreservierung" );
exit( EXIT_FAILURE );
}
for( edge_index = 0; edge_index < node->edge_number; ++edge_index )
{
struct Edge *edge = &node->edges[ edge_index ];
if ( 2 != fscanf( graph_file, "%i%i", &edge->target, &edge->weight ) ) {
printf( "Syntaxfehler in STG-Datei - Fehlerhafter Vorgängereintrag" );
exit( EXIT_FAILURE );
}
}
}
}
void read_graph_file( const char* filename )
{
FILE *graph_file = fopen( filename, "r" );
if ( ! graph_file ) {
printf( "Can't open graph-file" );
exit( EXIT_FAILURE );
}
if ( 1 != fscanf( graph_file, "%i", &graph_.node_number ) ) {
printf( "Can't read number of nodes" );
exit( EXIT_FAILURE );
}
graph_.Nodes = (struct Nodes*) calloc( graph_.node_number, sizeof(struct Node) );
if ( ! graph_.nodes ) {
printf( "Can't allocate memory for nodes" );
exit( EXIT_FAILURE );
}
read_nodes( graph_file );
fclose( graph_file );
}
При этом мы исходим из того, что файл с графом выглядит так:
В ответ на:
NodeNumber
NodeA EdgeNumber EdgeA WeightA EdgeB WeightB
NodeB EdgeNumber EdgeA WeightA
например
В ответ на:
3
Berlin 2 Kiel 400 Hannover 250
Hannover 1 Kiel 250
Kiel 0
При этом вместо названий городов должны собственно стоять цифры.
NEW 07.03.07 22:59
in Antwort scorpi_ 06.03.07 23:26
Ой, спасибо большое, это как раз то что нужно !!!!
Очень, очень вам благодарна, очень хороший код!
Очень, очень вам благодарна, очень хороший код!
NEW 10.03.07 11:50
in Antwort lena12345 07.03.07 22:59
scorpi_ скажите, вы этот код сами написали или он уже где-то есть в интернете?
очень хорошее Eingabe, хотелось бы взглянуть на продолжение, если оно у вас есть ...
понимаю, что наглый вопрос, но Betreuer заедает, а Дijkstra еще не готова, и то что я в интернете по Дijkstre
нашла тоже "Segmentation fault" выдает :-(
очень хорошее Eingabe, хотелось бы взглянуть на продолжение, если оно у вас есть ...
понимаю, что наглый вопрос, но Betreuer заедает, а Дijkstra еще не готова, и то что я в интернете по Дijkstre
нашла тоже "Segmentation fault" выдает :-(
NEW 12.03.07 02:29
in Antwort lena12345 10.03.07 11:50
Код мой, хотя и несколько упрощён и подогнан под твою задачу, так как моя задача была совершенно другой - разработка и тестирование ACO (ant colony optimization) алгоритма для нахождения near optimal schedules для параллельных вычислений на кластере. Поэтому мой код тебе ничем не поможет.
Соственно далее тебе нужен priority queue. Это уже сделано, или нет?
Соственно далее тебе нужен priority queue. Это уже сделано, или нет?
NEW 12.03.07 18:15
in Antwort scorpi_ 12.03.07 02:29
Я нашла на wikipedia.de следуюшее Musterlösung для Дийкстры:
#define INFINITY 100000000
struct Kante {
int ziel;
int kosten;
};
struct Knote {
struct Kante* kanten;
int knote_id;
int kante_anzahl;
int distance;
int isDead;
};
struct graph {
int knote_anzahl;
struct Knote* knoten;
} graph_;
void Dijkstra() {
int i, j;
int source = 1000;
struct Knote *zeiger;
for(i = 0; i < nodecount; i++) {
if(i == source) {
zeiger .distance = 0;
zeiger .isDead = 0;
} else {
zeiger .distance = INFINITY;
zeiger .isDead = 0;
}
}
for(i = 0; i < nodecount; i++) {
int next;
int min = INFINITY+1;
for(j = 0; j < nodecount; j++) {
if(!zeiger[j].isDead && zeiger[j].distance< min) {
next = j;
min = zeiger[j].distance;
}
}
for(j = 0; j < zeiger[next].kante_anzahl; j++) {
if(zeiger[zeiger[next].kanten[j].ziel].distance > (zeiger[next].distance + zeiger[next].kanten[j].kosten))
{
zeiger[zeiger[next].kanten[j].ziel].distance =
zeiger[next].distance + zeiger[next].kanten[j].kosten;
}
}
zeiger[next].isDead = 1;
}
for(i = 0; i < nodecount; i++) {
printf("The distance between nodes %ii and %i is %i\n",source, i, zeiger.distance);
}
}
Для этого я расширила Структуту Knoten из вашего Lösunga еше на один Елемент : distance. Насколько я понимаю, в этой Variable сохраняется расстояние от актуальной точки до стартовой точки. В самом начале этой Funktion этой Variable присваивается 0, если речь идет о Стартовой точкев, это вроде логично. Но в следуюшей schleife zeiger[j].distance сравнивается с Variable min. Вот на этом месте мне не особо понятно откуда в zeiger[j].distance должен на этом месте появится Wert, ведь он же до этого нигде не присваивается. Короче этот код выдает „segmentatioin fault“, и ошибка по-моему начинается на этом месте.
Поетому прежде чем я тут совсем мозги сломаю, решила спросить у вас.
#define INFINITY 100000000
struct Kante {
int ziel;
int kosten;
};
struct Knote {
struct Kante* kanten;
int knote_id;
int kante_anzahl;
int distance;
int isDead;
};
struct graph {
int knote_anzahl;
struct Knote* knoten;
} graph_;
void Dijkstra() {
int i, j;
int source = 1000;
struct Knote *zeiger;
for(i = 0; i < nodecount; i++) {
if(i == source) {
zeiger .distance = 0;
zeiger .isDead = 0;
} else {
zeiger .distance = INFINITY;
zeiger .isDead = 0;
}
}
for(i = 0; i < nodecount; i++) {
int next;
int min = INFINITY+1;
for(j = 0; j < nodecount; j++) {
if(!zeiger[j].isDead && zeiger[j].distance< min) {
next = j;
min = zeiger[j].distance;
}
}
for(j = 0; j < zeiger[next].kante_anzahl; j++) {
if(zeiger[zeiger[next].kanten[j].ziel].distance > (zeiger[next].distance + zeiger[next].kanten[j].kosten))
{
zeiger[zeiger[next].kanten[j].ziel].distance =
zeiger[next].distance + zeiger[next].kanten[j].kosten;
}
}
zeiger[next].isDead = 1;
}
for(i = 0; i < nodecount; i++) {
printf("The distance between nodes %ii and %i is %i\n",source, i, zeiger.distance);
}
}
Для этого я расширила Структуту Knoten из вашего Lösunga еше на один Елемент : distance. Насколько я понимаю, в этой Variable сохраняется расстояние от актуальной точки до стартовой точки. В самом начале этой Funktion этой Variable присваивается 0, если речь идет о Стартовой точкев, это вроде логично. Но в следуюшей schleife zeiger[j].distance сравнивается с Variable min. Вот на этом месте мне не особо понятно откуда в zeiger[j].distance должен на этом месте появится Wert, ведь он же до этого нигде не присваивается. Короче этот код выдает „segmentatioin fault“, и ошибка по-моему начинается на этом месте.
Поетому прежде чем я тут совсем мозги сломаю, решила спросить у вас.