Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++ Builder] Сетевой график с библиотекой VCL


Автор: xIxFastDeaThxIx 1.12.2009, 11:14
Я студент уже как 4го курса учусь хорошо всё понимаю что объясняют на парах, пропуски только по болезни. Но тут нам задали курсовую работу по Математическим методам (при всём при том что нас многому из етой курсовой даже необучали) нашол идентичное задание из Украинского ВУЗа, всю теорию я уже сделал осталось программу и блок схему нашол в инете картинку программы http://www.free-lance.ru/users/Crichton/viewproj.php?prjid=448042 но ни скачки ни листинга так и ненашол, очень хотелось бы научиться делать такую-же smile, если кто умеет работать с VCL библиотеками и можно ли сделать чтоб программа работала для любого сетевого графика (нахождение мощности начального потока, максимальный поток, "узкое место" -> критический путь) помогите мне пожалуйста а то уже 5 недели до 2 часов ночи сижу, немогу найти хотябы примеров решений эдаких задач, заранее СПАСИБО тем кто хотябы займётся моей трудной задачкой smile 

Автор: xvr 1.12.2009, 14:44
Сделать такую с нуля - очень и очень нетривиальная задача. Советую поискать готовые компоненты к Delphi/Builder (это и есть VCL  smile ), которые умеют рисовать графы. Начать можно с www.torry.ru

Автор: xIxFastDeaThxIx 1.12.2009, 15:19
ето BoxedApp демо версию качать?

Автор: xvr 1.12.2009, 16:15
Это - пошуровать на torry.ru и поискать VCL компоненты с FWS статусом (где то http://www.torry.ru/pages.php?id=197 и http://www.torry.ru/pages.php?id=196)


Автор: dumb 2.12.2009, 02:13
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: xIxFastDeaThxIx 3.12.2009, 13:48
чото я короч совсем затупил, накачал себе книжек и семплов, похожее на мою задачу есть только в Visual C++ или как его там, щас постараюсь сделать что-нибуть на нём (хоть я его впервые вижу) если кто умеет на Visual писать помогите плиз.

Автор: xIxFastDeaThxIx 6.12.2009, 17:42
Щас после пьянок гулянок уселся доделать прогу вот мой листинг посмотрите мне кажется что громоско но хотябы более похоже на правду, заблудился в StrToFloat FloatToStr IntToStr и т.д. smile 
Цитата

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if ((to2->Text<to5->Text)&&(to2->Text<to6->Text)) //to2 , to5 и т.д. ето Edit я для удобства переименовал
{
FloatToStr(sum)=to2->Text;
}
else if ((to5->Text<to2->Text)&&(to5->Text<to6->Text))
{
FloatToStr(sum)=to5->Text;
}
else if ((to6->Text<to2->Text)&&(to6->Text<to5->Text))
{
FloatToStr(sum)=to6->Text;
}
//==============================================================
if ((to3->Text<to52->Text)&&(to3->Text<to6->Text))
{
FloatToStr(sum2)=to3->Text;
}
else if ((to52->Text<to3->Text)&&(to52->Text<to6->Text))
{
FloatToStr(sum2)=to52->Text;
}
else if ((to6->Text<to3->Text)&&(to6->Text<to52->Text))
{
FloatToStr(sum2)=to6->Text;
}
//=============================================================
if (to3->Text<to62->Text)
{
FloatToStr(sum3)=to3->Text;
}
else if (to62->Text<to3->Text)
{
FloatToStr(sum3)=to62->Text;
}
//=============================================================
if (to4->Text<to63->Text)
{
FloatToStr(sum4)=to4->Text;
}
else if (to63->Text<to4->Text)
{
FloatToStr(sum4)=to63->Text;
}
//=============================================================
summa=(sum)+(sum2)+(sum3)+(sum4);
if (Button1->Enabled)
{
Label8->Caption=FloatToStr(summa);
}
}
//---------------------------------------------------------------------------


тут расписаны мои высчеты максимального потока в сети
вот кстати как я сделал само окошко проги
user posted image

Автор: xvr 6.12.2009, 18:40
Компилировать пытался? Мне кажется, что оно не соберется - уж очень дико выглядит  smile 
Да и до 'любого сетевого графика' тут ОЧЕНЬ далеко.

Давай сначала выясним, насколько 'любой' должен быть 'сетевой график' (я так понимаю, что под этим термином подразумевалась конфигурация сети).

Кстати, а визуальную часть от вас требуют? Т.к. она потянет гораздо больше, чем собственно нахождение максимальных потоков и пр.

Автор: xIxFastDeaThxIx 6.12.2009, 19:36
визуальную часть ты видиш сам весь график вручную печатал=) по x y прогресс бары с таймером связал, на компиляцию запускал всё нормально только в лейбл 0 выводит

Автор: xvr 6.12.2009, 21:33
Цитата(xIxFastDeaThxIx @ 6.12.2009,  19:36)
визуальную часть ты видиш сам весь график вручную печатал=) 

Это я заметил  smile Других графиков не ожидается? Или для других графиков будет другая программа?

Цитата

на компиляцию запускал всё нормально только в лейбл 0 выводит
То, что в лэйбл выводит 0 это не удивительно, удивительно то, что оно вообще откомпилировалось  smile 

Эта конструкция
Код

if ((to2->Text<to5->Text)&&(to2->Text<to6->Text))
сравнивает ТЕКСТ в 2х лэйблах, а не числа, которые этот текст представляет. Нужно как минимум делать так
Код

