/*
* 1个水库的n个时间阶段(0,1,…,k,…,n)
* 每个阶段有m个离散的水量状态(x[k][1]……x[k][m])
* 水量平衡方程即状态转移方程x[k+1]=x[k]-u[k],
* 其中u[k]是第k阶段向第k+1阶段的下泄量,也是决策变量
* 阶段指标函数为v[k]=(x[k]-k)^2,求使V最小时的x取值
* v[k](x[k],u[k])表示在第k阶段水量初始值是x[k],采用u[k]泄水决策得到的衡量优劣的指标
* 基本方程f[k]=min {v[k]+f[k+1]}
*/
package shuikudiaodu;
import java.util.Arrays;
public class DP {
public static void main(String[] args){
//X zx=new X();
//zx.zx(x);//调用方法得x值
int[][]x=new int[12][1000];
for(int i=0;i<12;i++){
for(int j=0;j<1000;j++){
x[i][j]=j;//x从0到999
}
}
int[]u=new int[201];
for(int i=0;i<201;i++){//决策变量u的取值从-100到100
u[i]=i-100; //-100到100
}
int[][]A=new int[1000][201];
int[][]B=new int[1000][201];
int[][]opd=new int[12][1000];//定义最优决策
int[][]opt=new int[12][1000];//储存最优目标值
for(int i=10;i>9;i=i-1){
for(int j=0;j<x[i].length;j++){int temp=1000000;
for(int k=0;k<u.length;k++){
A[j][k]=x[i][j]-u[k];//最后一个阶段对应决策的状态值
if(x[i][j]>u[k]&&A[j][k]<1000){ //上下边界情况限制:决策值小于当前状态值
B[j][k]=(x[i][j]-i)*(x[i][j]-i)+(A[j][k]-(i+1))*(A[j][k]-(i+1));
//得到最后一次决策的阶段目标值,循环后201个B
if(B[j][k]<temp){
temp=B[j][k];
opt[i][j]=temp;//在循环中得到当前阶段当前状态的最小阶段目标值
opd[i][j]=u[k];
}//System.out.print("最小值的下标是:"+l+"\t");
}
}
} //经过1000个J循环得到当前阶段下的1000个状态对应的最小阶段目标值和决策
}
int[][]tem=new int[12][1000];
for(int i=9;i>=0;i=i-1){
for(int j=0;j<x[i].length;j++){
//for(int k=0;k<u.length;k++){
int temp=1000000;
for(int r=0;r<u.length;r++){
int P[]=new int [201];
P[r]=j-u[r];//因为值和坐标一一对应
if(P[r]>=0&&P[r]<1000){
int p=P[r];
if(opt[i+1][p]<temp){
temp=opt[i+1][p];
tem[i+1][j]=temp;
opd[i][j]=u[r]; //比较出上一个阶段对应于这个状态的最小值
}
}
}
//System.out.println(tem[10][300]+"\t");
opt[i][j]=(x[i][j]-i)*(x[i][j]-i)+tem[i+1][j];//当前阶段i当前状态j对应的累加目标值
//System.out.println(B[j][k]+"\t");
//if(B[j][1]<temp){
//temp=B[j][1];
//opt[i][j]=temp;//在循环中得到当前阶段当前状态的最小阶段目标值
//}
//}
}//整个k循环结束就得到唯一的j状态对应的最优目标值opt[i][j]及u[k]
}
//System.out.println(tem[10][300]+"\t");//验证tem[10][300]=opt[10][200]=44021
//System.out.println(opt[10][300]+"\t");//验证opt[10][300]=119821
//System.out.println(opt[9][300]+"\t");
long min=10000000000000000L;
int c=0;
for(int j=0;j<opt[0].length;j++)
{
if(opt[0][j]<min)
{
min=opt[0][j];
c=j;
}
}
//System.out.println(c+"\t");
//System.out.println(opt[9][9]+"\t");
int i=0;
System.out.println("第"+i+"阶段的最优调度状态水量是:"+x[i][c]+"\t"+"\t");
while(i<11){
int X=x[i][c]-opd[i][c];
int index=Arrays.binarySearch(x[i+1],X);//寻找出下一个状态值的位置
c=index;
System.out.println("第"+(i+1)+"阶段的最优调度状态水量是:"+x[i][c]+"\t");
i=i+1;
};
}
}
DP.rar_动态规划初级程序_水库调度
版权申诉
5星 · 超过95%的资源 76 浏览量
2022-09-23
18:18:11
上传
评论 1
收藏 2KB RAR 举报
JaniceLu
- 粉丝: 78
- 资源: 1万+
最新资源
- XILINXFPGA源码Xilinxspratan3xcs100E(VGAPS2)
- XILINXFPGA源码XilinxSPARTAN-3E入门开发板实例
- XILINXFPGA源码XilinxSdramVerilog和VHDL版本文档
- 物联网智能家居方案-基于Nucleo-STM32L073&机智云(大赛作品,文档齐全,可直接运行)(文档加Matlab源码)
- XILINXFPGA源码XilinxISE9.xFPGACPLD设计源码
- 成都市地图含高新区(高新南区,高新西区),天府新区,东部新区虚拟行政区划
- XILINXFPGA源码XilinxEDK设计试验
- XILINXFPGA源码XilinxEDKMicroBlaze内置USB固件程序
- 基于 django 的视频点播后台管理系统源代码+数据库
- 基于Java的网上医院预约挂号系统的设计与实现(部署视频)-kaic.mp4
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论1