Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
_Vertigo_
13 / 13 / 2
Регистрация: 07.09.2013
Сообщений: 158
Завершенные тесты: 1
29.03.2014, 13:40     Транспортная задача (методы приближения) #1
Всем доброго времени суток. Есть небольшая проблема с методами приближения, а именно с методом северо-западного угла и методом минимальных стоимостей. Не могли бы вы указать мне на ошибку в коде:
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;
         }
     }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2014, 13:40     Транспортная задача (методы приближения)
Посмотрите здесь:

C++ Транспортная задача
C++ Транспортная задача
Транспортная задача(метод минимального элемента) C++
C++ Транспортная задача с промежуточными пунктами C++
C++ Транспортная задача
Транспортная задача (методом потенциалов) C++
Транспортная задача, непонятная ошибка в коде! C++
Транспортная задача (методом потенциалов) C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
proech
10 / 10 / 2
Регистрация: 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");
        
    }
Ev_Hyper
 Аватар для Ev_Hyper
1805 / 1626 / 435
Регистрация: 15.12.2013
Сообщений: 5,774
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;
                 }
         }
     }
должно работать, если я правильно понял назначения каждого из массивов.
И еще, почему не записывать потребности и запасы в тот-же массив, в котором храняться значения?
Yandex
Объявления
29.03.2014, 17:00     Транспортная задача (методы приближения)
Ответ Создать тему
Опции темы

Текущее время: 00:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru