Автор работы: Пользователь скрыл имя, 17 Апреля 2014 в 08:19, курсовая работа
Цель курсового проекта: решение задачи нахождения кратчайшего маршрута методами динамического программирования.
Задачи:
Изучить основы линейного программирования;
Изучить модифицированный симплекс-метод решения задач линейного программирования;
Решить поставленную задачу модифицированным симплекс методом
Реализовать решение поставленной задачи на ЭВМ.
Интернет ресурсы
Блок-схема алгоритма симплекс-метода
Приложение B
Код программы
int CSimpleks::iteration()
{
//Возвращаемые значения:
//1 - решение найдено
//-1 - решений нет
//0 - итерация закончилась успешно
int o_Col=-1; //Опорный столбик
int o_Row=-1; //Опорная строка
float o_Col_temp=0; //
float o_Row_temp=-1; //
//Находим опорный столбик
for(int i=0; i<(size_small.x-1); i++)
{
if(!horzX[i].is_used) continue; //Если базовая переменная сверху, пропустить
if( (matrix[size.y-1][i]<0) && //Элемент меньше нуля
(matrix[size.y-1][i]<o_Col_
{
o_Col_temp=matrix[size.y-1][i]
o_Col=i; //Индекс столбика равен счетчику цикла
}
}
if(o_Col==-1) return 1; //Если отрицательных элементов нет, решение найдено
BOOL is_positive=FALSE; //Есть ли положительные значения в опорном столбике
//---Ищем положительные значения в опорном столбике---
for(int i=0; i<size_small.y; i++)
{
if(matrix[i][o_Col]>0)
{
is_positive=TRUE;
o_Row_temp=matrix[i][size.x-1]
o_Row=i;
break;
}
}
if(!is_positive) return -1; //Положительных значений нет
//Находим опорную строчку
for(int i=0; i<size_small.y; i++)
{
if(matrix[i][o_Col]>0)
{
is_positive=TRUE;
if((matrix[i][size.x-1]/
{
o_Row_temp=(matrix[i][size.x-
o_Row=i;
}
}
}
if(o_Row==-1) return -1; //Если положительных элементов нет, решений нет
//Копируем bi в неиспользуемый более столбец matrix
for(int i=0; i<size.y; i++)
{
matrix[i][size_small.x-1]=
}
//Создаем новую таблицу
float ** chart=new float*[size.y];
for(int i=0; i<size.y; i++)
{
chart[i]=new float[size_small.x];
}
//Заполняем новую таблицу
for(int i=0; i<size.y; i++)
{
for(int j=0; j<size_small.x; j++)
{
if(i==o_Row && j==o_Col) //Опорный элемент
{
chart[i][j]=1/matrix[o_Row][o_
continue;
}
if(i==o_Row) //Опорная строка
{
chart[i][j]=matrix[i][j]/
continue;
}
if(j==o_Col) //Опорный столбик
{
chart[i][j]=-matrix[i][j]/
//chart[i][j]=0;
continue;
}
//В остальных
случаях вычисляем значение
chart[i][j]= ((matrix[i][j]*matrix[o_Row][
}
}
//Делим все элементы на опорный
for(int i=0; i<size.y; i++)
{
for(int j=0; j<size_small.x; j++)
{
//chart[i][j]=chart[i][j]/
//matrix[i][j]=chart[i][j];
if(j==size_small.x-1)
{
//matrix[i][size.x-1]=chart[i]
}
}
}
//Копируем chart обратно в matrix
for(int i=0; i<size.y; i++)
{
for(int j=0; j<size_small.x; j++)
{
matrix[i][j]=chart[i][j];
if(j==size_small.x-1)
{
matrix[i][size.x-1]=chart[i][
}
}
}
//Меняем номера переменных
var temp;
temp.num=horzX[o_Col].num;
temp.is_used=horzX[o_Col].is_
temp.type=horzX[o_Col].type;
horzX[o_Col].num=vertX[o_Row].
horzX[o_Col].is_used=vertX[o_
horzX[o_Col].type=vertX[o_Row]
vertX[o_Row].num=temp.num;
vertX[o_Row].is_used=temp.is_
vertX[o_Row].type=temp.type;
//--------?--------//
if(horzX[o_Col].type==TRUE) horzX[o_Col].is_used=FALSE;
//--------?--------//
//Чистим память
delete[] chart;
//Итерация закончилась успешно. Возвращаем 0
return 0;