Минимальная стоимость при динамическом программировании на java

Я работаю над проектом, в котором мне нужно найти минимальную стоимость с помощью динамического программирования. У нас есть заполненный массив A[n*m]. Также у нас есть еще один массив b[n*m]. Мы должны заполнить еще один массив c(n*m), который c(i,j) заполнил минимум

for (i=1 to m) 
  a[i,j]+B[j,k]+c[i-1,k]

например у нас есть это массивы.

Это мой код:

for (int t = 1; t < n; t++) {
 for (int y = 0; y < m; y++) {
  int min = 9999555;
  for (int k = 0; k < m; k++) {
   if ((a[t][y] + b[y][k]) < min) {
    min= a[t][y] + b[y][k] + c[t - 1][k];
    }
   }c[t][y] += min;
  }
 }
 for (int u = 0; u < n; u++) {
        for (int z = 0; z < m; z++) {
            System.out.print(c[u][z]+" ");
        }
        System.out.println();
    }

Первый столбец c должен совпадать с первым столбцом a. Например: c[2,1] - это min{A[2,1]+c[1,1]+b[1,1], A[2,1]+C[1,2]+B[2,1],A[2,1]+c[1,3]+b[3,1]} Я хочу спросить, является ли мой код правильным методом динамического программирования.

сам вопрос не имеет отношения к динамическому программированию, потому что вы не определили постановку задачи, которую (по вашим словам) предполагается решить с помощью динамического программирования. Мы только видим, что вы пытаетесь заполнить массив C с помощью массивов A и B

mangusta 26.05.2018 11:35

Сюжет проблемы: у нас есть N шагов (процессов) и M типов виртуальных машин виртуальных машин. Массив A имеет стоимость запуска 1 процесса в виртуальной машине определенного типа. Второй массив B M * M имеет стоимость запуска процесса от одной виртуальной машины к другой. В примере, который я написал, у нас есть 4 процесса и 3 типа виртуальных машин. Первая виртуальная машина запускает 4 процесса с затратами 5, 7, 7 и 2. Также взаимодействует с другими типами виртуальных машин с затратами 7 и 2.

George 26.05.2018 11:55

пожалуйста, определите более четко значение A [i, j], B [i, j] и C [i, j]. A [i, j] = стоимость выполнения процесса i на виртуальной машине j. C [i, j] = стоимость запущенных процессов 0..i на виртуальных машинах 0..j (верно?) B [i, j] =?

mangusta 26.05.2018 12:13

