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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2009, 16:03   #1
WhistlerW
Новичок
Джуниор
 
Регистрация: 10.06.2009
Сообщений: 2
По умолчанию Сортировка столбцов в матрице

Дана матрица 100 на 100(числа от 1 до 9). необходимо отсортировать элементы матрицы так, чтобы среднее значение каждого столбца было более-менее равным

пример
стартовая
1 1
2 3
2 5
3 5
срзнач: 1.5 срзнач 3.5

результат
1 1
2 2
3 3
5 5
срзнач 2.75 для обоих
WhistlerW вне форума Ответить с цитированием
Старый 11.06.2009, 15:17   #2
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Ничево так задачка. Я сначала попробывал через минимальные числа, но щас сделал через случайные. Вобщем чем дальше крутить цикл тем больше будет соответствие средних, ну а если они перестали меняться значит всё.

Код:
const
  N = 5;
  M = 5;

type Array1 = array [1 .. N] of real;
type Array2 = array [1 .. N, 1 .. M] of real;

...

  Middle : Array1;
  Arr    : Array2;

...

{function MaxMal(A : Array2) : Real;
var
  i, k : word;
begin
  Result := A[1, 1];
  for i := 1 to N do
    for k := 1 to M do
       if (A[i, k] >= Result) then
          Result := A[i, k];
end;

function MinMal(A : Array2; var imin, kmin : word) : Real;
var
  i, k : word;
begin
  Result := A[1, 1];
  imin := 1;
  kmin := 1;
  for i := 1 to N do
    for k := 1 to M do
       if (A[i, k] <= Result) then begin
          Result := A[i, k];
          imin := i;
          kmin := k;
       end;
end;

procedure MinNth(nth : word; var imin, kmin : word);
var
  i, k, n : word;
  ArTmp   : Array2;
begin
  imin := 0;
  kmin := 0;
  ArTmp := Arr;
  for n := 1 to nth do begin
      MinMal(ArTmp, i, k);
      ArTmp[i, k] := MaxMal(ArTmp) + n;
  end;
  imin := i;
  kmin := k;
end; }
BaronTreep вне форума Ответить с цитированием
Старый 11.06.2009, 15:18   #3
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Код:
procedure MiddleArr();
var
  i, k : word;
  Midd : real;
begin
  for k := 1 to M do begin
    Midd := 0;
    for i := 1 to N do
       Midd := Midd + Arr[i, k];
    Middle[k] := Midd /[color=green]// M;
  end;
end;

procedure Sort();
var
  i, k, nn : word;
  i2, k2   : word;
  tmp      : real;
begin
  randomize;
  for nn := 1 to 65000 do begin
      MiddleArr();
      {MinNth(n, i, k);}
      {MinNth(n + 1, i2, k2);}
      i := random(N) + 1;
      k := random(M) + 1;
      i2 := random(N) + 1;
      k2 := random(M) + 1;
      if Middle[k] < Middle[k2] then begin
         tmp := Arr[i2, k2];
         Arr[i2, k2] := Arr[i, k];
         Arr[i, k] := tmp;
      end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i, k : word;
  sArr : string;
begin
  for i := 1 to N do
    for k := 1 to M do
        Arr[i, k] := i + k;

  Sort();

  MiddleArr();
  for i := 1 to N do begin
    for k := 1 to M do begin
        str(Arr[i, k]:1:0, sArr);
        Memo1.Text := Memo1.Text + SArr + ', ';
    end;
    Memo1.Text := Memo1.Text + #13 + #10;
  end;
  Memo1.Text := Memo1.Text + #13 + #10;
  for i := 1 to N do begin
        str(Middle[i]:1:1, sArr);
        Memo1.Text := Memo1.Text +  sArr + ', ';
  end;
  Memo1.Text := Memo1.Text + #13 + #10;
end;
BaronTreep вне форума Ответить с цитированием
Старый 12.06.2009, 23:01   #4
WhistlerW
Новичок
Джуниор
 
Регистрация: 10.06.2009
Сообщений: 2
По умолчанию

Благодарю за ответ. К сожалению это решение мне не совсем подходит - задачка дана по предмету Исследование Операций, ваше решение препод просто не примет как не оптимальное
Я придумал другое, но оно тоже не особо

Вот кусок алгоритма отвечающий за перестановку:


Шаг 6: Вычисление сумм элементов каждого столбца
Шаг 7: Балансировка матрицы:
Шаг 7.1: Выбрать I-й и J-й столбцы где I не равно J . Если суммы элементов столбцов отличаются более чем на единицу или на разницу между минимальными элементами столбцов, перейти на шаг 7.2. Если суммы элементов всех столбцов равны или различаются не более чем на разницу между минимальными элементами столбцов, перейти на шаг 8, иначе повторить шаг 7.1 с другими столбцами.
Шаг 7.2: Для столбца с меньшей суммой элементов выбрать минимальный элемент, для второго – выбрать элемент, значение которого ближе всего к разнице между суммами двух столбцов, деленной надвое.
Шаг 7.3: Переставить элементы
Шаг 7.4: Обновить значение сумм столбцов
Шаг 7.5: Перейти на шаг 7.1
Шаг 8: Завершить сортировку

Если сможете предложить усовершенствование, буду очень благодарен. Можно даже без кода - чисто алгоритм, закодю сам.
Это решение препод назвал не слишком оптимальным и дал время на переделку до понедельника. Пока я не придумал что изменить.

Вопрос актуален до воскресного вечера
WhistlerW вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан двухмерный массив из 20 столбцов. Вставить в него столбец из чисел 10 после всех четных столбцов. Дмитрий142 Помощь студентам 9 07.06.2012 19:32
Задача по матрице dima768 Помощь студентам 4 03.04.2009 23:41
Нахождение чисел в матрице bpystep Помощь студентам 12 23.03.2009 00:31
Перестановка строк матрице gotex Помощь студентам 1 24.11.2008 20:40
поможите человеку плиз:)сортировка выбором в матрице. benzus Паскаль, Turbo Pascal, PascalABC.NET 19 27.04.2008 15:47