`
xinglijun1973
  • 浏览: 54961 次
社区版块
存档分类
最新评论

动态规划通用算法的java实现

阅读更多

谁说动态规则算法不能通用?我写了个通用算法,不知道能否通用,欢迎交流qq 15367481。

使用示例:

		
		//定义状态
		State a=new State("a"),
		b1=new State("b1"),
		b2=new State("b2"),
		b3=new State("b3"),
		c1=new State("c1"),
		c2=new State("c2"),
		c3=new State("c3"),
		d1=new State("d1"),
				d11=new State("d11"),
		d2=new State("d2"),
		e=new State("e");
		
		DynamicProgram prog=new DynamicProgram();
		//起点
		prog.start=a;
//		终点
		prog.end=e;
		
//		加入多阶段状态
		prog.addPhase(b1, b2);
		prog.addPhase(c1,c2,c3);
		prog.addPhase(d1,d11, d2);
		
//		加入状态转移时的决策
		prog.addDecision(a, b1,2);
		prog.addDecision(a, b2,5);
		prog.addDecision(a, b3,1);

		prog.addDecision(b1,c1,12 );
		prog.addDecision(b1,c2,14 );
		
		prog.addDecision(b2,c1,6 );
		prog.addDecision(b2,c2 ,10);
		prog.addDecision(b2,c3 ,4);
		
		prog.addDecision(b3,c1,10 );
		prog.addDecision(b3,c2 ,12);
		prog.addDecision(b3,c3 ,11);
		prog.addDecision( c1,d1,3);
		prog.addDecision( c1,d11,1);
		prog.addDecision( c1,d2,9);
		prog.addDecision( c2,d1,6);
		prog.addDecision( c2,d2,5);
		prog.addDecision( c3,d2,10);
		prog.addDecision(d1,e ,5);
		prog.addDecision(d11,e ,7);
		prog.addDecision( d2,e,2);
		
		//状态变量的比较,取优
		prog.chosePolicy=new Choose() {
			
			@Override
			public int compare(Object newStateVal,Object oldStateVal) {
//				本示例中,最短路问题,找总距离小的
				int oldV = ((Integer)oldStateVal).intValue();
				int newV = ((Integer)newStateVal).intValue();
				if(oldV==newV)
					return 0;
				else if(newV<oldV)
					return 1;
				else return -1;
			}
			
			@Override
			public Object getStateVal(Decision decision) { 
//				本示例中,总距离=上次距离+这次决策的距离
				int stateVal = ((Integer)decision.from.stateVal ).intValue();
				int cost = ((Integer)decision.cost).intValue();
				return stateVal+ cost;
			}
		};
		
		//求解
		prog.start();
		
		//打印路径
		System.out.println("最小费用示例,找到2个最优的策略:");
		System.out.println(e.stateVal);
		//最优策略集合
		HashSet<LinkedList<State>> strategies = new HashSet<LinkedList<State>>();
		prog.getStrategyState(strategies,new LinkedList<State>(),e);
		for(LinkedList<State> strategy:strategies){
//			打印所有策略
			System.out.println(strategy);
			System.out.println(prog.getStrategyPath(strategy));
		}
	
		System.out.println("\n最优路径中的子路径也是最优的:\n"+d1.stateVal);
		 strategies = new HashSet<LinkedList<State>>();
		prog.getStrategyState(strategies,new LinkedList<State>(),d1);
		for(LinkedList<State> strategy:strategies){
			System.out.println(strategy);
			System.out.println(prog.getStrategyPath(strategy));
		}

 

 运行结果:

 
最小费用示例,找到2个最优的策略:
19
[a, b2, c1, d1, e]
[a->b2:5, b2->c1:6, c1->d1:3, d1->e:5]
[a, b2, c1, d11, e]
[a->b2:5, b2->c1:6, c1->d11:1, d11->e:7]

最优路径中的子路径也是最优的:
14
[a, b2, c1, d1]
[a->b2:5, b2->c1:6, c1->d1:3]
 

 

 

0
1
分享到:
评论

相关推荐

    tomasulo算法java实现

    Tomasulo算法是一种著名的动态调度算法,用于优化现代计算机处理器中的指令执行,通过重叠不同指令的计算阶段来提高处理器的吞吐量。这个Java实现是帮助理解Tomasulo算法工作原理的一个很好的实践示例。 在Java代码...

    K-Means算法java实现

    Java作为一种通用且广泛使用的编程语言,提供了实现K-Means算法的良好平台,尤其适合初学者学习数据挖掘技术。 K-Means算法的核心步骤包括初始化中心点、计算样本到中心点的距离、重新分配样本点所属类别以及更新...

    Java经典算法(通用搜索算法及实现)

    本文将深入探讨通用搜索算法及其在Java中的实现,以N皇后问题为例进行具体阐述。 1. **组合问题的通用搜索算法** 在组合问题中,通常涉及在状态空间树中进行搜索,以找到满足特定条件的解。状态空间树的搜索算法...

    各种排序算法java实现

    本资源"各种排序算法java实现"聚焦于将这些算法用Java代码来具体展示,对于学习和理解算法有着极大的帮助。 在Java中,我们通常会接触到以下几种经典的排序算法: 1. **冒泡排序**(Bubble Sort):通过不断交换...

    DES算法Java实现

    Java作为一种多平台通用的编程语言,提供了丰富的API来支持DES算法的实现。 首先,我们需要了解DES算法的基本步骤,包括初始置换、16轮迭代和逆初始置换。每轮迭代由子密钥产生、置换选择、行移位和S盒替换四个步骤...

    G.721语音压缩算法的java实现

    在Java编程语言中实现G.721算法,通常会涉及以下几个关键步骤: 1. **采样与量化**:首先,原始的模拟语音信号通过ADC(模数转换器)转换成数字信号,以8kHz的频率进行采样,得到16位的线性PCM(脉冲编码调制)数据...

    CRC算法 (Java版)

    在Java中实现CRC算法,通常涉及以下几个关键步骤: 1. **选择CRC多项式**:CRC有不同的版本,如CRC-8、CRC-16、CRC-32和CRC-64,每种对应不同的预定义多项式。例如,CRC-32使用的多项式是0x4C11DB7,CRC-16可能是0...

    通用的维特比算法实现

    维特比算法(Viterbi Algorithm)是一种在序列模型中寻找最可能的解释序列的动态规划方法,尤其在通信、语音识别、自然语言处理等领域有着广泛的应用。算法的核心思想是找到一条通过观测序列的概率最高的状态路径,...

    三平台通用加密算法(java/.net/Object-C)

    总的来说,"三平台通用加密算法"是实现跨平台数据安全的关键技术,涉及到了Java、.Net和Objective-C的加密API使用,以及加密过程中的编码解码、密钥管理和错误处理等多个环节。理解和掌握这些知识点对于开发安全的多...

    二维矩形装箱算法--二叉树--java实现

    在Java实现中,`BaseBoxChoose.java`可能包含了装箱算法的基本策略或基类,定义了装箱选择的接口和通用方法。`Slaves.java`可能是处理并行计算的部分,利用多线程并行处理多个箱子的装车问题,提高算法执行效率。`...

    关联规则算法实现 java

    在这个项目中,我们将关注如何使用Java来实现关联规则算法,特别是Apriori算法。 首先,我们要理解Apriori算法的核心原理。Apriori算法是一种迭代的、基于频繁项集生成的算法,主要用于找出数据库中的频繁出现的项...

    Java程序自动调洪,试算法

    在水文学中,洪水调度算法通常基于数学模型,如动态规划、线性规划、遗传算法或模拟退火等。这些算法用于预测洪水的发生、传播和消退过程,以及根据预设的优化目标(如最小化损失、最大化安全系数等)来制定水库开闸...

    三种排序算法java实现

    `Sort.java`可能包含了一些通用的排序接口或抽象类,定义了排序算法的一些基本操作。`FileOp.java`可能用于文件操作,比如读取和写入算法分析文档或者原始数据。而`Frame1.java`可能是一个图形用户界面(GUI)的组件...

    apriori算法java实现源代码

    Apriori算法是一种在数据挖掘领域广泛应用的关联规则学习算法,主要用于发现大量交易数据中的频繁项集和强关联规则。...Java作为通用的编程语言,提供了灵活的实现方式,使得我们可以方便地将算法应用于各种实际场景。

    java实现卷积算法.zip

    Java作为一种通用的编程语言,被广泛用于实现各种算法,包括卷积。在这个“java实现卷积算法.zip”压缩包中,我们可以期待找到一个用Java编写的卷积算法实现。 卷积是一种数学运算,它在两个函数之间进行,通常是...

    delphi,java des算法通用加解密源码

    标题中的"delphi,java des算法通用加解密源码"指的是使用DES(Data Encryption Standard)算法实现的加密和解密功能,适用于两种不同的编程语言:Delphi和Java。DES是一种广泛使用的对称加密算法,它基于块密码设计...

Global site tag (gtag.js) - Google Analytics