
Саляхов ИВТ-329Б ТПР ЛР№2
.docxМинистерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Уфимский университет науки и технологий»
Лабораторная работа №2
по дисциплине «Теория принятия решений»
«Динамическое программирование»
Вариант №9
Выполнил: студент гр. ИВТ-329Б
Саляхов А.Ф.
Проверил доц. каф. ТК
Насыров Р.В.
Уфа-2023
Цель работы: знакомство с детерминированными и вероятностными
задачами динамического программирования, изучение различных методов
решения в системе компьютерной математики
Задание: Число вершин 10; 1 связан с 2 и 4, блочно-диагональная, шириной 4
Текст программы
import random CountVar = 10 M = [[0 for i in range(CountVar)] for j in range(CountVar)] M[0][1] = random.randint(1, 20) M[0][3] = random.randint(1, 20) M[1][2] = random.randint(1, 20) M[1][3] = random.randint(1, 20) M[1][4] = random.randint(1, 20) M[2][3] = random.randint(1, 20) M[2][4] = random.randint(1, 20) M[3][4] = random.randint(1, 20) M[4][5] = random.randint(1, 20) M[5][6] = random.randint(1, 20) M[5][7] = random.randint(1, 20) M[5][8] = random.randint(1, 20) M[6][7] = random.randint(1, 20) M[6][8] = random.randint(1, 20) M[7][8] = random.randint(1, 20) M[8][9] = random.randint(1, 20) for i in range(CountVar): for j in range(CountVar): if i == j: M[i][j] = "-" minp = [100 for i in range(CountVar)] for i in range(CountVar): for j in range(CountVar): print(M[i][j], end="\t") print() pravo = { 0: [9], 1: [8, 9], 2: [7, 8, 9], 3: [6, 7, 8, 9], 4: [5, 6, 7, 8, 9], 5: [4, 5, 6, 7, 8], 6: [3, 4, 5], 7: [2, 3, 4], 8: [1, 2] } levo = { 0: [8, 9], 1: [7, 8, 9], 2: [6, 7, 8, 9], 3: [5, 6, 7, 8, 9], 4: [4, 5, 6, 7, 8], 5: [3, 4, 5], 6: [2, 3, 4], 7: [1, 2], 8: [0] } v = [1] start = 1 otvet = 0 for k in range(CountVar-1): print("x", k+1, "|\t\t\t\t\t\t\t\t") print("\t|", end=" ") for i in range(len(pravo[k])): print(pravo[k][i]+1, end="\t|\t") print("f(x)|\tx*\t") print("---------------------------------------------------------------------------") for i in range(len(levo[k])): min = 100 ans = [0 for z in range(10)] print(levo[k][i]+1, "\t|", end="") for j in range(len(pravo[k])): if pravo[k][j] == levo[k][i]: print(" ", 0, "\t|", end="") else: if start==1: minp[k]=M[levo[k][i]][pravo[k][j]] ans[pravo[k][j]] += M[levo[k][i]][pravo[k][j]] min = ans[pravo[k][j]] print(' ', ans[pravo[k][j]], "\t|", end="") start-=1 elif M[levo[k][i]][pravo[k][j]] ==0: print(' ----', "\t|", end="") elif M[levo[k][i]][pravo[k][j]] != "-": ans[pravo[k][j]]+=M[levo[k][i]][pravo[k][j]]+minp[pravo[k][j]] if minp[pravo[k][j]]==100: ans[pravo[k][j]]-=100 if ans[pravo[k][j]]<=min and ans[pravo[k][j]]!=0: min=ans[pravo[k][j]] print(' ',ans[pravo[k][j]], "\t|", end="") minp[levo[k][i]]=min if minp[levo[k][i]]==100: print(" ",minp[levo[k][i]]-100, "\t|", end="") else: print(" ", minp[levo[k][i]], "\t|", end="") otvet=minp[levo[k][i]] for j in range(len(pravo[k])): if pravo[k][j] == levo[k][i]: print(" ",pravo[k][j]+1, "\t|", end="") for i in range(len(ans)): if min==ans[i]: print(" ", i+1, "\t|", end="") v.append(i+1) print() print("Последовательность узлов:", set(sorted(v))) print("Длина пути", otvet)
Тестирование
Тест №1:
Тест №2:
Тест №3:
Вывод: в ходе выполнения лабораторной работы мы ознакомились с детерминированными и вероятностными задачами динамического программирования, изучили различные методы решения в системе компьютерной математики.