一.实验目标
计算最佳策略:在下面的例子的基础上,自行设计一个问题,给出该问题的对应的MDP模型描述,然后分别用valueiteration 和 policyiteration算法计算出最佳策略。
要求:
实验语言不限,环境不限,能够用相应的算法完成即可。但在实验报告中必须解释说明清除实验问题,实验的基本思路以及实验结果
二.实验步骤
(1) 设计问题:寻找到达左上角和右下角的最短路径,规定每次行动的收益R是 -1,分别用value iteration 和 policy iteration 来计算出最佳的方案。
(2) 设计存储结构:首先设计一个4*4*5的二维数组,其中4*4表示迷宫中每一个位置,每一个位置存储了五个值,其中第一个值代表当前位置的长期收益值,第二个值表示该位置是否可以向上行走,第三个值表示该位置是否可以向下行走,第四个值表示该位置是否可以向左行走,第五个值表示该位置是否可以向右行走。
然后设计一个4*4的二维指针数组,每一个指针指向一个字符串。
设计算法:valueiteration:通过对4*4的迷宫的每一个位置进行访问,然后判断这个位置可以向哪个方向行走,接着算出各个方向上收益最大的值,将这个值赋给当前位置的收益。这样不断得循环执行,直到每个点的值收敛。
设计算法:policyiteration: 通过对4*4的迷宫的每一个位置进行访问,然后判断这个位置可以向哪个方向行走,设置一个局部变量来保存总共有几个可行的方向,然后通过求平均值的方法得到可行方向上的收益,将这个值赋给当前位置的收益值。接着不断循环执行,直到每一个位置的收益值收敛。
设计算法:optimization(寻找最优):通过对经过计算得到的收敛的三位数组,遍历每一个位置,然后向四个方向上寻找能够增加收益最大的方向,从而得到每个位置应该走的最佳策略。
(3) 编程实现
#include<iostream>
#include<windows.h>
#include<iomanip>
usingnamespace std;
voidshowGraph(double arr[][4][5]);
voidinit(double arr[][4][5]);
voidlearning(double arr[][4][5]);
voidcopyArr(double arrOrign[][4][5],double arrNew[][4][5]);
doublebubbleSort(double d1,double d2,double d3,double d4);
voidoptimization(double arr[][4][5]);
intmain()
{
double arr [4][4][5];
init(arr);
learning(arr);
showGraph(arr);
optimization(arr);
return 0;
}
Policy iteration的结果 valueiteration的结果
0:表示终点, U:表示向上行走, D:表示向下行走, L : 表示向左行走,
R:表示向右行走
三.实验结果
通过运行程序,我们发现这两种算法都在20次循环内收敛,然而得到的最佳策略是略有不同的。
其中,在Policyiteration中,在第二行第三列和第三行第二列的位置上只规定了两个方向为最佳策略,但是在Value iteration中,在第二行第三列和第三行第二列的位置上,四个方向都可以行走。通过简单的计算可以得到这两个位置到两个终点的距离是一样的,所以两种策略的结果都是正确的,并没有冲突。