неправильно передаются данные из функции в функцию
пишу решение транспортной задачи методом потенциалов по этому алгоритму
На моменте с вычислением потенциалов по горизонтали и вертикали значения не передаются в функцию, то есть 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); Подскажите, как это исправить?