if ((to2->Text.toDouble()<to5->Text.toDouble())&&(to2->Text.toDouble()<to6->Text.toDouble()))

Далее, конструкция
Код

FloatToStr(sum)=to2->Text;
вообще делает непонятно что, надо
Код

sum=to2->Text.toDouble();

Автор: xIxFastDeaThxIx 6.12.2009, 22:21
насчёт разнообразных графиков я переспросил у препода, сказал что можно сделать с изменением значений дуг(рёбер) т.е. с етим разобраться надо. И что делает ф-ция toDouble? я впервые её вижу для справки можно обьяснить плиз?=)
вроде считает только получается много...надо всётаки разобраться с плавающей точкой

Добавлено через 6 минут и 28 секунд
скидываю прогу мот кто допоймёт мои деяния smile 

Автор: xvr 7.12.2009, 16:27
Код просто фиеричный  smile Препа удар хватит (если он конечно не Индус)  smile 
Цитата

И что делает ф-ция toDouble?
Преобразует строку в double
Цитата

насчёт разнообразных графиков я переспросил у препода, сказал что можно сделать с изменением значений дуг(рёбер)
Только значений или наличия или отсуствия их вообще? В частности - мжно ли менять набор узлов и можно ли менять набор дуг? Если можно, то советую сразу застрелится - редактирование графа в GUI задача на ПОРЯДОК более сложная, чем подсчет всего того, чего от вас хотят.

Автор: xIxFastDeaThxIx 8.12.2009, 18:26
Только значения (в Edit) которые набор дуг и их кол-во менять ненадо сетевой график остаётся неизменным, щас работаю над правельным подсчётом максимального потока (нам преподавали одним способом а в инете я вижу совсем другое и больно трудный способ с какими то замутами)
я вёл подсчёД с конспектов ну типа так 

Выбираем произвольные пути из I к S
1)1-2-5-6 = min Cij = 6,3 значит от всего пути отнимаем 6,3 и т.д.
2)1-3-6=min Cij = 8,2
3)1-4-6 min Cij = 5,3
Max = 19,8

т.е. Минимальная пропускная способность каждого потока вычитается из всего пути(остатки пропускной способности (если есть таковые)могут быть пропускной способностью для другого потока).
ну у меня получилось что 19,8 это максимальный поток smile я уже сам запутался
P.S. несмотрите как написан код сёравно пакеты скину да с .exe показывать буду(математические методы как ни как)мне важен щас результат smile 

Автор: xvr 8.12.2009, 20:09
Если 'математические методы как ни как' то и надо делать математическими методами:
  •  Явно закодировать граф, дуги и веса на них (а не размазывать это все по программе)
  •  На полученном графе явно запускать алгоритмы, вычисляющие то, что надо
  •  Эти алгоритмы потребуют разных процедур обхода графа - написать их явно, в виде процедур.
В том, что есть сейчас опознать какие либо алгоритмы практически невозможно  smile 


Автор: xIxFastDeaThxIx 9.12.2009, 09:32
ну и что мне теперь делать ? smile 

Автор: xvr 9.12.2009, 11:20
Цитата(xIxFastDeaThxIx @ 9.12.2009,  09:32)
ну и что мне теперь делать ? smile

Я же писал:
Цитата

 Явно закодировать граф, дуги и веса на них 

Код

#include <vector>
using namespace std;

class TForm1 : ... {
...
 struct GraphEdge;

 struct GraphNode {
   bool visited;
   vector<GraphEdge*> out_edges, in_edges;
   GraphNode() {visited=false;}
 };

 GraphNode nodes[6];

 struct GraphEdge {
   TEdit* weight_edt;
   GraphNode &node_from, &node_to;
   double get_weigth() {return weight_edit->Text.ToDouble();}
   bool visited;
   double real_weight;

   GraphEdge(GraphNode& f, GraphNode& t, TEdit* e): node_from(f), node_to(t) {weight_edit=e; visited=false; real_weight=get_weight();}
 };

 vector<GraphEdge*> edges;

 void add_edge(int from, int to, TEdit* edt)
   {
    GraphEdge* e=new GraphEdge(nodes[from],nodes[to],edt);
    edges.push_back(e);
    nodes[from].out_edges.push_back(e);
    nodes[to].in_edges.push_back(e);
   }

 void create_graph()
  {
   add_edge(1,4,to4);
   add_edge(1,2,to2);
   add_edge(1,3,to3);
   ....
  }

};
После вызова create_graph() (можно прямо в конструкторе формы) у тебя будет нормальный граф. Алгоритмы над ним напиши сам (по методичкам  smile )

Автор: xIxFastDeaThxIx 10.12.2009, 14:02
 smile щас попробую вклеить, правда впервые "Графы" вижу

Автор: xvr 10.12.2009, 14:09
Цитата(xIxFastDeaThxIx @ 10.12.2009,  14:02)
smile щас попробую вклеить, правда впервые "Графы" вижу

Оо!  smile А как же вам тогда преподавали 'вычислительные методы', которые сплошь на этих самых графах и базируются?

Автор: xIxFastDeaThxIx 10.12.2009, 14:46
у нас просто преподают коряво, я сам удивляюсь, мы даже дельфи в руках некрутили(только дома в свободное время) , какие преподаватели таки и познания, а сам всё невыучишь smile .

Автор: xIxFastDeaThxIx 3.3.2010, 15:05
всё граф уже давно сдал и сделал помечаем как решённый smile  спасибо за помощь=)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)