Я работаю над проектом, в котором мне нужно найти минимальную стоимость с помощью динамического программирования. У нас есть заполненный массив 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]}
Я хочу спросить, является ли мой код правильным методом динамического программирования.
Сюжет проблемы: у нас есть N шагов (процессов) и M типов виртуальных машин виртуальных машин. Массив A имеет стоимость запуска 1 процесса в виртуальной машине определенного типа. Второй массив B M * M имеет стоимость запуска процесса от одной виртуальной машины к другой. В примере, который я написал, у нас есть 4 процесса и 3 типа виртуальных машин. Первая виртуальная машина запускает 4 процесса с затратами 5, 7, 7 и 2. Также взаимодействует с другими типами виртуальных машин с затратами 7 и 2.
пожалуйста, определите более четко значение A [i, j], B [i, j] и C [i, j]. A [i, j] = стоимость выполнения процесса i на виртуальной машине j. C [i, j] = стоимость запущенных процессов 0..i на виртуальных машинах 0..j (верно?) B [i, j] =?
A [i, j] = стоимость запуска процесса i на виртуальной машине jC [i, j] = стоимость запуска процессов 0..i на виртуальных машинах 0..j, вызванных суммой c [i-1, j ] + стоимость процесса a [i, j] + стоимость запуска на той же виртуальной машине или стоимость отправки данных на другую виртуальную машину (b [j, k]




Сформулируем ясно:
A [i, j] - стоимость запуска процесса i на виртуальной машине j
Состояние C [i, j] подразумевает минимальные затраты на выполнение процессов «0..i» на виртуальных машинах «0..j».
Предположим пока, что не существует массива затрат B.
Целью является состояние C [n, m], которое представляет собой минимальную стоимость запуска процессов «0..n» на виртуальных машинах «0..m» .
Мы можем достичь состояния C [i, j] из:
состояние 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
состояние 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] немного яснее? потому что я еще не мог понять этого. Я добавлю необходимые условия к своему ответу выше
Я попытался объяснить решение на бумаге. ссылка на сайт Мин. (12,20,12) равно 12. Min (18,14,13) равно 13, а Min (12,13,8) равно 8.
@George, проверьте обновленный ответ выше. Я не полностью понял, какова цель, но согласно вашему проекту в предоставленной вами ссылке (кажется, что это отличается от того, о чем я говорил в предыдущих сообщениях), базовый случай и цикл должны выглядеть так, как я опубликовал
и в соответствии с предоставленным вами рекурсивным шагом первая строка (не столбец) должна быть одинаковой для A и C.
первая строка i = 0 (процесс 0), и это самый первый процесс, поэтому перед ним не было изменений ВМ, поэтому c [0] [j] = a [0] [j] для любой ВМ
Я думаю, что ваше мнение правильное, но моя проблема в том, что для большого ввода с 50 процессами и 20 виртуальными машинами я получаю неверные результаты.
Файл с 50 процессами - [] (expirebox.com/download/2442c0362478dbaa11441c604366eae9.htm l), мои результаты - expirebox.com/download/f6f3a8ffe9b65b5250d59f0e5185d13f.html, и правильные результаты должны быть такими, как это expirebox.com/download/df1404d55473e545d18f9fa50bc6eaef.html
@George не могли бы вы поделиться своим описанием проекта (ссылка или текстовый файл)? Вероятно, вы получили неверное рекурсивное отношение
@George B [i] [j] - это стоимость перехода с виртуальной машины i на виртуальную машину j или с виртуальной машины j на виртуальную машину i? Поскольку вы используете B [j] [k] вместо B [k] [j], вероятно, вам нужно использовать B [k] [j]
Большое спасибо, мангуста. Это моя ошибка. Я использую B [k] [j], и он отлично работает.
Визиты в облако Работа с динамическими программистами Компании предоставляют вычислительные облачные вычисления, такие как 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 и достигается, когда последней операцией является виртуальная машина:
сам вопрос не имеет отношения к динамическому программированию, потому что вы не определили постановку задачи, которую (по вашим словам) предполагается решить с помощью динамического программирования. Мы только видим, что вы пытаетесь заполнить массив C с помощью массивов A и B