Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Все языки] Минимальная стоимость перевозок


Автор: duk 20.9.2007, 16:54
Ни у кого нету исходника нахождения минимальной стоимости перевозок (закрытая транспортная задача)? Если есть поделитесь.

Автор: Akina 20.9.2007, 17:03
разрисовываешь матрицу доставок в Экселе, напускаешь на нее решатель, задав граничные условия (скажем, неотрицательность перемещений) - и получаешь решение.

Автор: duk 20.9.2007, 17:19
мне исходник нужен. завтра лабораторную здать нужно. написал бы сам но совершенно нет времени, на работе проект здаем.

Автор: comtat 20.9.2007, 17:31
http://forum.vingrad.ru/act-Search/CODE/show/searchid-740c2b80888afc4e924a73f98cc4ac25/search_in-posts/result_type/topics/flag/search/highlite/%25D1%2582%25D1%2580%25D0%25B0%25D0%25BD%25D1%2581%25D0%25BF%25D0%25BE%25D1%2580%25D1%2582%25D0%25BD%25D0%25B0%25D1%258F/index.html

Автор: ne0n 20.9.2007, 17:36
Цитата(duk @  20.9.2007,  17:19 Найти цитируемый пост)
мне исходник нужен.

на каком языке?!

Автор: duk 20.9.2007, 17:43
comtat, то что в поиске это не полное решение, опорный план обычно делается более оптимальным путем использования циклов. вот именно это мне нужно

Добавлено через 13 минут и 18 секунд
ne0n, c/c++, c#, pascal/delphi без разницы

Автор: Guedda 20.9.2007, 20:08

M
Guedda
Модератор: Название темы должно отражать ее суть!

Автор: comtat 20.9.2007, 20:28
Цитата(duk @  20.9.2007,  17:43 Найти цитируемый пост)
опорный план обычно делается более оптимальным путем использования циклов.

Опорный план считается методом северо-западного угла или метод потенциалов
Какой нужен ?

Автор: duk 20.9.2007, 23:02
Guedda, это и есть суть задачи, если вы учили мат методы исследования операций, то вы наверняка должны знать что Т задача, носит еще и другое название, такое как "Задача про транспортировку грузов".

Добавлено через 5 минут и 41 секунду
comtat, получение опорного плана можно осуществить как минимум тремя способами (метод потенциалов - это метод улучшения готового опорного плана): северо-западного угла, минимального элемента, метод вычеркивания - расположены по мере возрастания результата. Получив опорный план, можно его усовершенствовать используя так называемы циклы.  Вот как их организовать я вас и спрашиваю.

Автор: comtat 20.9.2007, 23:54
Цитата(duk @  20.9.2007,  23:02 Найти цитируемый пост)
используя так называемы циклы.

Я 3 года изучал теории оптимизации, но что-то не помню ни каких циклов ...
Поясните, что это такое... хотя бы формальное определение 

Автор: apook 21.9.2007, 00:52
Алгоритм Дейкстры рулит
Код

// Алгоритм Дейкстры
// нахождение наименьшего расстояяния от заданной точки 
// до всех остальных
#include<iostream.h> 
#include<conio.h> 

#define M ( sizeof(cities)/sizeof(cities[ 0 ]) )
#define N ( sizeof(inf)/sizeof(inf[ 0 ]) )

//якобы бесконечность, данное число должно быть больше
//максимального расстояния (по правилам алгоритма)
#define INFINITY 10000
//от какой точки пляшем :)
#define dance 2

//пункты
char cities[ ][ 50 ]={ "A", "B", "C", "D", "E", "F" };

struct
{
     char points[ 2 ][ 50 ]; //от пункта к пункту
     int distance;           //расстояние км
     }inf[ ]={
     {{ "A", "B" }, 65 },
     {{ "B", "C" }, 40 },
     {{ "C", "D" }, 60 },
     {{ "D", "E" }, 68 },
     {{ "E", "A" }, 32 },

     {{ "A", "F" }, 45 },
     {{ "B", "F" }, 25 },
     {{ "C", "F" }, 40 },
     {{ "D", "F" }, 60 },
     {{ "E", "F" }, 50 }
     };

