Решение задач с использованием структурных моделей
Оптимальное проектирование пути методом динамического программирования, с использованием компьютера. Схема, отображающая стоимости звеньев пути. Порядок, в котором формируется массив выходной информации. Листинг программы на языке программирования C#.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 22.11.2016 |
Размер файла | 970,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Федеральное государственное автономное
образовательное учреждение
высшего образования
«СИБИРСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
Институт космических и информационных технологий
Информационные системы
Лабораторная работа
Компьютерное математическое моделирование
Решение задач с использованием структурных моделей
Преподаватель Н.В. Молокова
Студент ВКИ 13-13Б 031009698 Г.С. Смоленков
Красноярск 2016
Задание
Построение алгоритма
Пусть в рассматриваемой модели число горизонтальных «улиц» равно n, а вертикальных -m. Все данные задачи, входные и выходные, можно свести в массив c размерностью 2n - 1 строк и 2m- 1 столбцов. Начальные (входные) данные - стоимости горизонтальных участков - занимают в этом массиве места с нечетными номерами строк и четными номерами столбцов; входные данные - стоимости вертикальных участков - занимают места с четными номерами строк и нечетными номерами столбцов. Остальные элементы определяются в ходе исполнения алгоритма.
Порядок, в котором формируется массив выходной информации таков. Вначале заполняются правый столбец и верхняя строка. Затем находится элемент d3,2m 3 и решается вопрос, где поставить стрелку- справа или сверху от него. Затем находятся элементы диагонали d3,2m-5, d5,2m-3 ? и определяется местоположение связанных с ними стрелок, затем элементы следующей диагонали d3,2m-7, d5,2m-5, d7,2m-3 и т. д., пока не дойдем до элемента d2n-1,1.
Алгоритм работает при произвольном размере массива
программирование компьютер массив
Реализация алгоритма
Согласно блок схеме составлена программа на языке программирования C#.
Код программы:
Matrix.cs
using System;
using System.Collections.Generic;
namespace MathLab5
{
public class Matrix
{
public Matrix(int column, int row, List<int> array)
{
if (column * row != array.Count)
{
throw new ArgumentException("Не верное соотношение колонок и столбцов");
}
Column = column;
Row = row;
Array = array;
}
public int Column { get; private set; }
public int Row { get; private set; }
public List<int> Array { get; private set; }
}
enum Arrow
{
ArrowUp = 1111111,
ArrowRight= 222222,
};
}
MatrixCalculator.cs
using System;
using System.Collections.Generic;
using System.Diagnostics.Eventing.Reader;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
namespace MathLab5
{
public class MatrixCalculator
{
public static QuadroMatrix BuildMatrix(string path)
{
Matrix MatrixX;
Matrix MatrixY;
using (var reader = new StreamReader(path))
{
MatrixX = ReadArray("x", reader);
}
using (var reader = new StreamReader(path))
{
MatrixY = ReadArray("y", reader);
}
return BuildQuadroMatrix(MatrixX, MatrixY);
}
private static QuadroMatrix BuildQuadroMatrix(Matrix matrixX, Matrix matrixY)
{
var quadro = new int[matrixX.Row * 2 - 1, matrixY.Column * 2 - 1];
var indexX = 0;
var indexY = 0;
for (int x = 0; x < quadro.GetLength(0); x++)
{
for (int y = 0; y < quadro.GetLength(1); y++)
{
if ((x % 2 == 0) && (y % 2 != 0))
{
quadro[x, y] = matrixX.Array[indexX++];
}
if ((x % 2 != 0) && (y % 2 == 0))
{
quadro[x, y] = matrixY.Array[indexY++];
}
}
}
return new QuadroMatrix(matrixX.Row, matrixY.Column, quadro);
}
private static Matrix ReadArray(string typeArray, StreamReader reader)
{
var array = new List<int>();
int row = 0;
int column = 0;
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
if (string.IsNullOrWhiteSpace(line))
{
continue;
}
if (line.Contains(typeArray))
{
row++;
var newline = line.Replace(typeArray, "");
var intList = newline.Trim()
.Split(' ')
.Select(r => int.Parse(r.Trim()))
.ToList();
if (column == 0)
{
column = intList.Count;
}
else if (intList.Count != column)
{
throw new Exception(string.Format("В строке {0} не верное число элементов. должно быть {1}", line, column));
}
array.AddRange(intList);
}
}
return new Matrix(column, row, array);
}
public static int[,] CalculateWays(QuadroMatrix quadro)
{
var inputMatrix = quadro.Matrix;
var waysArray = new int[inputMatrix.GetLength(0), inputMatrix.GetLength(1)];
waysArray[0, waysArray.GetLength(1) - 1] = 0; //Стоимость конечной точки равна нулю.
//Заполняем вернхнюю строку числами и стрелками.
for (int y = waysArray.GetLength(1) - 1; y > 1; y--, y--)
{
waysArray[0, y - 2] = waysArray[0, y] + inputMatrix[0, y - 1];
waysArray[0, y - 1] = (int)Arrow.ArrowUp;
}
//Заполняем правый столбец числами и стрелками.
var lastRowIndex = waysArray.GetLength(1) - 1;
for (int x = 2; x < waysArray.GetLength(0); x++, x++)
{
waysArray[x, lastRowIndex] = waysArray[x - 2, lastRowIndex] + inputMatrix[x - 1, lastRowIndex];
waysArray[x - 1, lastRowIndex] = (int)Arrow.ArrowRight;
}
//Проходим диагональ
for (int col = 1; col <= quadro.Column - 1; col++)
{
for (int i = 2, j = 2 * quadro.Column - 1 - (2 * col)-1; (i <= 2 * quadro.Row - 1) && (j <= 2 * quadro.Column - 3); i += 2, j += 2)
{
var tempA = inputMatrix[i, j+1] + waysArray[i, j+2];
var tempB = inputMatrix[i-1, j] + waysArray[i-2, j];
if (tempA < tempB)
{
waysArray[i, j] = tempA;
waysArray[i, j + 1] = (int)Arrow.ArrowUp;
}
else
{
waysArray[i, j] = tempB;
waysArray[i - 1, j] = (int)Arrow.ArrowRight;
}
}
}
for (int row = 1; row < quadro.Row -1; row++)
{
for (int i = 2*row+2,j=0; (i <= 2*quadro.Row-1)&&(j <= 2*quadro.Column-2); i+=2,j+=2)
{
var tempA = inputMatrix[i, j + 1] + waysArray[i, j + 2];
var tempB = inputMatrix[i - 1, j] + waysArray[i - 2, j];
if (tempA < tempB)
{
waysArray[i, j] = tempA;
waysArray[i, j + 1] = (int)Arrow.ArrowUp;
}
else
{
waysArray[i, j] = tempB;
waysArray[i - 1, j] = (int)Arrow.ArrowRight;
}
}
}
return waysArray;
}
}
}
Printer.cs
using System;
using System.Text;
namespace MathLab5
{
public class Printer
{
public static void Print(Action<string> Write, Action<string> WriteLine, int[,] matrix)
{
for (int i = 0; i < matrix.GetLength(0); i++)
{
for (int j = 0; j < matrix.GetLength(1); j++)
{
string writeResult = "";
if (i % 2 != 0 || j % 2 != 0)
{
if (matrix[i, j] == (int)Arrow.ArrowRight || matrix[i, j] == (int)Arrow.ArrowUp)
{
var arrow = (Arrow)matrix[i, j];
switch (arrow)
{
case Arrow.ArrowUp:
writeResult = '>'.ToString() + " ";
break;
case Arrow.ArrowRight:
writeResult = '^'.ToString() + " ";
break;
}
}
else
{
writeResult = " ";
}
}
else
{
writeResult = string.Format("{0}", matrix[i, j]);
}
Write(writeResult);
}
WriteLine("");
}
for (int i = 0; i < matrix.GetLength(0); i++)
{
for (int j = 0; j < matrix.GetLength(1); j++)
{
string writeResult = "";
if (i % 2 != 0 || j % 2 != 0)
{
if (matrix[i, j] == (int)Arrow.ArrowRight || matrix[i, j] == (int)Arrow.ArrowUp)
{
var arrow = (Arrow)matrix[i, j];
switch (arrow)
{
case Arrow.ArrowUp:
writeResult = '>' + " ";
break;
case Arrow.ArrowRight:
writeResult = "\u2192" +
"" + " ";
break;
}
}
else
{
writeResult = " ";
}
}
else
{
writeResult = string.Format("{0}", matrix[i, j]);
}
Console.Write(writeResult);
}
Console.WriteLine();
}
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace MathLab5
{
class Program
{
private static string message = "";
static void Main(string[] args)
{
var isWork = true;
do
{
try
{
Console.WriteLine(
" Файл должен состоять из строк, при этом строки массива X должны начинаться с символа 'x'");
Console.WriteLine("строки массива Y с символа 'y'. Разделитель между числами - пробел.");
Console.WriteLine("Введите путь к файлу с исходными данными");
string path = Console.ReadLine();
//var inputMatrix = MatrixCalculator.BuildMatrix(@"D:\учеба\3 курс\Мат мод\input.txt");
var inputMatrix = MatrixCalculator.BuildMatrix(path);
Console.WriteLine("Введите путь к файлу с выходными данными:");
string pathOut = Console.ReadLine();
//pathOut = @"D:\учеба\3 курс\Мат мод\output.txt";
Console.WriteLine("Формируем исходные данные...");
Console.WriteLine();
PrintMatrix(inputMatrix.Matrix);
Console.WriteLine();
Console.WriteLine("Выводим результат...");
int[,] result = MatrixCalculator.CalculateWays(inputMatrix);
Printer.Print(Console.Write, Console.WriteLine, result);
using (var writter = new StreamWriter(pathOut, false, Encoding.GetEncoding(1251)))
{
Printer.Print(writter.Write, writter.WriteLine, result);
}
Console.WriteLine("Успешно!");
}
catch (Exception ex)
{
Console.WriteLine("Что-то пошло не так....");
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("Для выхода нажмиет Esc, для продолжения любую клавишу...");
var t = Console.ReadKey();
if (t.Key == ConsoleKey.Escape)
{
isWork = false;
}
}
} while (isWork);
}
private static void PrintMatrix(int[,] matrix)
{
for (int x = 0; x < matrix.GetLength(0); x++)
{
for (int y = 0; y < matrix.GetLength(1); y++)
{
var write = string.Format("{0} ", matrix[x, y] == 0 ? " " : matrix[x, y] < 10 ? ("0" + matrix[x, y].ToString()) : matrix[x, y].ToString());
Console.Write(write);
}
Console.WriteLine();
}
}
}
}
QuadroMatrix.cs
namespace MathLab5
{
public class QuadroMatrix
{
public QuadroMatrix(int row, int column, int[,] matrix)
{
Row = row;
Column = column;
Matrix = matrix;
}
public int Row { get; }
public int Column { get; }
public int[,] Matrix { get; }
}
}
Решение задачи
Ввод данных согласно варианту
x 35 30 33 14 30 40
x 28 19 22 23 19 24
x 44 17 16 28 14 31
x 27 39 19 21 23 18
x 16 41 26 11 41 19
y 26 30 16 14 22 31 21
y 28 29 19 28 17 29 12
y 31 22 33 24 29 17 26
y 19 25 22 30 19 25 28
Вывод данных
Оптимальный путь отображен на схеме
182> 147> 117> 84> 70> 40> 0
^
148> 120> 101> 79> 56> 37> 13
^
156 120> 103> 87> 59> 45 24
^
159> 132 108> 89> 68 54> 36
^
161> 145 117> 91> 80 65 51
Вывод
При решении задач с использованием структурных моделей, наиболее эффективным способом является имитационный подход. В большинстве случаев этот подход помогает построить модель исследуемой системы или процесса. Суть подхода, состоит в том, что процесс функционирования системы представляется в виде определенного алгоритма, реализуемого на ЭВМ.
Размещено на Allbest.ru
...Подобные документы
История создания и развитие языка программирования Pascal, его версии. Особенности и порядок построения графика функции на языке Turbo Pascal с использованием декартовой системы координат. Блок схема алгоритма процедур, листинг и тестирование программы.
курсовая работа [102,7 K], добавлен 23.12.2011Расчет трансформатора питания. Численное решение нелинейных уравнений с заданной точностью и дифференциальных уравнений первого порядка. Разработка программы с использованием средств визуального программирования на алгоритмическом языке программирования.
курсовая работа [1,2 M], добавлен 17.08.2013Сущность и особенности выполнения метода динамического программирования. Решение математической задачи, принцип оптимальности по затратам, ручной счёт и листинг программы. Применение метода ветвей и границ, его основные преимущества и недостатки.
курсовая работа [38,9 K], добавлен 15.11.2009Практические навыки моделирования задач линейного программирования и их решения графическим и симплекс-методом с использованием прикладной программы SIMC. Моделирование транспортных задач и их решение методом потенциалов с помощью программы TRAN2.
контрольная работа [199,8 K], добавлен 15.06.2009Разработка, утверждение стандарта и использование языка программирования С++. Решение системы линейных уравнений методом Гаусса или итераций. Создание классов с одномерным и двумерным динамическим массивом. Построение блок-схемы и листинг программы.
курсовая работа [784,0 K], добавлен 15.01.2011Решение задач прикладного программирования. Оформление разработанных алгоритмов в виде графических схем. Написание программ с использованием подпрограмм, их отладка. Блок-схемы и листинг программ. Наборы тестов для отладки разработанных программ.
курсовая работа [575,8 K], добавлен 06.12.2013Обзор задач, решаемых методом динамического программирования. Составление маршрута оптимальной длины. Перемножение цепочки матриц. Задача "Лестницы". Анализ необходимости использования специальных методов вероятностного динамического программирования.
курсовая работа [503,3 K], добавлен 28.06.2015Разработка программы для поиска пути в лабиринте с возможностью задания входа и выхода, наглядное представление решений. Использование языка логического программирования Prolog. Данные и методы решения. Пользовательский интерфейс, листинг программы.
реферат [14,3 K], добавлен 15.10.2012Сущность линейного программирования. Математическая формулировка задачи ЛП и алгоритм ее решения с помощью симплекс-метода. Разработка программы для планирования производства с целью обеспечения максимальной прибыли: блок-схема, листинг, результаты.
курсовая работа [88,9 K], добавлен 11.02.2011Разработка программы, решающей базовую задачу линейного программирования симплекс-методом с помощью симплекс-таблиц. Выбор языка программирования и среды разработки, программные модули и их взаимодействие между собой. Листинг разработанной программы.
курсовая работа [415,8 K], добавлен 08.09.2013Объявление, выделение, освобождение памяти под динамические массивы. Обращение к элементам. Решение задач с использованием динамических массивов на языке C++. Разработка и реализация программы для формирования и обработки динамического двумерного массива.
курсовая работа [813,4 K], добавлен 13.06.2014Расчет подшипников на долговечность. Решение инженерно-технических задач программными методами с использованием среды прикладного программирования Dephi. Расчет параметров зубчатого зацепления. Расчет шпилечного и винтового резьбового соединения.
курсовая работа [366,3 K], добавлен 04.06.2013Решение задачи нелинейного программирования с определением экстремумов функции. Этапы процесса нахождения решения задачи нелинейного программирования с использованием ее геометрической интерпретации. Определение гиперповерхности уровней функции.
курсовая работа [1,5 M], добавлен 25.09.2010Паскаль как язык профессионального программирования, который назван в честь французского математика и философа Блеза Паскаля, история его разработки и функциональные особенности. Задача с использованием двумерного массива, составление блок-схемы решения.
контрольная работа [819,0 K], добавлен 12.03.2014Выбор алгоритма решения задачи. Разработка программы, обеспечивающую эффективную обработку и хранение информации с использованием линейных списков. Написание программы на псевдокоде и на языке программирования высокого уровня. Результаты работы программы.
курсовая работа [2,1 M], добавлен 21.04.2012Определение совокупности шаговых управлений. Решение задач динамического программирования двухэтапным способом. Решение последовательности задач условной оптимизации. Оптимальное распределение памяти, политика замены оборудования, замена форвардера.
презентация [674,9 K], добавлен 30.10.2013Широкое применение вычислительной техники как в общей математике, так и в одном из её разделов – математических методах. Ознакомление с решением задач линейного программирования симплекс-методом и графически. Составлена программа на языке Delphi.
курсовая работа [57,1 K], добавлен 04.05.2010Математическая постановка задачи. Обоснование выбора средств разработки. Входные и выходные данные работы программы. Решение задачи теста для написания и отладки программы. Описание программных модулей. Разработка алгоритма, анализ полученных результатов.
курсовая работа [2,2 M], добавлен 13.12.2015Алгоритм решения задач линейного программирования симплекс-методом. Построение математической модели задачи линейного программирования. Решение задачи линейного программирования в Excel. Нахождение прибыли и оптимального плана выпуска продукции.
курсовая работа [1,1 M], добавлен 21.03.2012Выбор языка программирования и его обоснование. Определение системных требований. Схема алгоритма и программа на языке Qbasic. Разработка руководства пользователя. Способы конструирования программ. Особенности и принципы динамического программирования.
курсовая работа [398,8 K], добавлен 21.01.2014