summaryrefslogtreecommitdiff
path: root/nlpsolver/ThirdParty/EvolutionarySolver/src/net/adaptivebox/global/RandomGenerator.java
diff options
context:
space:
mode:
Diffstat (limited to 'nlpsolver/ThirdParty/EvolutionarySolver/src/net/adaptivebox/global/RandomGenerator.java')
-rwxr-xr-xnlpsolver/ThirdParty/EvolutionarySolver/src/net/adaptivebox/global/RandomGenerator.java162
1 files changed, 162 insertions, 0 deletions
diff --git a/nlpsolver/ThirdParty/EvolutionarySolver/src/net/adaptivebox/global/RandomGenerator.java b/nlpsolver/ThirdParty/EvolutionarySolver/src/net/adaptivebox/global/RandomGenerator.java
new file mode 100755
index 000000000000..b9f17ce4e045
--- /dev/null
+++ b/nlpsolver/ThirdParty/EvolutionarySolver/src/net/adaptivebox/global/RandomGenerator.java
@@ -0,0 +1,162 @@
+/**
+ * Description: For generating random numbers.
+ *
+ * @ Author Create/Modi Note
+ * Xiaofeng Xie Feb 22, 2001
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Please acknowledge the author(s) if you use this code in any way.
+ *
+ * @version 1.0
+ * @Since MAOS1.0
+ */
+
+package net.adaptivebox.global;
+
+import java.util.*;
+
+public class RandomGenerator {
+
+/**This function returns a random integer number between the lowLimit and upLimit.
+ * @param lowLimit lower limits
+ * upLimit The upper limits (between which the random number is to be generated)
+ * @return int return value
+ * Example: for find [0,1,2]
+*/
+public static int intRangeRandom(int lowLimit,int upLimit){
+// int num = (int)Math.rint(doubleRangeRandom(lowLimit,upLimit));
+ int num = (int)Math.floor(doubleRangeRandom(lowLimit,upLimit+1)-1E-10);
+ return(num);
+}
+
+/**This function returns a random float number between the lowLimit and upLimit.
+ * @param lowLimit lower limits
+ * upLimit The upper limits (between which the random number is to be generated)
+ * @return double return value
+*/
+public static double doubleRangeRandom(double lowLimit,double upLimit){
+ double num = lowLimit + Math.random()*(upLimit-lowLimit);
+ return(num);
+}
+
+/**This function returns true or false with a random probability.
+ * @return int return value
+ */
+ public static boolean booleanRandom(){
+ boolean value = true;
+ double temp=Math.random();
+ if (temp<0.5) value=false;
+ return value;
+ }
+
+ public static int[] randomSelection(boolean[] types, int times) {
+ int validNum = 0;
+ for(int i=0; i<types.length; i++) {
+ if(!types[i]) {
+ validNum++;
+ }
+ }
+ int[] totalIndices = new int[validNum];
+ validNum = 0;
+ for(int i=0; i<types.length; i++) {
+ if(!types[i]) {
+ totalIndices[validNum] = i;
+ validNum++;
+ if(validNum==totalIndices.length) break;
+ }
+ }
+ return randomSelection(totalIndices, times);
+ }
+
+// public static int[] randomSelection(boolean[] types, int times) {
+// int realTimes = times;
+// if(realTimes>types.length) realTimes = types.length;
+// boolean[] internalTypes = (boolean[])types.clone();
+// int upper = types.length-1;
+// int[] indices = new int[realTimes];
+// if(realTimes==types.length) {
+// for(int i=0; i<indices.length; i++) {
+// indices[i] = i;
+// }
+// return indices;
+// }
+// int i = 0;
+// while(i<realTimes) {
+// indices[i] = intRangeRandom(0, upper);
+// if(!internalTypes[indices[i]]) {
+// internalTypes[indices[i]] = true;
+// i++;
+// }
+// }
+// return indices;
+// }
+
+ public static int[] randomSelection(int low, int up, int times){
+ int[] totalIndices = new int[up-low];
+ for (int i=low; i<up; i++) {
+ totalIndices[i] = i;
+ }
+ return randomSelection(totalIndices, times);
+ }
+
+ public static int getRealV(double randTypeV) {
+ if(randTypeV<=0) return 0;
+ int realV = (int)Math.ceil(randTypeV);
+ if(Math.random()<(randTypeV-realV)) realV++;
+ return realV;
+ }
+
+ public static int[] randomSelection(int[] totalIndices, int times) {
+ if (times>=totalIndices.length) {
+ return totalIndices;
+ }
+ int[] indices = randomSelection(totalIndices.length, times);
+ for(int i=0; i<indices.length; i++) {
+ indices[i] = totalIndices[indices[i]];
+ }
+ return indices;
+ }
+
+ public static int[] randomSelection(int maxNum, int times) {
+ if(times<=0) return new int[0];
+ int realTimes = Math.min(maxNum, times);
+ boolean[] flags = new boolean[maxNum];
+// Arrays.fill(flags, false);
+ boolean isBelowHalf = times<maxNum*0.5;
+ int virtualTimes = realTimes;
+ if(!isBelowHalf) {
+ virtualTimes = maxNum-realTimes;
+ }
+ int i = 0;
+ int upper = maxNum-1;
+ int[] indices = new int[realTimes];
+
+ while(i<virtualTimes) {
+ indices[i] = intRangeRandom(0, upper);
+ if(!flags[indices[i]]) {
+ flags[indices[i]] = true;
+ i++;
+ }
+ }
+ if(!isBelowHalf) {
+ int j=0;
+ for(i=0; i<maxNum; i++) {
+ if(flags[i]==isBelowHalf) {
+ indices[j] = i;
+ j++;
+ if(j==realTimes) break;
+ }
+ }
+ }
+ return indices;
+ }
+} \ No newline at end of file