неправильно передаются данные из функции в функцию

пишу решение транспортной задачи методом потенциалов по этому алгоритму На моменте с вычислением потенциалов по горизонтали и вертикали значения не передаются в функцию, то есть v[j] и u[i] остаются прежними:


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;

public class Transport {

    private final int[] spros = {60, 60, 70, 40};
    private final int[] proposition = {80, 100, 50};
    private final int[][] price = {
        {8, 12, 15, 5},
        {6, 7, 9, 12},
        {12, 5, 11, 10}};
    private final int m = proposition.length;
    private final int n = spros.length;
    private final int[] sprosOstatok = new int[n + 1];
    private final int[] propositionOstatok = new int[m + 1];
    private final int[][] basicYacheiki = new int[m + 1][n + 1];
    private final int[][] otgryzki = new int[m + 1][n + 1];
    private int maxIter;
    private int i1, j1;
    private final ArrayList<Integer> iCycle = new ArrayList<>();
    private final ArrayList<Integer> jCycle = new ArrayList<>();

    private int[] v = new int[n + 1];
    private int[] u = new int[m + 1];

    public void sothWethAngle() {   // вычисление опорного плана северно - западным углом
        for (int j = 0; j < n; j++) sprosOstatok[j] = spros[j];
        for (int i = 0; i < m; i++) propositionOstatok[i] = proposition[i];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j <= n; j++) {
                basicYacheiki[i][j] = 0;
                otgryzki[i][j] = 0;
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (propositionOstatok[i] == 0) break;
                else if (propositionOstatok[i] < 0) System.out.println("Problem with propositionOstatok[i] < 0 ");
                int volume = sprosOstatok[j];
                if (volume == 0) continue;
                else if (volume < 0) System.out.println("Problem with Volume < 0");
                else if (propositionOstatok[i] < volume) volume = propositionOstatok[i];
                sprosOstatok[j] = sprosOstatok[j] - volume;
                propositionOstatok[i] = propositionOstatok[i] - volume;
                basicYacheiki[i][j] = 1;
                otgryzki[i][j] = volume;
            }
        }
        printMas(otgryzki);
    }

    public static void printMas(int[][] mas) {
        System.out.println("Ваша матрица оценок:");
        System.out.println("══───────────────══ ");
        for (int i = 0; i < mas.length; i++) {
            for (int j = 0; j < mas[i].length; j++) System.out.print(" " + mas[i][j] + "\t");
            System.out.println();
        }
        System.out.println("══───────────────══ ");
    } // вывод таблицы матрицой

    public boolean methodPotential() {

        for (int i = 0; i < m; i++) u[i] = 999;
        for (int j = 0; j < n; j++) v[j] = 999;

        u[1] = 0;
        maxIter = m * n;
        calculatingByH(1);              //??????

        System.out.println("v = " + Arrays.toString(v));
        System.out.println("u = " + Arrays.toString(u));

        for (int j = 0; j < n; j++) {
            if (v[j] == 999) {
                System.out.println("v["+j+"]="+v[j]); // 999
                System.out.println("*****************************************");
                // System.out.println("problem with v[j], ivy");
                return false;
            }

        }
        for (int i = 0; i < m; i++) {
            if (u[i] == 999) {
                System.out.println(u[i]);
                // System.out.println("problem with v[j], ivy");
                return false;
            }
        }

        return true;
    }

    public void calculatingByH(int i) {
        maxIter = maxIter - 1;
        if (maxIter == 0) System.out.println("Зацикливание");
        if (u[i] == 999) System.out.println("maxIter equals 999");

        for (int j = 0; j < n; j++) {
            if (basicYacheiki[i][j] == 0) continue;
            if (v[i] == 999) {
                v[j] = price[i][j] - u[i];
                System.out.println("v["+j+"]="+v[j]); //7 * 3 ***
                calculatingByV(j);
            }
        }
    }

    public void calculatingByV(int j) {
        if (v[j] == 999) System.out.println("Error another v[j], ivy");
        for (int i = 0; i < m; i++) {
            if (basicYacheiki[i][j] == 0) continue;
            if (u[i] == 999) {
                u[i] = price[i][j] - v[j];
                System.out.println("u["+i+"]="+u[i]);
                calculatingByH(i); //5 **
            }
        }
    }

    public boolean checkOptimisation() { //проверка является ли план отмизированным
        boolean checkIfOptimisation;
        int i, j, delta, minDelta;
        checkIfOptimisation = true;
        minDelta = 999;
        for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++) {
                if (basicYacheiki[i][j] == 1) delta = 0;
                else delta = price[i][j] - u[i] - v[j];                
                if (delta < 0) checkIfOptimisation = false;
                System.out.println("Delta is" + delta);
                if (minDelta == 999 || delta < minDelta) {
                    minDelta = delta;
                    i1 = i;
                    j1 = j;
                }
            }
        }
        return checkIfOptimisation;
    }

    public int countTransportation() {
        int checkSum = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                checkSum = checkSum + (otgryzki[i][j] * price[i][j]);
            }
        }
        return checkSum;
    } // подсчет суммы минимальных затрат

    public int rand(int m, int k) {
        int n = m;
        final Random rnd = new Random();
        int lastlast = rnd.nextInt(n);
        int last = (lastlast + 1 + rnd.nextInt(n - 1)) % n;
        for (int i = 0; i < 30; i++) {
            int r = (lastlast + 1 + rnd.nextInt(n - 2)) % n;
            if (r == last) r = (lastlast + n - 1) % n;
            lastlast = last;
            last = r;
        }
        return last;
    }   // рандом от Rand(m,1) и Rand(n,1)

    public void searchNullCellForInputBasic() {  // ищем нулевую ячейку
        int ok = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (basicYacheiki[i][j] == 0) {
                    ok = 1;
                    break;
                }
            }
            if (ok == 0) System.out.println("ok == 0");
        }
        while (true) {
            int i = rand(m, 1);
            int j = rand(n, 1);
            basicYacheiki[i][j] = 1;
            System.out.println(" y c п е х");
            System.out.println("В базис введена ячейка " + i + " " + j);
            return;
        }
    }

    public boolean findCycle(int i0, int j0) { // функция поиска цикла
        maxIter = m * n;
        jCycle.clear();
        iCycle.clear();
        return findCycleByH(i0, j0);
    }

    public boolean findCycleByH(int i0, int j0) { // функция поиска по горизонтали
        maxIter = maxIter - 1;
        if (maxIter == 0) {
            System.out.println(" To much iterations");
        }
        for (int j = 0; j < n; j++) {
            if (j == j0) continue;
            if (basicYacheiki[i0][j] == 0) continue;
            if (findCycleByV(i0, j)) {
                iCycle.add(i0);
                iCycle.add(j);
                return true;
            }
        }
        return false;
    }

    public boolean findCycleByV(int i0, int j0) {
        for (int i = 0; i < m; i++) {
            if ((j0 == j1) && (i == i1)) {   //?????
                jCycle.add(i0);
                jCycle.add(j1);
                return true;
            }
            if (i == i0) continue;
            if (basicYacheiki[i][j0] == 0) continue;
            if (findCycleByH(i, j0)) {
                iCycle.add(i);
                iCycle.add(j0);
                return true;
            }
        }
        return false;
    }  // функция поиска по вертикали

    public boolean redistributionByCycle() {
        String znak;
        System.out.println("Перераспределение по циклу " + iCycle.size());
        if (jCycle.size() != iCycle.size()) System.out.println();
        if (iCycle.size() < 4) System.out.println();
        int teta = 99;
        znak = "+";
        for (int y = 0; y < iCycle.size(); y++) {
            int i = iCycle.get(y); ///?????????????????????????????????
            int j = jCycle.get(y);
            if (znak.equals("-")) {
                int volume = otgryzki[i][j];
                if ((teta == 99) || (volume < teta)) teta = volume;
                znak = "+";
            } 
            else znak = "-";
        }

        if (teta == 99) System.out.println("Не удалось вычислить переменную тета.");
        if (teta == 0) return false;
        znak = "+";
        for (int y = 0; y < iCycle.size(); y++) {
            int i = iCycle.get(y);
            int j = jCycle.get(y);
            if (znak.equals("-")) {
                otgryzki[i][j] = otgryzki[i][j] - teta;
                znak = "+";
            } else {
                otgryzki[i][j] = otgryzki[i][j] + teta;
                znak = "-";
            }
        }
        return true;
    } // фукнция для переопределения в случае неоптим. плана

    public void menu() {
        //Transport transport = new Transport();
        sothWethAngle();
        System.out.println("Стоимость перевозки по северно-западному углу: " + countTransportation());
        while (true) {
            //  transport.CheckIsRightOtgryzka();
            int countBasic = 0;

            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (otgryzki[i][j] > 0) {
                        basicYacheiki[i][j] = 1;
                        countBasic += 1;
                    } 
                    else if (otgryzki[i][j] < 0) System.out.println("Отгрузки не должны быть отрицательными");
                    else basicYacheiki[i][j] = 0;
                }
            }
            while (countBasic < (m + m - 1)) {
                System.out.println("Решение выражено");
                searchNullCellForInputBasic();
                countBasic += 1;
            }
            if (!methodPotential()) continue;
            if (checkOptimisation()) {
                System.out.println("Решение оптимально");
                System.out.println("Стоимость перевозки  : " + countTransportation());
                printMas(otgryzki);
                break;
            } 
            else System.out.println("Решение неотпимально");
            if (!findCycle(i1, j1)) System.out.println("Не удалось найти цикл");
            redistributionByCycle();
            printMas(otgryzki);
            System.out.println("Стоимость перевозки : " + countTransportation());
        }
    }

    public static void main(String[] args) {
        Transport transport = new Transport();
        transport.menu();

    }
}



При выводе v[j] и u[i] выдает все те же 999, что было до вызова CalculatingByH(1); Подскажите, как это исправить?


Ответы (0 шт):