Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2010, 00:22   #1
alexmikt
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 16
По умолчанию simplex метод

Помогите плиз разобраться......Нужно реализовать систему через С++ 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";
}
}
}
alexmikt вне форума Ответить с цитированием
Старый 15.04.2010, 08:59   #2
evgn
Разрабатываюсь....
Пользователь
 
Регистрация: 16.11.2008
Сообщений: 68
По умолчанию

Убрать input_tbl() и заменить
Код:
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=6,n=4;
evgn вне форума Ответить с цитированием
Старый 15.04.2010, 11:10   #3
alexmikt
Пользователь
 
Регистрация: 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";
}
}
}
alexmikt вне форума Ответить с цитированием
Старый 15.04.2010, 11:37   #4
evgn
Разрабатываюсь....
Пользователь
 
Регистрация: 16.11.2008
Сообщений: 68
По умолчанию

А чего он ругается?
Зачем Вы массив tbl с переменными m и n в main засунули?
Поставьте их на место, где они раньше были. Т.е.
Код:
double tbl[257][257]; // симплес-таблица
int m, n, col, row; // m - число столбцов (переменных)
поменять на
Код:
double 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, col, row;
evgn вне форума Ответить с цитированием
Старый 15.04.2010, 12:25   #5
alexmikt
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 16
По умолчанию

Спасибо большое , разобрался вроде ))

да только вот щас прога как то по странному считает, в таблице получается одни 0, ответа не дает......не знаешь в чем ошибка?

Последний раз редактировалось alexmikt; 15.04.2010 в 13:01.
alexmikt вне форума Ответить с цитированием
Старый 16.04.2010, 08:57   #6
evgn
Разрабатываюсь....
Пользователь
 
Регистрация: 16.11.2008
Сообщений: 68
По умолчанию

Просто ты почему-то поменял цифру 6 на цифру 8 .

Код:
int m=6

Последний раз редактировалось evgn; 16.04.2010 в 09:27.
evgn вне форума Ответить с цитированием
Старый 16.04.2010, 10:33   #7
alexmikt
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 16
По умолчанию

да дело паходу не в этом......хоть 6, хоть 8 выводит в таблице одни 0.....
я не врублюсь че за фигня, почему правильно не считает....
Вложения
Тип файла: rar simplex.rar (173.2 Кб, 90 просмотров)
alexmikt вне форума Ответить с цитированием
Старый 16.04.2010, 11:03   #8
evgn
Разрабатываюсь....
Пользователь
 
Регистрация: 16.11.2008
Сообщений: 68
По умолчанию

Ну батенька... внимательнее надо читать, что пишут
Я ж сказал, нужно убрать input_tbl(), т.е. вообще его убрать.
У тебя все равно пытается загрузить все с файла. Отсюда и нули
И m = 6 обязательно.
Вложения
Тип файла: rar simplex_simple.rar (913 байт, 235 просмотров)
evgn вне форума Ответить с цитированием
Старый 16.04.2010, 15:11   #9
alexmikt
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 16
По умолчанию

спасиб большое, будем в проге разбираться, она все таки не считает так как надо, а только выводит таьлицу (((((
alexmikt вне форума Ответить с цитированием
Старый 01.02.2013, 21:19   #10
ezeik
Новичок
Джуниор
 
Регистрация: 04.11.2010
Сообщений: 1
По умолчанию Как определить правильный ответ

Народ, втыкаю в код и не совсем доходит, как он тут правильный ответ выводит, подскажите плизззз
ezeik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод Крамера 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