14 / 14 / 6
Регистрация: 07.09.2013
Сообщений: 159
1

Транспортная задача (методы приближения)

29.03.2014, 13:40. Показов 1774. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Есть небольшая проблема с методами приближения, а именно с методом северо-западного угла и методом минимальных стоимостей. Не могли бы вы указать мне на ошибку в коде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
int summas[n*m];
int count = 0;
     // ----- Метод северо-западного угла -----
     for ( i = 0; i < n; i ++){
         for ( j = 0; j < m ; j ++){
             if (( storage[i] != 0) && (shop[j] != 0)){
                 if( storage[i] >= shop[i])
                 {
                     summas[i] = mas[i][j];
                     mas[i][j] = shop[j];
                     storage[i] =  storage[i] - shop[j];
                     shop[j] = 0;
                     count ++;
                 }
                 else{
                     summas[i] = mas[i][j];
                     mas[i][j] = storage[i];
                     shop[j] = shop[j] - storage[i];
                     storage[i] = 0;
                     count ++;
                 }
             }
             else mas[i][j] = 0;
         }
     }
     cout << count << endl;
     for ( i = 0; i < count; i++)
         cout << summas[i] << " ";
     cout << endl;
     // --------------------------//
     // ---- Метод минимальных стоимостей ---- 
 
     int min = 10000;
     for ( i = 0; i < n; i ++){
         for ( j = 0; j < m ; j ++){
             if ((mas[i][j] < min) && ( storage[i] != 0) && (shop[j] != 0)){
                     
                 if( storage[i] >= shop[i])
                 {
                     mas[i][j] = shop[j];
                     storage[i] =  storage[i] - shop[j];
                     shop[j] = 0;
                 }
                 else{
                     mas[i][j] = storage[i];
                     shop[j] = shop[j] - storage[i];
                     storage[i] = 0;
                 }
                     min = mas[i][j];
                     mas[i][j] = 10000;
             }
             else mas[i][j] = 0;
         }
     }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2014, 13:40
Ответы с готовыми решениями:

Транспортная задача
Всем добрый день! Второй месяц не могу справиться, помогите пожалуйста. Очень нужна программа к...

Транспортная задача
Здравствуйте! Помогите пожалуйста составить задачу методом минимального элемента и методом...

Транспортная задача
Всем привет) Пишу решение транспортной задачи по методу минимального элемента. Сейчас нахожусь на...

Транспортная задача (методом потенциалов)
Доброго времени суток форумчане! Нужна прога по вычислению транспортной задачи методом потенциалов....

2
11 / 11 / 10
Регистрация: 10.07.2013
Сообщений: 150
29.03.2014, 16:01 2
метод северо западного угла (внимание костыли) )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <stdio.h>
#include <Windows.h>
#include <iostream>
#include <locale.h>
class Element{
public:
    mutable int Delivery;
    mutable int Value;
    Element()
    {
this->Delivery = 0;
this->Value = 0;
    }
    static int FindMinElement( int &a,  int &b){
        if(a>b)return b;
        if(a==b){return a;}
        else return a;
        
    }
    void SetDelivery(int a,int b)
    {
    
    this->Delivery = Element::FindMinElement(a,b);
    
    
    }
};
 
void SetColor(int Background,int ForeGround){
    void *Handle = GetStdHandle((DWORD)-11);
    SetConsoleTextAttribute(Handle,(WORD)(Background<<4|ForeGround));
    
}
int main(int ArgCount,char**Arguments){
    setlocale(0,"");
        int i = 0;
    int j = 0;
    int n=0; 
    int m=0;
    SetColor(0,9);
    std::cout<<"Введите количество A\n";
    std::cin>>n;
    int *a = new int [n];
    std::cout<<"Введите количество B\n";
    std::cin>>m;
    int *b = new int[m];
    Element **C = new Element* [n];
    for (int i = 0;i<n;i++)
    {
    C[i] = new Element[m];
    
    
    }
    
    std::cout<<"Введите a[i]\n";
    for (i = 0;i<n;i++){
        std::cin>>a[i];
    }
    std::cout<<"Введите b[j]\n";
    for (j=0;j<m;j++){
        std::cin>>b[j];
    }
    SetColor(0,15);
    std::cout<<"Введите C[i][j]";
    for (i = 0;i<n;i++){
        for (j=0;j<m;j++){
            std::cin>>C[i][j].Value;
        }
    }
    i = 0;j = 0;
    
    while(i<n && j<m){
        
        
        if (a[i]==0){i++;}
        if (b[j]==0){j++;}
        
        C[i][j].SetDelivery(a[i],b[j]);
        a[i]-=C[i][j].Delivery;
        b[j]-=C[i][j].Delivery;
    
        }
        
    for (i = 0;i<n;i++){
        
        for (j=0;j<m;j++){
            
            std::cout<<C[i][j].Value<<"("<<C[i][j].Delivery<<")";
        }
        std::cout<<std::endl;
    }   
     int ResultFunction = 0;
 
            for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) 
                {
 
                    ResultFunction += (C[i][ j].Value * C[i][j].Delivery);
                    
                
                }
 
            
            }
            std::cout<<"Опорный план найден , и равен = "<<ResultFunction;
        
        
        
        
        system("pause>>void");
        
    }
1
Заблокирован
29.03.2014, 17:00 3
_Vertigo_, сразу приводите весь код + тестовый пример.

Цитата Сообщение от _Vertigo_ Посмотреть сообщение
summas[i] = mas[i][j];
что это? Вы должны перемножать значение на отгрузку а не просто присваивать.
23 строка вам вообще зачем нужна?

Уф. Мне ваш код совсем не понятен
Попробую поугадывать. Замените циклы в методе северо-западного угла на этот кусок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int sum =0;
for ( i = 0; i < n; i ++){
         for ( j = 0; j < m ; j ++){
                 if( storage[i] >= shop[j])
                 {
        sum += shop[j]*mas[i][j];
                     storage[i]-= shop[j];
                     shop[j] = 0;
                 }
                 else{
sum += storage[i]*mas[i][j];
                     shop[j] -= storage[i];
                     storage[i] = 0;
                 }
         }
     }
должно работать, если я правильно понял назначения каждого из массивов.
И еще, почему не записывать потребности и запасы в тот-же массив, в котором храняться значения?
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2014, 17:00
Помогаю со студенческими работами здесь

Транспортная задача теорией графов
Возникла необходимость написать решение транспортной задачи, используя теорию графов. Одна поиски...

Метод потенциалов Транспортная задача
Как можно найти цикл в матрице ? нехватает этой чудо функций

Транспортная задача (методом потенциалов)
В универе задали сделать транспортную задачу. Знания только одного семестра ОП. Сделал заполнение...

Транспортная задача с промежуточными пунктами C++
Доброго времени суток,прошу прощение если умудрился закинуть тему не в тот раздел. Но просто задача...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru