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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2019, 18:33   #1
aRTHEART
Новичок
Джуниор
 
Регистрация: 10.06.2019
Сообщений: 1
Восклицание С++ линейное программирование. Задача с тремя станками

Не могу решить задачу. Математическая модель присутствует.
детали a b обрабатываются на двух станках причем каждую изготавливаемую деталь нужно последовательно обрабатывать на каждом из станков. Прибыль от реализации детали А - 100 руб, деталь B - 160 руб.
Определить производственную программу максимизирующую прибыль при условии, что спрос на деталь А не менее 300 шт. , на деталь В - не боле 200 шт
Даже ответ есть
Целевая функция задачи : Z = 100x1 +160x2 -> max
Решив систему уравнений, получим: x1 = 400, x2 = 200
Откуда найдем максимальное значение целевой функции:
Z = 100*400=160*200 = 40000 + 32000 = 72000

Код:
namespace ConsoleApplication7
{
    public class Simplex
    {
        double[,] table; 
 
        int m, n;
 
        List<int> basis;
 
        public Simplex(double[,] source)
        {
            m =source.GetLength(0);
            n = source.GetLength(1);
            table = new double[m, n + m - 1];
            basis = new List<int>();
 
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < table.GetLength(1); j++)
                {
                    if (j < n)
                        table[i, j] = source[i, j];
                    else
                        table[i, j] = 0;
                }
                if ((n + i) < table.GetLength(1))
                {
                    table[i, n + i] = 1;
                    basis.Add(n + i);
                }
            }
 
            n = table.GetLength(1);
        }
 
    
        public double[,] Calculate(double[] result)
        {
            int mainCol, mainRow; 
 
            while (!IsItEnd())
            {
                mainCol = findMainCol();
                mainRow = findMainRow(mainCol);
                basis[mainRow] = mainCol;
 
                double[,] new_table = new double[m, n];
 
                for (int j = 0; j < n; j++)
                    new_table[mainRow, j] = table[mainRow, j] / table[mainRow, mainCol];
 
                for (int i = 0; i < m; i++)
                {
                    if (i == mainRow)
                        continue;
 
                    for (int j = 0; j < n; j++)
                        new_table[i, j] = table[i, j] - table[i, mainCol] * new_table[mainRow, j];
                }
                table = new_table;
            }
 
 
            for (int i = 0; i < result.Length; i++)
            {
                int k = basis.IndexOf(i + 1);
                if (k != -1)
                    result[i] = table[k, 0];
                else
                    result[i] = 0;
            }
 
            return table;
        }
 
        private bool IsItEnd()
        {
            bool flag = true;
 
            for (int j = 1; j < n; j++)
            {
                if (table[m - 1, j] < 0)
                {
                    flag = false;
                    break;
                }
            }
 
            return flag;
        }
 
        private int findMainCol()
        {
            int mainCol = 1;
 
            for (int j = 2; j < n; j++)
                if (table[m - 1, j] < table[m - 1, mainCol])
                    mainCol = j;
 
            return mainCol;
        }
 
        private int findMainRow(int mainCol)
        {
            int mainRow = 0;
 
            for (int i = 0; i < m - 1; i++)
                if (table[i, mainCol] > 0)
                {
                    mainRow = i;
                    break;
                }
 
            for (int i = mainRow + 1; i < m - 1; i++)
                if ((table[i, mainCol] > 0) && ((table[i, 0] / table[i, mainCol]) < (table[mainRow, 0] / table[mainRow, mainCol])))
                    mainRow = i;
 
            return mainRow;
        }
 
 
    }
    class Program
    {
        static void Main(string[] args)
        {
            double[,] table = { {-300, 0.2,  0.2, 0.1}, 
                                {200, 0.1,  0.5, 0.2}, 
                                { 0, 100, 180, 100} };
 
            double[] result = new double[3];
            double[,] table_result;
            Simplex S = new Simplex(table);
            table_result = S.Calculate(result);
 
            Console.WriteLine("Решенная симплекс-таблица:");
            for (int i = 0; i < table_result.GetLength(0); i++)
            {
                for (int j = 0; j < table_result.GetLength(1); j++)
                    Console.Write(table_result[i, j] + " ");
                Console.WriteLine();
            }
 
            Console.WriteLine();
            Console.WriteLine("Решение:");
            Console.WriteLine("X[1] = " + result[0]);
            Console.WriteLine("X[2] = " + result[1]);
            Console.WriteLine("X[3] = " + result[2]);
            Console.ReadLine();
        }
    }
}
Изображения
Тип файла: png Снимок.PNG (4.8 Кб, 57 просмотров)
aRTHEART вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПОМОГИТЕ ПОЖАЛУЙСТА задача на линейное программирование для excel МАР96 Microsoft Office Excel 1 02.03.2014 01:30
задача на линейное программирование Alexander1205 Общие вопросы C/C++ 1 27.11.2011 12:41
Линейное программирование,задача Fitok Паскаль, Turbo Pascal, PascalABC.NET 1 09.10.2011 18:48
Задача. Линейное программирование Ася Шутисс Помощь студентам 7 14.01.2011 17:27