![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 25.09.2009
Сообщений: 16
|
![]()
Помогите плиз разобраться......Нужно реализовать систему через С++ Builder, simplex методом...Программа работает, но как сделать, чтобы это уравнение было записано в код пргораммы, а не считывалось с файла lptask.txt (т.е. сделать напрямую, без файла)
есть уравнение: 3*x1 + 11*x2 ---> max 3*x1 - 8*x2 =>-30 2*x1 + 7*x2 =<62 1*x1 + 6*x2 =<98 ур-е записано в файл lptask.txt: 3 11 0 0 0 / -3 8 1 0 0 30 / 2 2 7 0 1 0 62 / 3 1 6 0 0 1 98 / 4 / ну и впринципе сам код программы: #include <iostream> #include <fstream> #include <iomanip> #include <string> using namespace std; fstream in( "lptask.txt", ios_base::in ); double tbl[257][257]; // симплес-таблица int m, n, col, row; // m - число столбцов (переменных) // n - число строк (ограничений) // col - ведущий столбец // row - ведущая строка void input_tbl() { // заполнение симплекс-таблицы чтением ввода int i=0, j=0; while(true) { string x; in >> x; if( x == "/" ) { if( j==0 ) break; if( i==0 ) m = j + 1; else { int j1; in >> j1; tbl[i][m+1] = j1; } tbl[i][m] = 0; j = 0; ++i; continue; } tbl[i][j] = atof(x.c_str()); ++j; } n = i; tbl[0][m-1] = 0; tbl[0][m+1] = 0; } void output_tbl() { // выводит таблицу симплекс-метода в удобном для чтения виде for( int i=0; i<n; ++i ) { for( int j=0; j<=m+1; ++j ) { cout << setw(9) << tbl[i][j]; } cout << "\n"; } } void choose_col_row() { // определяет ведущий столбец и ведущую строку col = 0; bool flag = (tbl[0][col] < 0); for( int j=0; j<m; ++j ) { double ci = tbl[0][j]; if( ci<0 && ci<tbl[0][col] ) { flag = true; col = j; } } if( !flag ) { col = -1; row = -1; return; } for( int i=1; i<n; ++i ) { if( tbl[i][m] != 0 ) continue; double den = tbl[i][col]; if( den == 0 ) tbl[i][m] = 1.e100; else tbl[i][m] = tbl[i][m-1]/den; } row = 1; for( int i=1; i<n; ++i ) { if( tbl[i][m] < tbl[row][m] ) row = i; } if( tbl[row][m] >= 1.e98 ) row = -1; } void transform() { double den = tbl[row][col]; for( int j=0; j<m; ++j ) { tbl[row][j] /= den; } for( int i=0; i<n; ++i ) { if( i == row ) continue; double k = tbl[i][col]; for( int j=0; j<m; ++j ) { tbl[i][j] -= k*tbl[row][j]; } } tbl[row][m+1] = col; for( int i=1; i<=n; ++i ) { tbl[i][m] = 0; } tbl[row][m] = 1e100; } bool solve() { // решает задачу - выполняет нужно количество итераций while(1) { cout << "\n"; choose_col_row(); output_tbl(); cout << "col = " << col << "\n"; cout << "row = " << row << "\n"; if( col == -1 ) { cout << "\nnajdeno optimalnoe reshenie\n"; return true; } if( row == -1 ) { cout << "\nluchevoe reshenie\n"; return false; } transform(); } } void main(void) { // главная точка входа input_tbl(); bool flag = solve(); if( flag ) { for( int i=1; i<n; ++i ) { cout << tbl[i][m+1] << " = " << tbl[i][m-1] << "\n"; } } } |
![]() |
![]() |
![]() |
#2 |
Разрабатываюсь....
Пользователь
Регистрация: 16.11.2008
Сообщений: 68
|
![]()
Убрать input_tbl() и заменить
Код:
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 25.09.2009
Сообщений: 16
|
![]()
вроде сделал так, а билдер ругается че то, не хочет работать (((((
void main(void) { tbl[4][8]={ {3, 11, 0, 0, 0, 0, 0, 0}, {-3, 8, 1, 0, 0, 30, 0, 2}, {2, 7, 0, 1, 0, 62, 0, 3}, {1, 6, 0, 0, 1, 98, 0, 4} }; int m=8,n=4; bool flag = solve(); if( flag ) { for( int i=1; i<n; ++i ) { cout << tbl[i][m+1] << " = " << tbl[i][m-1] << "\n"; } } } |
![]() |
![]() |
![]() |
#4 |
Разрабатываюсь....
Пользователь
Регистрация: 16.11.2008
Сообщений: 68
|
![]()
А чего он ругается?
![]() Зачем Вы массив tbl с переменными m и n в main засунули? Поставьте их на место, где они раньше были. Т.е. Код:
Код:
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 25.09.2009
Сообщений: 16
|
![]()
Спасибо большое , разобрался вроде ))
да только вот щас прога как то по странному считает, в таблице получается одни 0, ответа не дает......не знаешь в чем ошибка? Последний раз редактировалось alexmikt; 15.04.2010 в 13:01. |
![]() |
![]() |
![]() |
#6 |
Разрабатываюсь....
Пользователь
Регистрация: 16.11.2008
Сообщений: 68
|
![]()
Просто ты почему-то поменял цифру 6 на цифру 8
![]() Код:
Последний раз редактировалось evgn; 16.04.2010 в 09:27. |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 25.09.2009
Сообщений: 16
|
![]()
да дело паходу не в этом......хоть 6, хоть 8 выводит в таблице одни 0.....
я не врублюсь че за фигня, почему правильно не считает.... |
![]() |
![]() |
![]() |
#8 |
Разрабатываюсь....
Пользователь
Регистрация: 16.11.2008
Сообщений: 68
|
![]()
Ну батенька... внимательнее надо читать, что пишут
![]() Я ж сказал, нужно убрать input_tbl(), т.е. вообще его убрать. У тебя все равно пытается загрузить все с файла. Отсюда и нули ![]() И m = 6 обязательно. |
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 25.09.2009
Сообщений: 16
|
![]()
спасиб большое, будем в проге разбираться, она все таки не считает так как надо, а только выводит таьлицу (((((
|
![]() |
![]() |
![]() |
#10 |
Новичок
Джуниор
Регистрация: 04.11.2010
Сообщений: 1
|
![]()
Народ, втыкаю в код и не совсем доходит, как он тут правильный ответ выводит, подскажите плизззз
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Метод Крамера | miha815 | Помощь студентам | 1 | 06.10.2010 18:28 |
Симплекс метод | bakir | Помощь студентам | 0 | 04.12.2009 00:39 |
Безумно сложные задачки!!!! Метод Гаусса, итераций, метод половинного деления, задача Коши и т.д. | Хомяк!!!!! | Помощь студентам | 4 | 08.07.2009 10:08 |
Метод итераций и метод Зейделя | prikolist | Общие вопросы C/C++ | 40 | 18.06.2009 17:40 |
Метод итераций и комбинированный метод | prikolist | Общие вопросы C/C++ | 2 | 16.06.2009 20:51 |