struct range
{
    char *point;    //пункт
    int distance;   //расстояние от начальной точки
};
 
int main() 
{
int i, j, c, current_distance, q, p, real_p;
char *current_city=NULL, line[ M ][ 50 ];


for( i=0; i<M; i++ )
    line[ i ][ 0 ]='\0';


range *xr=new range[ M ];
//расстояние от стартовой точки до остальных изначально
//равно бесконечности
for( i=0; i<M; i++ )
{
    xr[ i ].point=NULL;
    xr[ i ].distance=INFINITY;
    }
//а начальная имеет значение ноль
xr[ 0 ].distance=0;
xr[ 0 ].point=cities[ dance ];

for( i=0, c=0, p=1; i<M; i++ )
{
    current_city=xr[ i ].point;

    for( j=0, real_p=1; j<N; j++ )
    {
        current_distance=xr[ i ].distance;

        if( strcmp(inf[ j ].points[ 0 ], current_city)==0
        ||  strcmp(inf[ j ].points[ 1 ], current_city)==0 )
        {
            //проверка не проверяли ли эту точку ранее
            for( q=0; q<i; q++ )
                if( strcmp(inf[ j ].points[ 0 ], xr[ q ].point)==0
                ||  strcmp(inf[ j ].points[ 1 ], xr[ q ].point)==0 )
                    break;
            if( q<i )
                continue;

        //-----------------------------
        //находим какая точка сейчас явл соседом с той которую
        //проверяем т.е до какой точки смотрим расстояние
        for( q=0; q<2; q++ )
            if( strcmp(inf[ j ].points[ q ], current_city)!=0 )
                break;

        //i -- текущий пункт
        //p -- всего соседей(уже посещенных) 
        //real_p -- сосед текущего пункта который сейчас проверяется
        //j -- текущий отрезок
        //q -- олределяет каой из двух пунктов inf[ j ].points явл текущим
        //     и стал-быть какой есть сосед 
         for( c=0; c<p; c++ )
             if( strcmp(xr[ c ].point, inf[ j ].points[ q ])==0 )
                 break;
         if( c<p )
             real_p=c; //пункт посещался сверяться будем с ним  
         else
         {   //пункт не посещался
             xr[ p ].point=inf[ j ].points[ q ]; //запоминаем пункт
             real_p=p; //вносим свежие данные по нему
             ++p;
             }

        current_distance+=inf[ j ].distance;
        if( current_distance<xr[ real_p ].distance )
        { 
            //запоминаем расстояние
            xr[ real_p ].distance=current_distance;
            strcat( line[ real_p ], inf[ j ].points[ 0 ] );
            strcat( line[ real_p ], inf[ j ].points[ 1 ] );
            }

            }
        }
    }

cout << endl << "---------------------" << endl
     << "Beeline from " << xr[ 0 ].point << endl;
for( q=1; q<p; q++ )
   cout << "to: " << xr[ q ].point << " = " << xr[ q ].distance
        << " ( " << line[ q ] << " ) " << endl;


getch();
return 0; 
}

Здесь правда нахождение наименьшего расстояния но почти то, переделывать тоже некогда. Вместо расстояния взять стоимость и все!

Автор: duk 21.9.2007, 00:57
суть в том что опорный план не всегда оптимален, когда мы находим дельта для пустой клетки и видим что эта дельта отрицательна, мы можем оптимизировать план путем перестановки значений из клетки в клетку таким образом, что б стоимость перевозки стала меньше. циклом в данном случае будет замкнутая линия которая обьединяет несколько клеток в таблице, в которых и будут производиться перестановки.

Автор: comtat 21.9.2007, 11:03
Цитата(duk @  21.9.2007,  00:57 Найти цитируемый пост)
 циклом в данном случае будет замкнутая линия которая обьединяет несколько клеток в таблице

Это решение называется методом потенциалов

Автор: daemon003 27.12.2007, 02:12
авапвап

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)