From 75bceadc405ebdb5a202313f6e7fd1d062ee0935 Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Wed, 23 Aug 2017 20:44:50 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E9=87=8D=E6=9E=84dpKnapsack=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=83=8C=E5=8C=85=E9=97=AE=E9=A2=98=E7=9A=84?= =?UTF-8?q?dataSet=E5=AE=9E=E7=8E=B0=EF=BC=8C=E5=A2=9E=E5=8A=A0=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../function/list/DpKnapsackFunction.java | 198 +++++++----------- .../function/DataSetKnapsackFunction.java | 168 +++++++++++++++ .../src/main/resources/dataset.beans.xml | 4 + .../src/test/resources/example/DPknapsack.ts | 74 ------- .../test/resources/example/baseDpknapsack.ts | 29 +++ .../resources/example/dataSetDpKnapsack.ts | 54 +++++ .../src/test/resources/example/dpFund.ts | 12 ++ .../src/test/resources/example/dpShopping.ts | 23 ++ .../src/test/resources/example/knapsack1.txt | 6 + .../src/test/resources/example/knapsack2.txt | 6 + .../src/test/resources/example/knapsack3.txt | 6 + .../src/test/resources/example/knapsack4.txt | 6 + .../src/test/resources/example/knapsack5.txt | 6 + .../function/AbstractDpKnapsackFunction.java | 157 ++++++++++++++ 14 files changed, 549 insertions(+), 200 deletions(-) create mode 100644 org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetKnapsackFunction.java delete mode 100644 org.tinygroup.tinyscript/src/test/resources/example/DPknapsack.ts create mode 100644 org.tinygroup.tinyscript/src/test/resources/example/baseDpknapsack.ts create mode 100644 org.tinygroup.tinyscript/src/test/resources/example/dataSetDpKnapsack.ts create mode 100644 org.tinygroup.tinyscript/src/test/resources/example/dpFund.ts create mode 100644 org.tinygroup.tinyscript/src/test/resources/example/dpShopping.ts create mode 100644 org.tinygroup.tinyscript/src/test/resources/example/knapsack1.txt create mode 100644 org.tinygroup.tinyscript/src/test/resources/example/knapsack2.txt create mode 100644 org.tinygroup.tinyscript/src/test/resources/example/knapsack3.txt create mode 100644 org.tinygroup.tinyscript/src/test/resources/example/knapsack4.txt create mode 100644 org.tinygroup.tinyscript/src/test/resources/example/knapsack5.txt create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractDpKnapsackFunction.java diff --git a/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/DpKnapsackFunction.java b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/DpKnapsackFunction.java index c0cb406..50335e6 100644 --- a/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/DpKnapsackFunction.java +++ b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/DpKnapsackFunction.java @@ -2,27 +2,18 @@ package org.tinygroup.tinyscript.collection.function.list; import java.lang.reflect.Array; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import org.tinygroup.tinyscript.ScriptContext; import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.tinyscript.ScriptSegment; -import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.function.AbstractDpKnapsackFunction; import org.tinygroup.tinyscript.interpret.LambdaFunction; -import org.tinygroup.tinyscript.interpret.ScriptResult; -public class DpKnapsackFunction extends AbstractScriptFunction { - - private Integer[] items;// 存放每种物品的数量 - - @Override - public String getNames() { - // TODO Auto-generated method stub - return "DPknapsack"; - } +public class DpKnapsackFunction extends AbstractDpKnapsackFunction { @Override public String getBindingTypes() { @@ -31,128 +22,101 @@ public class DpKnapsackFunction extends AbstractScriptFunction { @Override public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { - // TODO Auto-generated method stub if (parameters == null || parameters.length <= 3) { - throw new ScriptException("sort函数的参数 错误!"); + throw new ScriptException("dpKnapsack参数 错误!"); } - List list = (List) parameters[0]; - int size = (Integer) parameters[1]; - Map lastresult = new HashMap(); + List result = null; + List list = (List) parameters[0]; + int bagSize = (Integer) parameters[1]; + int[] weight = (int[]) ConvertToArray(parameters[2], int.class); + if (checkParameters(parameters, 4)) {// 无限背包 try { - LambdaFunction lambdaFunction = (LambdaFunction) parameters[3]; - Object v = lambdaFunction.execute(context, null).getResult(); - int[] count = new int[list.size() + 1]; - int[] w = (int[]) ConvertToArray(parameters[2], int.class); - for (int i = 1; i < count.length; i++) { - count[i] = size / w[i]; + int[] maxCount = getCount(null, weight, bagSize); + + Object value = parameters[3]; + if (value instanceof LambdaFunction) { + value = ((LambdaFunction) parameters[3]).execute(context).getResult(); } - result = DpKnapsackResult(w, (double[]) ConvertToArray(v, double.class), size, count); + + result = dpKnapsackResult(weight, (double[]) ConvertToArray(value, double.class), bagSize, maxCount); } catch (Exception e) { - throw new ScriptException("sort函数执行发生异常:", e); + throw new ScriptException("dpKnapsack函数执行发生异常:", e); } } else if (checkParameters(parameters, 5)) {// 混合背包和多重背包 try { - LambdaFunction lambdaFunction = (LambdaFunction) parameters[4]; - Object v = lambdaFunction.execute(context, null).getResult(); - int[] count = (int[]) ConvertToArray(parameters[3], int.class); - int[] w = (int[]) ConvertToArray(parameters[2], int.class); - for (int i = 1; i < count.length; i++) { - if (count[i] == -1) - count[i] = size / w[i]; + int[] maxCount = getCount(parameters[3], weight, bagSize); + + Object value = parameters[4]; + if (value instanceof LambdaFunction) { + value = ((LambdaFunction) parameters[4]).execute(context).getResult(); } - result = DpKnapsackResult(w, (double[]) ConvertToArray(v, double.class), size, count); + + result = dpKnapsackResult(weight, (double[]) ConvertToArray(value, double.class), bagSize, maxCount); } catch (Exception e) { - throw new ScriptException("sort函数执行发生异常:", e); + throw new ScriptException("dpKnapsack函数执行发生异常:", e); } - } else if (checkParameters(parameters, 6)) {// 用户定义规则(目前是主件和附件) + } else if (checkParameters(parameters, 6)) {// 用户定义规则 try { - int[] rule = (int[]) ConvertToArray(parameters[4], int.class);// 主件和附件规则 + int[] maxCount = getCount(parameters[3], weight, bagSize); + + Object value = parameters[4]; + if (value instanceof LambdaFunction) { + value = ((LambdaFunction) parameters[4]).execute(context).getResult(); + } + LambdaFunction lambdaFunction = (LambdaFunction) parameters[5]; - Object v = lambdaFunction.execute(context, null).getResult(); - result = DpKnapsackResult((int[]) ConvertToArray(parameters[2], int.class), - (double[]) ConvertToArray(v, double.class), size, - (int[]) ConvertToArray(parameters[3], int.class), rule); + + result = dpKnapsackResult(weight, (double[]) ConvertToArray(value, double.class), bagSize, maxCount, + list, context, lambdaFunction); } catch (Exception e) { - throw new ScriptException("sort函数执行发生异常:", e); + throw new ScriptException("dpKnapsack函数执行发生异常:", e); } } - lastresult.put("result", result.get(0)); - for (int i = 1; i < result.size(); i++) { - lastresult.put(list.get(i - 1), result.get(i)); - } - return lastresult; - } + return getLastResult(result, list); - private List DpKnapsackResult(int[] w, double[] v, int bagSize, int[] count, Object... rules) { - double result[][] = new double[w.length][bagSize + 1]; - // 计算最优解 - DpKnapsackResult(result, w.length - 1, bagSize, w, count, v, rules); - // 根据最优解查找最优方案 - items = new Integer[w.length]; - FindResult(w.length - 1, bagSize, result, w, v, count); - - List list = new ArrayList(); - Collections.addAll(list, items); - list.set(0, result[w.length - 1][bagSize]); - return list; } - /** - * 解决背包问题 - * @param f 最优值二维表 - * @param N 物品件数 - * @param V 最大容量 - * @param w 重量 - * @param count 物品限制件数 - * @param value 物品价值 - * @param rules 自定义规则(主件和附件) - */ - private void DpKnapsackResult(double f[][], int N, int V, int[] w, int[] count, double value[], - Object... rules) { - int nCount = 0; - for (int i = 0; i <= N; i++) { - f[i][0] = 0; - } - for (int v = 0; v <= V; v++) { - f[0][v] = 0; + @Override + protected List getLastResult(List result, Object list) { + List lastResult = new ArrayList();// 需要打印的结果 + Map resultValue = new HashMap(); + resultValue.put("result", result.get(0)); + int index = 0; + for (int i = 1; i < result.size(); i++) { + if ((Integer) result.get(i) == 0) { + ((List) list).remove(i - 1 - index); + index++; + } } - for (int i = 1; i <= N; i++) { - for (int v = w[i]; v <= V; v++) { - f[i][v] = 0; - nCount = Math.min(count[i], v / w[i]); - for (int k = 0; k <= nCount; k++) { - if (rules != null && rules.length > 0) { - int[] rule = (int[]) rules[0]; - if (rule[i] == 0) {//考虑到主件和附件的情况 - if (w[i] <= v) { - f[i][v] = Math.max(f[i][v], f[i - 1][v - k * w[i]] + k * value[i]); - } - } else { - if (w[i] + w[rule[i]] <= v) { - f[i][v] = Math.max(f[i][v], f[i - 1][v - k * w[i]] + k * value[i]); - } - } - } else { - f[i][v] = Math.max(f[i][v], f[i - 1][v - k * w[i]] + k * value[i]); - } - } + Iterator it = result.subList(1, result.size()).iterator(); + while (it.hasNext()) { + if ((Integer) it.next() == 0) { + it.remove(); } } + lastResult.add(resultValue); + lastResult.add(list); + lastResult.add(result.subList(1, result.size())); + return lastResult; + } - /** * 将数组或列表转为背包问题需要的数组 - * @param array 需要转化的对象有可能是数组也有可能是list - * @param clazz 需要转化的数组类型 + * + * @param array + * 需要转化的对象有可能是数组也有可能是list + * @param clazz + * 需要转化的数组类型 * @return * @throws ScriptException */ - private Object ConvertToArray(Object array, Class clazz) throws ScriptException { + @Override + public Object ConvertToArray(Object array, Class clazz) throws ScriptException { Object obj = null; if (array instanceof List) { obj = Array.newInstance(clazz, ((List) array).size() + 1); @@ -172,31 +136,13 @@ public class DpKnapsackFunction extends AbstractScriptFunction { return obj; } - /** - * @param i - * @param j 供递归调用的下标 - * @param f 存贮最佳结果的二维表 - * @param w 重量 - * @param v 价值 - * @param count 限制数量 - */ - private void FindResult(int i, int j, double[][] f, int[] w, double[] v, int count[]) { - if (i > 0) { - if (f[i][j] == f[i - 1][j]) { - items[i] = 0;// 全局变量,标记未被选中 - FindResult(i - 1, j, f, w, v, count); - } else if (j - w[i] >= 0) { - int min = Math.min(j / w[i], count[i]); - int temp = 0; - for (int k = 1; k <= min; k++) { - if (f[i - 1][j - k * w[i]] == f[i][j] - k * v[i]) { - temp = k; - break; - } - } - items[i] = temp;// 标记已被选中 - FindResult(i - 1, j - temp * w[i], f, w, v, count);// 回到装包之前的位置 - } + @Override + protected boolean executePrune(LambdaFunction pruneFunction, ScriptContext context, Object... parameters) + throws ScriptException { + try { + return (Boolean) (pruneFunction.execute(context, parameters).getResult()); + } catch (Exception e) { + throw new ScriptException("剪枝函数执行异常", e); } } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetKnapsackFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetKnapsackFunction.java new file mode 100644 index 0000000..48874ec --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetKnapsackFunction.java @@ -0,0 +1,168 @@ +package org.tinygroup.tinyscript.dataset.function; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.AbstractDataSet; +import org.tinygroup.tinyscript.dataset.DataSet; +import org.tinygroup.tinyscript.dataset.Field; +import org.tinygroup.tinyscript.dataset.impl.DefaultDataSetColumn; +import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; +import org.tinygroup.tinyscript.dataset.util.DataSetUtil; +import org.tinygroup.tinyscript.function.AbstractDpKnapsackFunction; +import org.tinygroup.tinyscript.impl.DefaultScriptContext; +import org.tinygroup.tinyscript.interpret.LambdaFunction; + +public class DataSetKnapsackFunction extends AbstractDpKnapsackFunction { + + @Override + public String getBindingTypes() { + return DataSet.class.getName(); + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + if (parameters == null || parameters.length <= 3) { + throw new ScriptException("dpKnapsack函数的参数 错误!"); + } + + SimpleDataSet dataSet = (SimpleDataSet) parameters[0]; + + int bagSize = (Integer) parameters[1]; + int[] weight = (int[]) ConvertToArray(parameters[2], int.class); + + List result = null; + + context = setColData(dataSet, context); + if (checkParameters(parameters, 4)) { + try { + int[] maxCount = getCount(null, weight, bagSize); + + result = dpKnapsackResult(weight, (double[]) ConvertToArray(parameters[3], double.class), bagSize, + maxCount); + } catch (Exception e) { + throw new ScriptException("执行dpKnapsack出错", e); + } + } else if (checkParameters(parameters, 5)) { + try { + int[] maxCount; + if (parameters[4] instanceof LambdaFunction) { + maxCount = getCount(null, weight, bagSize); + result = dpKnapsackResult(weight, (double[]) ConvertToArray(parameters[3], double.class), bagSize, + maxCount, dataSet, context, parameters[4]); + } else { + maxCount = getCount(parameters[3], weight, bagSize); + result = dpKnapsackResult(weight, (double[]) ConvertToArray(parameters[4], double.class), bagSize, + maxCount); + } + + } catch (Exception e) { + throw new ScriptException("执行dpKnapsack出错", e); + } + } else if (checkParameters(parameters, 6)) { + try { + int[] maxCount = getCount(parameters[3], weight, bagSize); + LambdaFunction lambdaFunction = (LambdaFunction) parameters[5]; + + result = dpKnapsackResult(weight, (double[]) ConvertToArray(parameters[4], double.class), bagSize, + maxCount, dataSet, context, lambdaFunction); + } catch (Exception e) { + throw new ScriptException("执行dpKnapsack出错", e); + } + } else { + throw new ScriptException("参数格式不对"); + } + + return getLastResult(result, dataSet); + + } + + @Override + protected Object ConvertToArray(Object array, Class clazz) throws ScriptException { + int length; + DefaultDataSetColumn setColumn = (DefaultDataSetColumn) array; + Object obj = null; + try { + length = setColumn.getRows(); + obj = Array.newInstance(clazz, length + 1); + for (int i = 1; i < length + 1; i++) { + if (clazz == int.class || clazz == Integer.class) { + Array.set(obj, i, Integer.parseInt(setColumn.getData(i) + "")); + } else { + Array.set(obj, i, Double.parseDouble(setColumn.getData(i) + "")); + } + } + } catch (Exception e) { + throw new ScriptException("转换数组发生异常", e); + } + + return obj; + } + + private ScriptContext setColData(AbstractDataSet dataSet, ScriptContext context) throws ScriptException { + ScriptContext subContext = new DefaultScriptContext(); + subContext.setParent(context); + try { + for (int j = 0; j < dataSet.getColumns(); j++) { + Field field = dataSet.getFields().get(j); + subContext.put(field.getName(), DataSetUtil.createDataSetColumn(dataSet, dataSet.getShowIndex(j))); + } + } catch (Exception e) { + throw new ScriptException("添加列到上下文出错", e); + } + return subContext; + } + + @Override + protected List getLastResult(List result, Object obj) throws ScriptException { + List lastResult = new ArrayList();// 需要打印的结果 + Map resultValue = new HashMap(); + resultValue.put("result", result.get(0)); + + SimpleDataSet dataSet; + int index = 0; + + try { + dataSet = (SimpleDataSet) ((SimpleDataSet) obj).clone(); + for (int i = 1; i < result.size(); i++) { + if ((Integer) result.get(i) == 0) { + dataSet.deleteRow(i - index); + index++; + } + } + } catch (Exception e) { + throw new ScriptException("删除行失败", e); + } + + Iterator it = result.subList(1, result.size()).iterator(); + while (it.hasNext()) { + if ((Integer) it.next() == 0) { + it.remove(); + } + } + lastResult.add(resultValue); + lastResult.add(dataSet); + lastResult.add(result.subList(1, result.size())); + return lastResult; + } + + @Override + protected boolean executePrune(LambdaFunction pruneFunction, ScriptContext context, Object... parameters) + throws ScriptException { + try { + int i = (Integer) parameters[1] + 1; + int bagSize = (Integer) parameters[2]; + return (Boolean) (pruneFunction.execute(context, i, bagSize).getResult()); + } catch (Exception e) { + throw new ScriptException("剪枝函数执行异常", e); + } + } + +} diff --git a/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.beans.xml b/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.beans.xml index 43632b8..d4cd28b 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.beans.xml +++ b/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.beans.xml @@ -139,4 +139,8 @@ class="org.tinygroup.tinyscript.dataset.objectitem.DataSetRowItemProcessor"> + + + diff --git a/org.tinygroup.tinyscript/src/test/resources/example/DPknapsack.ts b/org.tinygroup.tinyscript/src/test/resources/example/DPknapsack.ts deleted file mode 100644 index 3f9e28b..0000000 --- a/org.tinygroup.tinyscript/src/test/resources/example/DPknapsack.ts +++ /dev/null @@ -1,74 +0,0 @@ -//参数说明:list.DPknapsack(容量,重量,[每件物品的件数],价值,[规则]) - -//01背包 -w = [2,2,6,5,4]; -count = [1,1,1,1,1]; -size = 10; -list = ["a","b","c","d","e"]; -result = list.DPknapsack(size,w,count,()->{ - return [6,3,5,4,6]; -}); -println("01背包问题:\n"+result); - -//完全背包 -w = [2,2,6,5,4]; -size = 10; -list = ["a","b","c","d","e"]; -result = list.DPknapsack(size,w,()->{ - return [6,3,5,4,6]; -}); -println("完全背包问题:\n"+result); - -//多重背包 -w = [12,2,1,4,1]; -size = 15; -count = [1,7,12,3,1]; -list = ["a","b","c","d","e"]; -result = list.DPknapsack(size,w,count,()->{ - return [4,2,1,10,2]; -}); -println("多重背包问题:\n"+result); - -//混合背包 -w = [12,2,1,4,1]; -size = 15; -count = [1,7,12,3,-1];//-1表示该物品无件数限制 -list = ["a","b","c","d","e"]; -result = list.DPknapsack(size,w,count,()->{ - return [4,2,1,10,2]; -}); -println("混合背包问题:\n"+result); - -/*小王有一笔钱m(5000),在t(80)时间内,想做理财投资,有如下几只理财产品,请给出最佳方案*/ -w = [100,100,100,100,100];//基金的最小购买额度 -count = [10,20,20,10,5];//购买基金的份数 -list = ["鹏华国防","鹏华中证","国投瑞银","华商主题精选","金鹰智慧"];//基金的名字 -result = list.DPknapsack(5000,w,count,()->{ - lilv = [0.00045,0.00035,0.00055,0.00040,0.00030];//基金的利率 - value = []; - for(i = 0;i{ - v = [1600,2000,1500,1200,1000]; - return v; -}); -println("购物单问题:\n"+result); - - diff --git a/org.tinygroup.tinyscript/src/test/resources/example/baseDpknapsack.ts b/org.tinygroup.tinyscript/src/test/resources/example/baseDpknapsack.ts new file mode 100644 index 0000000..a0d5a70 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/example/baseDpknapsack.ts @@ -0,0 +1,29 @@ +//参数说明:list.DPknapsack(容量,重量,[每件物品的件数],价值,[规则]) + +class Obj{ + name,weight,value; + Obj(name,weight,value){ + } +} +//==================================================================================================== + +//01背包 +list=[new Obj("a",2,6.0),new Obj("b",2,3.0),new Obj("c",6,5.0),new Obj("d",5,4.0),new Obj("e",4,6.0)]; +println("01背包问题:\n"+list.dpKnapsack(10,list.weight,1,list.value)); + +//完全背包 +list=[new Obj("a",2,6.0),new Obj("b",2,3.0),new Obj("c",6,5.0),new Obj("d",5,4.0),new Obj("e",4,6.0)]; +println("完全背包问题:\n"+list.dpKnapsack(10,list.weight,list.value)); + + +//多重背包 +list=[new Obj("a",12,4.0),new Obj("b",2,2.0),new Obj("c",1,1.0),new Obj("d",4,10.0),new Obj("e",1,2.0)]; +println("多重背包问题:\n"+list.dpKnapsack(15,list.weight,[1,7,12,3,1],list.value)); + + +//混合背包 +list=[new Obj("a",12,4.0),new Obj("b",2,2.0),new Obj("c",1,1.0),new Obj("d",4,10.0),new Obj("e",1,2.0)]; +println("多重背包问题:\n"+list.dpKnapsack(15,list.weight,[1,7,12,3,-1],list.value)); + + + diff --git a/org.tinygroup.tinyscript/src/test/resources/example/dataSetDpKnapsack.ts b/org.tinygroup.tinyscript/src/test/resources/example/dataSetDpKnapsack.ts new file mode 100644 index 0000000..98ec3ab --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/example/dataSetDpKnapsack.ts @@ -0,0 +1,54 @@ +dataSet = readTxt("/example/knapsack1.txt"); +dataSet = dataSet.double("value").int("weight").int("count"); +//================================================================================ +//01背包 +println(dataSet.dpKnapsack(10,dataSet.weight,1,dataSet.value)); + +//完全背包 +println(dataSet.dpKnapsack(10,dataSet.weight,dataSet.value)); +//================================================================================ + + +dataSet = readTxt("/example/knapsack2.txt"); +dataSet = dataSet.double("value").int("weight").int("count"); +//================================================================================ +//多重背包 +println(dataSet.dpKnapsack(15,dataSet.weight,dataSet.count,dataSet.value)); + + +dataSet = readTxt("/example/knapsack3.txt"); +dataSet = dataSet.double("value").int("weight").int("count"); +//================================================================================ +//混合背包 +println(dataSet.dpKnapsack(15,dataSet.weight,dataSet.count,dataSet.value)); + + +dataSet = readTxt("/example/knapsack4.txt"); +dataSet = dataSet.int("minmoney").int("maxmoney").double("interestRate"); +dataSet.insertColumn(1,"value").insertColumn(2,"count").double("value").int("count"); +dataSet.update("value",interestRate[0]*minmoney[0]*80); +dataSet.update("count",maxmoney[0]/minmoney[0]); +//================================================================================ +//基金问题 +println(dataSet.dpKnapsack(5000,dataSet.minmoney,dataSet.count,dataSet.value)); + + +dataSet = readTxt("/example/knapsack5.txt"); +dataSet = dataSet.int("price").int("importance").int("rule"); +dataSet.insertColumn(1,"value").double("value"); +dataSet.update("value",price[0]*importance[0]); +//================================================================================ +//基金问题 +println(dataSet.dpKnapsack(1000,dataSet.price,1,dataSet.value,(i,money)->{ + if(rule[i] == 0){ + if( price[i] <= money){ + return true; + } + }else{ + k = rule[i]; + if(price[i]+price[k]<=money){ + return true; + } + } + return false; +})); diff --git a/org.tinygroup.tinyscript/src/test/resources/example/dpFund.ts b/org.tinygroup.tinyscript/src/test/resources/example/dpFund.ts new file mode 100644 index 0000000..0935e08 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/example/dpFund.ts @@ -0,0 +1,12 @@ +class Product{ + name,amountPerServing ,maxCount,rate; + Product(name,amountPerServing,maxCount,rate){ + } +} +//============================================================================ + +days=80; +list=[new Product("鹏华国防",100,10,0.00045),new Product("鹏华中证",100,20,0.00035),new Product("国投瑞银",100,20,0.00055),new Product("华商主题精选",100,10,0.0004),new Product("金鹰智慧",100,5,0.0003)]; +println(list.dpKnapsack(5000,list.amountPerServing,list.maxCount,()->{ + return [0.00045,0.00035,0.00055,0.00040,0.00030]*days*100; +})); \ No newline at end of file diff --git a/org.tinygroup.tinyscript/src/test/resources/example/dpShopping.ts b/org.tinygroup.tinyscript/src/test/resources/example/dpShopping.ts new file mode 100644 index 0000000..baa6780 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/example/dpShopping.ts @@ -0,0 +1,23 @@ +/*王强今天很开心,公司发给N元的年终奖。王强决定把年终奖用于购物,他把想买的物品可能会有附件,附件是从属于某个物品的, +为了不超出预算,他把每件物品规定了一个重要度,分为 5 等:用整数 1 ~ 5 表示,如果要买归类为附件的物品,必须先买该附件所属的主件(0表示物品)。 +在不超过 N 元(可以等于 N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。*/ +class Goods{ + name,price,value,rule; + Goods(name,price,value,rule){ + } +} +list=[new Goods("电脑",800,1600.0,0),new Goods("打印机",400,2000.0,1),new Goods("扫描仪",300,1500.0,1),new Goods("书柜",400,1200.0,0),new Goods("书桌",500,1000.0,0)]; +money = 1000; +result = list.dpKnapsack(money,list.price,1,list.value,(ele,i,money)->{ + if(ele.get(i).rule ==0){ + if(ele.get(i).price<=money){ + return true; + } + }else{ + if(ele.get(i).price+ele.get(ele.get(i).rule-1).price<=money){ + return true; + } + } + return false; +}); +println("购物单问题:\n"+result); \ No newline at end of file diff --git a/org.tinygroup.tinyscript/src/test/resources/example/knapsack1.txt b/org.tinygroup.tinyscript/src/test/resources/example/knapsack1.txt new file mode 100644 index 0000000..4cb4e8e --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/example/knapsack1.txt @@ -0,0 +1,6 @@ +name weight value count +a 2 6 1 +b 2 3 1 +c 6 5 1 +d 5 4 1 +e 4 6 1 \ No newline at end of file diff --git a/org.tinygroup.tinyscript/src/test/resources/example/knapsack2.txt b/org.tinygroup.tinyscript/src/test/resources/example/knapsack2.txt new file mode 100644 index 0000000..431e4da --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/example/knapsack2.txt @@ -0,0 +1,6 @@ +name weight value count +a 12 4 1 +b 2 2 7 +c 1 1 12 +d 4 10 3 +e 1 2 1 \ No newline at end of file diff --git a/org.tinygroup.tinyscript/src/test/resources/example/knapsack3.txt b/org.tinygroup.tinyscript/src/test/resources/example/knapsack3.txt new file mode 100644 index 0000000..99efba2 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/example/knapsack3.txt @@ -0,0 +1,6 @@ +name weight value count +a 12 4 1 +b 2 2 7 +c 1 1 12 +d 4 10 3 +e 1 2 -1 \ No newline at end of file diff --git a/org.tinygroup.tinyscript/src/test/resources/example/knapsack4.txt b/org.tinygroup.tinyscript/src/test/resources/example/knapsack4.txt new file mode 100644 index 0000000..95a6dd6 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/example/knapsack4.txt @@ -0,0 +1,6 @@ +name minmoney maxmoney interestRate +鹏华国防 100 1000 0.00045 +鹏华中证 100 2000 0.00035 +国投瑞银 100 2000 0.00055 +华商主题精选 100 1000 0.0004 +金鹰智慧 100 500 0.0003 diff --git a/org.tinygroup.tinyscript/src/test/resources/example/knapsack5.txt b/org.tinygroup.tinyscript/src/test/resources/example/knapsack5.txt new file mode 100644 index 0000000..d6a413f --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/example/knapsack5.txt @@ -0,0 +1,6 @@ +name price importance rule +电脑 800 2 0 +打印机 400 5 1 +扫描仪 300 5 1 +书柜 400 3 0 +书桌 500 2 0 diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractDpKnapsackFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractDpKnapsackFunction.java new file mode 100644 index 0000000..ca4d0da --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractDpKnapsackFunction.java @@ -0,0 +1,157 @@ +package org.tinygroup.tinyscript.function; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.interpret.LambdaFunction; + +public abstract class AbstractDpKnapsackFunction extends DynamicNameScriptFunction { + + @Override + public boolean exsitFunctionName(String name) { + if (name.equals("dpKnapsack")) + return true; + return false; + } + + public List dpKnapsackResult(int[] weight, double[] value, int bagSize, int[] maxCount, + Object... parameters) throws Exception { + double result[][] = new double[weight.length][bagSize + 1]; + // 计算最优解 + dpKnapsackResult(result, weight.length - 1, bagSize, weight, maxCount, value, parameters); + // 根据最优解查找最优方案 + Integer[] items = new Integer[weight.length]; + FindResult(weight.length - 1, bagSize, result, weight, value, maxCount, items); + + List list = new ArrayList(); + Collections.addAll(list, items); + list.set(0, result[weight.length - 1][bagSize]); + return list; + } + + /** + * @param result + * 存放最优值的二维表 + * @param types + * 物品种类个数 + * @param bagSize + * 背包容量 + * @param weight + * 重量 + * @param count + * 每个物品的的最大数量 + * @param value + * 价值 + * @param parameters + * 如果有用户自定义剪枝则在该变量中 + * @throws Exception + */ + private void dpKnapsackResult(double result[][], int types, int bagSize, int[] weight, int[] maxCount, + double value[], Object... parameters) throws Exception { + ScriptContext context = null; + LambdaFunction pruneFunction = null; + if (parameters.length > 0) { + context = (ScriptContext) parameters[1]; + pruneFunction = (LambdaFunction) parameters[2]; + } + + for (int i = 0; i <= types; i++) { + result[i][0] = 0; + } + for (int v = 0; v <= bagSize; v++) { + result[0][v] = 0; + } + for (int i = 1; i <= types; i++) { + for (int v = weight[i]; v <= bagSize; v++) { + result[i][v] = 0; + int nCount = Math.min(maxCount[i], v / weight[i]); + for (int k = 0; k <= nCount; k++) { + if (parameters.length > 0) { + if (executePrune(pruneFunction, context, parameters[0], i - 1, bagSize))// 用户自定义剪枝的情况 + result[i][v] = Math.max(result[i][v], result[i - 1][v - k * weight[i]] + k * value[i]); + } else + result[i][v] = Math.max(result[i][v], result[i - 1][v - k * weight[i]] + k * value[i]); + } + } + } + } + + /** + * @param i + * @param j + * 供递归调用的下标 + * @param f + * 存贮最佳结果的二维表 + * @param w + * 重量 + * @param v + * 价值 + * @param count + * 限制数量 + * @param items + * 标记每个物品的数量状态 + */ + protected void FindResult(int i, int j, double[][] f, int[] w, double[] v, int count[], Integer[] items) { + if (i > 0) { + if (f[i][j] == f[i - 1][j]) { + items[i] = 0;// 全局变量,标记未被选中 + FindResult(i - 1, j, f, w, v, count, items); + } else if (j - w[i] >= 0) { + int min = Math.min(j / w[i], count[i]); + int temp = 0; + for (int k = 1; k <= min; k++) { + if (f[i - 1][j - k * w[i]] == f[i][j] - k * v[i]) { + temp = k; + break; + } + } + items[i] = temp;// 标记已被选中 + FindResult(i - 1, j - temp * w[i], f, w, v, count, items);// 回到装包之前的位置 + } + } + } + + /** + * @param obj + * 需要转换的参数可能是数字也有可能是数组(比如1转换为[0,1,1...] + * @param weight + * 物品重量 + * @param size + * 背包容量 + * @return + * @throws ScriptException + */ + protected int[] getCount(Object obj, int[] weight, int size) throws ScriptException { + Object maxCount = obj; + if (obj == null || (obj instanceof Integer) && (Integer) obj == -1) {// 为空时是完全背包 + maxCount = new int[weight.length]; + for (int i = 1; i < ((int[]) maxCount).length; i++) { + ((int[]) maxCount)[i] = size / weight[i]; + } + } else if (maxCount instanceof Integer) { + int temp = (Integer) maxCount; + maxCount = new int[weight.length]; + Arrays.fill((int[]) maxCount, temp); + ((int[]) maxCount)[0] = 0; + } else { + maxCount = (int[]) ConvertToArray(obj, int.class); + for (int i = 1; i < ((int[]) maxCount).length; i++) { + if (((int[]) maxCount)[i] == -1) + ((int[]) maxCount)[i] = size / weight[i]; + } + } + return (int[]) maxCount; + } + + abstract protected List getLastResult(List result, Object obj) throws ScriptException; + + abstract protected Object ConvertToArray(Object array, Class clazz) throws ScriptException; + + abstract protected boolean executePrune(LambdaFunction pruneFunction, ScriptContext context, Object... parameters) + throws ScriptException; + +} -- Gitee From 4ea2c0e70adf52d5f0f65c687145a34f4dc214ab Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Wed, 23 Aug 2017 20:51:20 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/test/resources/example/dataSetDpKnapsack.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/org.tinygroup.tinyscript/src/test/resources/example/dataSetDpKnapsack.ts b/org.tinygroup.tinyscript/src/test/resources/example/dataSetDpKnapsack.ts index 98ec3ab..1e76dbe 100644 --- a/org.tinygroup.tinyscript/src/test/resources/example/dataSetDpKnapsack.ts +++ b/org.tinygroup.tinyscript/src/test/resources/example/dataSetDpKnapsack.ts @@ -23,22 +23,22 @@ dataSet = dataSet.double("value").int("weight").int("count"); println(dataSet.dpKnapsack(15,dataSet.weight,dataSet.count,dataSet.value)); +//基金问题 dataSet = readTxt("/example/knapsack4.txt"); dataSet = dataSet.int("minmoney").int("maxmoney").double("interestRate"); dataSet.insertColumn(1,"value").insertColumn(2,"count").double("value").int("count"); dataSet.update("value",interestRate[0]*minmoney[0]*80); dataSet.update("count",maxmoney[0]/minmoney[0]); //================================================================================ -//基金问题 println(dataSet.dpKnapsack(5000,dataSet.minmoney,dataSet.count,dataSet.value)); +//购物单问题 dataSet = readTxt("/example/knapsack5.txt"); dataSet = dataSet.int("price").int("importance").int("rule"); dataSet.insertColumn(1,"value").double("value"); dataSet.update("value",price[0]*importance[0]); //================================================================================ -//基金问题 println(dataSet.dpKnapsack(1000,dataSet.price,1,dataSet.value,(i,money)->{ if(rule[i] == 0){ if( price[i] <= money){ -- Gitee From 170d3613abb6259be23c22d355e82ff129e68cd8 Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Wed, 23 Aug 2017 20:55:21 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BC=98=E5=8C=96dataSet=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/test/resources/example/dataSetDpKnapsack.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/org.tinygroup.tinyscript/src/test/resources/example/dataSetDpKnapsack.ts b/org.tinygroup.tinyscript/src/test/resources/example/dataSetDpKnapsack.ts index 1e76dbe..0d3897c 100644 --- a/org.tinygroup.tinyscript/src/test/resources/example/dataSetDpKnapsack.ts +++ b/org.tinygroup.tinyscript/src/test/resources/example/dataSetDpKnapsack.ts @@ -10,14 +10,14 @@ println(dataSet.dpKnapsack(10,dataSet.weight,dataSet.value)); dataSet = readTxt("/example/knapsack2.txt"); -dataSet = dataSet.double("value").int("weight").int("count"); +dataSet = dataSet.double("value").int("weight","count"); //================================================================================ //多重背包 println(dataSet.dpKnapsack(15,dataSet.weight,dataSet.count,dataSet.value)); dataSet = readTxt("/example/knapsack3.txt"); -dataSet = dataSet.double("value").int("weight").int("count"); +dataSet = dataSet.double("value").int("weight","count"); //================================================================================ //混合背包 println(dataSet.dpKnapsack(15,dataSet.weight,dataSet.count,dataSet.value)); @@ -25,7 +25,7 @@ println(dataSet.dpKnapsack(15,dataSet.weight,dataSet.count,dataSet.value)); //基金问题 dataSet = readTxt("/example/knapsack4.txt"); -dataSet = dataSet.int("minmoney").int("maxmoney").double("interestRate"); +dataSet = dataSet.int("minmoney","maxmoney").double("interestRate"); dataSet.insertColumn(1,"value").insertColumn(2,"count").double("value").int("count"); dataSet.update("value",interestRate[0]*minmoney[0]*80); dataSet.update("count",maxmoney[0]/minmoney[0]); @@ -35,7 +35,7 @@ println(dataSet.dpKnapsack(5000,dataSet.minmoney,dataSet.count,dataSet.value)); //购物单问题 dataSet = readTxt("/example/knapsack5.txt"); -dataSet = dataSet.int("price").int("importance").int("rule"); +dataSet = dataSet.int("price","importance","rule"); dataSet.insertColumn(1,"value").double("value"); dataSet.update("value",price[0]*importance[0]); //================================================================================ -- Gitee From a8fe22f192f0a536c28ad5b2a4ea1c7b2fe63f24 Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Wed, 23 Aug 2017 21:02:11 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=E6=8B=BC=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../collection/function/list/DpKnapsackFunction.java | 10 +++++----- .../dataset/function/DataSetKnapsackFunction.java | 12 ++++++------ .../function/AbstractDpKnapsackFunction.java | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/DpKnapsackFunction.java b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/DpKnapsackFunction.java index 50335e6..a16e7ae 100644 --- a/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/DpKnapsackFunction.java +++ b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/DpKnapsackFunction.java @@ -30,7 +30,7 @@ public class DpKnapsackFunction extends AbstractDpKnapsackFunction { List list = (List) parameters[0]; int bagSize = (Integer) parameters[1]; - int[] weight = (int[]) ConvertToArray(parameters[2], int.class); + int[] weight = (int[]) convertToArray(parameters[2], int.class); if (checkParameters(parameters, 4)) {// 无限背包 try { @@ -41,7 +41,7 @@ public class DpKnapsackFunction extends AbstractDpKnapsackFunction { value = ((LambdaFunction) parameters[3]).execute(context).getResult(); } - result = dpKnapsackResult(weight, (double[]) ConvertToArray(value, double.class), bagSize, maxCount); + result = dpKnapsackResult(weight, (double[]) convertToArray(value, double.class), bagSize, maxCount); } catch (Exception e) { throw new ScriptException("dpKnapsack函数执行发生异常:", e); @@ -55,7 +55,7 @@ public class DpKnapsackFunction extends AbstractDpKnapsackFunction { value = ((LambdaFunction) parameters[4]).execute(context).getResult(); } - result = dpKnapsackResult(weight, (double[]) ConvertToArray(value, double.class), bagSize, maxCount); + result = dpKnapsackResult(weight, (double[]) convertToArray(value, double.class), bagSize, maxCount); } catch (Exception e) { throw new ScriptException("dpKnapsack函数执行发生异常:", e); } @@ -70,7 +70,7 @@ public class DpKnapsackFunction extends AbstractDpKnapsackFunction { LambdaFunction lambdaFunction = (LambdaFunction) parameters[5]; - result = dpKnapsackResult(weight, (double[]) ConvertToArray(value, double.class), bagSize, maxCount, + result = dpKnapsackResult(weight, (double[]) convertToArray(value, double.class), bagSize, maxCount, list, context, lambdaFunction); } catch (Exception e) { throw new ScriptException("dpKnapsack函数执行发生异常:", e); @@ -116,7 +116,7 @@ public class DpKnapsackFunction extends AbstractDpKnapsackFunction { * @throws ScriptException */ @Override - public Object ConvertToArray(Object array, Class clazz) throws ScriptException { + public Object convertToArray(Object array, Class clazz) throws ScriptException { Object obj = null; if (array instanceof List) { obj = Array.newInstance(clazz, ((List) array).size() + 1); diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetKnapsackFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetKnapsackFunction.java index 48874ec..1a42785 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetKnapsackFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetKnapsackFunction.java @@ -36,7 +36,7 @@ public class DataSetKnapsackFunction extends AbstractDpKnapsackFunction { SimpleDataSet dataSet = (SimpleDataSet) parameters[0]; int bagSize = (Integer) parameters[1]; - int[] weight = (int[]) ConvertToArray(parameters[2], int.class); + int[] weight = (int[]) convertToArray(parameters[2], int.class); List result = null; @@ -45,7 +45,7 @@ public class DataSetKnapsackFunction extends AbstractDpKnapsackFunction { try { int[] maxCount = getCount(null, weight, bagSize); - result = dpKnapsackResult(weight, (double[]) ConvertToArray(parameters[3], double.class), bagSize, + result = dpKnapsackResult(weight, (double[]) convertToArray(parameters[3], double.class), bagSize, maxCount); } catch (Exception e) { throw new ScriptException("执行dpKnapsack出错", e); @@ -55,11 +55,11 @@ public class DataSetKnapsackFunction extends AbstractDpKnapsackFunction { int[] maxCount; if (parameters[4] instanceof LambdaFunction) { maxCount = getCount(null, weight, bagSize); - result = dpKnapsackResult(weight, (double[]) ConvertToArray(parameters[3], double.class), bagSize, + result = dpKnapsackResult(weight, (double[]) convertToArray(parameters[3], double.class), bagSize, maxCount, dataSet, context, parameters[4]); } else { maxCount = getCount(parameters[3], weight, bagSize); - result = dpKnapsackResult(weight, (double[]) ConvertToArray(parameters[4], double.class), bagSize, + result = dpKnapsackResult(weight, (double[]) convertToArray(parameters[4], double.class), bagSize, maxCount); } @@ -71,7 +71,7 @@ public class DataSetKnapsackFunction extends AbstractDpKnapsackFunction { int[] maxCount = getCount(parameters[3], weight, bagSize); LambdaFunction lambdaFunction = (LambdaFunction) parameters[5]; - result = dpKnapsackResult(weight, (double[]) ConvertToArray(parameters[4], double.class), bagSize, + result = dpKnapsackResult(weight, (double[]) convertToArray(parameters[4], double.class), bagSize, maxCount, dataSet, context, lambdaFunction); } catch (Exception e) { throw new ScriptException("执行dpKnapsack出错", e); @@ -85,7 +85,7 @@ public class DataSetKnapsackFunction extends AbstractDpKnapsackFunction { } @Override - protected Object ConvertToArray(Object array, Class clazz) throws ScriptException { + protected Object convertToArray(Object array, Class clazz) throws ScriptException { int length; DefaultDataSetColumn setColumn = (DefaultDataSetColumn) array; Object obj = null; diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractDpKnapsackFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractDpKnapsackFunction.java index ca4d0da..ca86201 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractDpKnapsackFunction.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractDpKnapsackFunction.java @@ -138,7 +138,7 @@ public abstract class AbstractDpKnapsackFunction extends DynamicNameScriptFuncti Arrays.fill((int[]) maxCount, temp); ((int[]) maxCount)[0] = 0; } else { - maxCount = (int[]) ConvertToArray(obj, int.class); + maxCount = (int[]) convertToArray(obj, int.class); for (int i = 1; i < ((int[]) maxCount).length; i++) { if (((int[]) maxCount)[i] == -1) ((int[]) maxCount)[i] = size / weight[i]; @@ -149,7 +149,7 @@ public abstract class AbstractDpKnapsackFunction extends DynamicNameScriptFuncti abstract protected List getLastResult(List result, Object obj) throws ScriptException; - abstract protected Object ConvertToArray(Object array, Class clazz) throws ScriptException; + abstract protected Object convertToArray(Object array, Class clazz) throws ScriptException; abstract protected boolean executePrune(LambdaFunction pruneFunction, ScriptContext context, Object... parameters) throws ScriptException; -- Gitee From 734806e98b230cd69b82cadae94d060d97332e0e Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Wed, 23 Aug 2017 21:12:00 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tinyscript/function/AbstractDpKnapsackFunction.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractDpKnapsackFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractDpKnapsackFunction.java index ca86201..12780a8 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractDpKnapsackFunction.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractDpKnapsackFunction.java @@ -25,7 +25,7 @@ public abstract class AbstractDpKnapsackFunction extends DynamicNameScriptFuncti dpKnapsackResult(result, weight.length - 1, bagSize, weight, maxCount, value, parameters); // 根据最优解查找最优方案 Integer[] items = new Integer[weight.length]; - FindResult(weight.length - 1, bagSize, result, weight, value, maxCount, items); + findResult(weight.length - 1, bagSize, result, weight, value, maxCount, items); List list = new ArrayList(); Collections.addAll(list, items); @@ -95,11 +95,11 @@ public abstract class AbstractDpKnapsackFunction extends DynamicNameScriptFuncti * @param items * 标记每个物品的数量状态 */ - protected void FindResult(int i, int j, double[][] f, int[] w, double[] v, int count[], Integer[] items) { + protected void findResult(int i, int j, double[][] f, int[] w, double[] v, int count[], Integer[] items) { if (i > 0) { if (f[i][j] == f[i - 1][j]) { items[i] = 0;// 全局变量,标记未被选中 - FindResult(i - 1, j, f, w, v, count, items); + findResult(i - 1, j, f, w, v, count, items); } else if (j - w[i] >= 0) { int min = Math.min(j / w[i], count[i]); int temp = 0; @@ -110,7 +110,7 @@ public abstract class AbstractDpKnapsackFunction extends DynamicNameScriptFuncti } } items[i] = temp;// 标记已被选中 - FindResult(i - 1, j - temp * w[i], f, w, v, count, items);// 回到装包之前的位置 + findResult(i - 1, j - temp * w[i], f, w, v, count, items);// 回到装包之前的位置 } } } -- Gitee