A [i, j] = стоимость запуска процесса i на виртуальной машине jC [i, j] = стоимость запуска процессов 0..i на виртуальных машинах 0..j, вызванных суммой c [i-1, j ] + стоимость процесса a [i, j] + стоимость запуска на той же виртуальной машине или стоимость отправки данных на другую виртуальную машину (b [j, k]

George 26.05.2018 12:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
374
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Сформулируем ясно:
A [i, j] - стоимость запуска процесса i на виртуальной машине j

Состояние C [i, j] подразумевает минимальные затраты на выполнение процессов «0..i» на виртуальных машинах «0..j».

Предположим пока, что не существует массива затрат B.

Целью является состояние C [n, m], которое представляет собой минимальную стоимость запуска процессов «0..n» на виртуальных машинах «0..m» .
Мы можем достичь состояния C [i, j] из:

  1. состояние C [i-1, j], что означает, что виртуальные машины «0..j» будут запускать дополнительный процесс «i» и с учетом затрат на выполнение процесса «i» на виртуальных машинах «0..j», сумма (a [i, k]), где k = 0..j
    Следовательно, стоимость равна C [i-1, j] + sum (a [i, k]), где k = 0..j

  2. состояние C [i, j-1], что означает, что процессы «0..j» будут выполняться на еще одной виртуальной машине «j» (итого всего «0..j») и с учетом затрат на выполнение процессов «0 ..i "на виртуальной машине" j ", это сумма (a [k, j]), где k = 0..i
    Следовательно, стоимость равна C [i, j-1] + sum (a [k, j]), где k = 0..i

Взяв минимум из этих двух значений, мы находим C [i, j]

Вы с этим согласны?

ОБНОВЛЕНИЕ.
Предполагая, что нумерация процесса и ВМ начинается с 0:

базовый вариант:

for(int j=0; j < m; j++)  
     c[ 0 ][ j ] = a[ 0 ][ j ];

Петля DP:

for (int i = 1; i < n; i++) 
{
 for (int j = 0; j < m; j++) 
 {
     int min = Integer.MAX_INT;
     for (int k = 0; k < m; k++) 
      {
        if ((a[ i ][ j ] + b[ k ][ j ] + c[ i-1 ][ k ]) < min) 

             min= a[ i ][ j ] + b[ k ][ j ] + c[ i-1 ][ k ];

      }//try every VM

     c[ i ][ j ] = min;

  }//for every VM
}//for every process

@ Джордж, не могли бы вы объяснить цель B [i, j] немного яснее? потому что я еще не мог понять этого. Я добавлю необходимые условия к своему ответу выше

mangusta 26.05.2018 13:51

Я попытался объяснить решение на бумаге. ссылка на сайт Мин. (12,20,12) равно 12. Min (18,14,13) равно 13, а Min (12,13,8) равно 8.

George 26.05.2018 15:05

@George, проверьте обновленный ответ выше. Я не полностью понял, какова цель, но согласно вашему проекту в предоставленной вами ссылке (кажется, что это отличается от того, о чем я говорил в предыдущих сообщениях), базовый случай и цикл должны выглядеть так, как я опубликовал

mangusta 26.05.2018 17:30

и в соответствии с предоставленным вами рекурсивным шагом первая строка (не столбец) должна быть одинаковой для A и C.

mangusta 26.05.2018 17:35

первая строка i = 0 (процесс 0), и это самый первый процесс, поэтому перед ним не было изменений ВМ, поэтому c [0] [j] = a [0] [j] для любой ВМ

mangusta 26.05.2018 17:42

Я думаю, что ваше мнение правильное, но моя проблема в том, что для большого ввода с 50 процессами и 20 виртуальными машинами я получаю неверные результаты.

George 26.05.2018 18:26

Файл с 50 процессами - [] (expirebox.com/download/2442c0362478dbaa11441c604366eae9.htm‌ l), мои результаты - expirebox.com/download/f6f3a8ffe9b65b5250d59f0e5185d13f.html, и правильные результаты должны быть такими, как это expirebox.com/download/df1404d55473e545d18f9fa50bc6eaef.html

George 26.05.2018 18:30

@George не могли бы вы поделиться своим описанием проекта (ссылка или текстовый файл)? Вероятно, вы получили неверное рекурсивное отношение

mangusta 26.05.2018 18:45

@George B [i] [j] - это стоимость перехода с виртуальной машины i на виртуальную машину j или с виртуальной машины j на виртуальную машину i? Поскольку вы используете B [j] [k] вместо B [k] [j], вероятно, вам нужно использовать B [k] [j]

mangusta 27.05.2018 09:51

Большое спасибо, мангуста. Это моя ошибка. Я использую B [k] [j], и он отлично работает.

George 27.05.2018 16:47

Визиты в облако Работа с динамическими программистами Компании предоставляют вычислительные облачные вычисления, такие как Amazon, все они о виртуальном человеке (виртуальные машины, виртуальные машины), которые, в свою очередь, дают им соответствующее вознаграждение за общее время использования. В процессе есть много набросков, каждый из которых отличается, например, одна виртуальная машина A может превосходить стоимость другой виртуальной машины B, чтобы выполнить процесс, используя больше ЦП, в то время как B превосходит A в выполняемых процессах. dsc. Также может быть более дорогая система C, которая превосходит по производительности как A, так и B (но она более дорогая). Прогнозирование дизайна виртуальной машины требует много финансовых ресурсов. Эта проблема адресована конкретной работе. У нас есть углубленный процесс, состоящий из N экспериментов в виде цепочек: Δ1 → Δ2 → Δ3 → ..... → ΔΝ. Результаты показывают, что результаты Δ1 передаются в качестве входных данных для Δ2, результаты Δ2 - Δ3 и так далее. У нас также есть M виртуальных графических объектов. В качестве записи у нас также есть 2 таблицы. Человек - это NXM, и он определяет общую стоимость выполнения транзакции на виртуальных машинах одного типа. Таблица высокопоставленных лиц - это MXM, и она оплачивает отправку данных другому. Пример входных данных следующий: В конкретном примере встроенный процесс имеет 4 сценария и доступны 3 шаблона виртуальных машин. Первый выполняет 4 процедуры стоимостью 5, 7, 7 и 2 соответственно. Он также взаимодействует с двумя другими типами технических специалистов с затратами 7 и 2. Алгоритм динамического программирования, который должен быть реализован: алгоритм, который необходимо заполнить, таблица затрат NXM, где каждая ячейка затрат (i, j) показывает наименьшую общую стоимость процесс, пока я живу, когда я живу на j j. Чтобы обеспечить жизнь в движении, результаты i-1 могут быть либо переданы другим сообществам, либо от них, с учетом стоимости общения. В приведенном выше примере эта таблица имеет эквивалент, что на практике означает, что менее затратное вымирание равно 15 и достигается, когда последней операцией является виртуальная машина:

Другие вопросы по теме