Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

C- Kod

347  1 2 все
lena12345 прохожий03.03.07 18:03
NEW 03.03.07 18:03 
Люди добрые, помогите,
кто хорошо разбирается в А*, Дийкстра-Аlgorithmus и т.д.
Где можно найти Код А* на C (только не C++ или Java)?
Заранее очень признательна
#1 
kashej завсегдатай03.03.07 18:48
kashej
03.03.07 18:48 
в ответ lena12345 03.03.07 18:03
Не совсем понятно для чего тебе это. И почему С а не С++. Если ты разбираешься в объектно-ориентированном программировании, то тебе не составит труда переделать программу на С++ в программу на С. Тема алгоритмов и структур данных очень обширная. Сомневаюсь, что ты найдешь решение сразу же, будь то один ответ в форуме или какая-то найденная страничка в интернете.
Что конкретно интересует-то?
http://denis-aristov.ucoz.com
#2 
lena12345 прохожий03.03.07 19:03
NEW 03.03.07 19:03 
в ответ kashej 03.03.07 18:48
Хм, к сожалению я не очень хорошо разбираюсь в обектно ориентированном програмировании.
Мне нужно написать А* на C, который находит кратчайший путь в Graphe (от Startknoten до Zielknoten). Als Eingabe nimmt er
Knoten, Kanten und Kantengewichte. Пересмотрела все странички в инете, но на C ничего похожего не нашла..
#3 
kashej завсегдатай03.03.07 19:35
kashej
NEW 03.03.07 19:35 
в ответ lena12345 03.03.07 19:03
Я как-то готовился к экзамену по алгоритмам и структурам данным. Писал разные программы по спискам, деревьям, стэкам и графам. Алгоритм Дийкстры я тоже реализовал. В моем варианте реализации это функция класса Graph.
http://denis-aristov.ucoz.com
#4 
lena12345 прохожий03.03.07 19:54
NEW 03.03.07 19:54 
в ответ kashej 03.03.07 19:35
А ты не помниш, какие библиотеки в C ты использовал ( или эта функция не из C)?
Я имею ввиду,такие как:
#include <stdio.h>
Что конкретно надо includen?
И где можно найти описание этой функции?
#5 
Murr коренной житель03.03.07 21:04
Murr
NEW 03.03.07 21:04 
в ответ kashej 03.03.07 18:48
Если ты разбираешься в объектно-ориентированном программировании, то тебе не составит труда переделать программу на С++ в программу на С.
------
Ну-ну... например весьма "легко" заменить вывов С++ виртуальной фукнкции... в классе, в котором она не реализована...
#6 
kashej завсегдатай03.03.07 21:30
kashej
NEW 03.03.07 21:30 
в ответ Murr 03.03.07 21:04
Я выразился чересчур обобщенно, не спорю. Просто я ориентировался именно на проблемы алгоритмов и структур данных. Если разбираешься в С++, то большинство этих классических программок по деревьям, стэкам, графам, спискам и т.д. и т.п. можно переделать в С.
http://denis-aristov.ucoz.com
#7 
kashej завсегдатай03.03.07 23:07
kashej
NEW 03.03.07 23:07 
в ответ lena12345 03.03.07 19:54, Последний раз изменено 03.03.07 23:09 (kashej)
Из стандартной библиотеки я использовал map и set
#include <map>
#include <set>
http://denis-aristov.ucoz.com
#8 
  scorpi_ скептик04.03.07 00:12
NEW 04.03.07 00:12 
в ответ 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
#9 
Murr коренной житель04.03.07 00:24
Murr
NEW 04.03.07 00:24 
в ответ kashej 03.03.07 21:30
я ориентировался именно на проблемы алгоритмов и структур данных.
-----
Да ну? Ох, и ленив я стал... вот scorpy_ может объяснит что к чему и что тебе изучать...
#10 
  Chipolino местный житель04.03.07 16:19
NEW 04.03.07 16:19 
в ответ kashej 03.03.07 23:07
В ответ на:

Из стандартной библиотеки я использовал map и set

STL уже в стандарт C ввели ?
#11 
kashej завсегдатай04.03.07 16:47
kashej
NEW 04.03.07 16:47 
в ответ Chipolino 04.03.07 16:19
STL - Стандартная библиотека шаблонов по русски. Это я и имел ввиду.
http://denis-aristov.ucoz.com
#12 
lena12345 прохожий06.03.07 12:09
NEW 06.03.07 12:09 
в ответ kashej 04.03.07 16:47
Люди добрые, спасибо за советы,
я к сожалению так и не продвинулась дальше с этим Алгоритмом.
Кто обладает свободным временем и желанием обьяснить это life?
Пишите на емаил: viovio27729@yahoo.de
#13 
  scorpi_ скептик06.03.07 14:14
NEW 06.03.07 14:14 
в ответ lena12345 06.03.07 12:09
Давай по порядку.
0. Это что, домашнее задание? Или работа? От этого советы могут весьма различаться.
1. Моя ссылка на вики проработана? Что непонятно?
#14 
lena12345 прохожий06.03.07 17:25
NEW 06.03.07 17:25 
в ответ scorpi_ 06.03.07 14:14
это типа домашней работы, только очень обьемной
суть состоит в том, чтобы написать А* или лутше Dijkstra на C
Библиотека из буста очень хорошая, но я не очень хорошо разбираюсь в
обектно ориентированном программировании.
Для C я не нашла графических библиотек, поетому решила делать на "doppelt verketteten listen".
Я застряла наверное в самом начале: как запаковать елементы графа (Knoten, Kanten und Kantengewichte) в лист и параллельно Abhängigkeiten
zwischen den Knoten definieren? Так чтобы Algorithmus мог на составленной структуре спокойно искать оптимальный путь
Надеюсь, я не очень путанно написала
#15 
  scorpi_ скептик06.03.07 23:26
NEW 06.03.07 23:26 
в ответ 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


При этом вместо названий городов должны собственно стоять цифры.
#16 
lena12345 прохожий07.03.07 22:59
NEW 07.03.07 22:59 
в ответ scorpi_ 06.03.07 23:26
Ой, спасибо большое, это как раз то что нужно !!!!
Очень, очень вам благодарна, очень хороший код!
#17 
lena12345 прохожий10.03.07 11:50
NEW 10.03.07 11:50 
в ответ lena12345 07.03.07 22:59
scorpi_ скажите, вы этот код сами написали или он уже где-то есть в интернете?
очень хорошее Eingabe, хотелось бы взглянуть на продолжение, если оно у вас есть ...
понимаю, что наглый вопрос, но Betreuer заедает, а Дijkstra еще не готова, и то что я в интернете по Дijkstre
нашла тоже "Segmentation fault" выдает :-(
#18 
  scorpi_ скептик12.03.07 02:29
NEW 12.03.07 02:29 
в ответ lena12345 10.03.07 11:50
Код мой, хотя и несколько упрощён и подогнан под твою задачу, так как моя задача была совершенно другой - разработка и тестирование ACO (ant colony optimization) алгоритма для нахождения near optimal schedules для параллельных вычислений на кластере. Поэтому мой код тебе ничем не поможет.
Соственно далее тебе нужен priority queue. Это уже сделано, или нет?
#19 
lena12345 прохожий12.03.07 18:15
NEW 12.03.07 18:15 
в ответ 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“, и ошибка по-моему начинается на этом месте.
Поетому прежде чем я тут совсем мозги сломаю, решила спросить у вас.
#20 
1 2 все