陳鍾誠的程式作品 -- PetriNet (派氏網路)

程式作品

C 語言

Java

C#

JavaScript

常用函數

文字處理

遊戲程式

衛星定位

系統程式

資料結構

網路程式

自然語言

人工智慧

機率統計

資訊安全

等待完成

訊息

相關網站

參考文獻

最新修改

簡體版

English

PetriNet 1

package ccc;
 
public class PetriNet extends Agent {
    int h=10,o=8,h2o=0,s=20,so2=0;
 
    public static void main(String[] args) throws Exception {
        System.out.println("PetriNet.main()");
        AgentWorld world = new AgentWorld();
        PetriNet net = new PetriNet();
        world.varMap.put("p", net);
        world.runRules("p:h2o();p:so2()".split(";"), 5);
    }
 
    public String act(String exp) {
        if (exp.equals("h2o()")) {
            if (h>=2 && o>=1) { h-=2; o-=1; h2o+=1; return toString(); }
        } else if (exp.equals("so2()")) {
            if (s>=1 && o>=2) { s-=1; o-=2; so2+=1; return toString(); }
        }
        return "fail";
    }
 
    public String toString() {
        return "H="+h+" O="+o+" S="+s+" H2O="+h2o+" SO2="+so2;
    }
}

PetriNet 2

package ccc;
import java.util.*;
 
public class PetriNet1 extends Agent {
    String[] vars;
 
    public static void main(String[] args) throws Exception {
        System.out.println("PetriNet.main()");
        AgentWorld world = new AgentWorld();
        PetriNet1 net = new PetriNet1();
        net.varMap = world.varMap;
        world.varMap.put("p", net);
        world.varMap.putObjs("h=10,o=8,h2o=0,s=20,so2=0".split(","));
        net.vars = "h,o,h2o,s,so2".split(",");
        world.varMap.put("kb", "2h+1o=1h2o;p:1s+2o=1so2".split(";"), 5);
    }
 
    public String act(String pExp) {
        if (!pExp.matches("([\\w+\\+\\-]+)=([\\w+\\+\\-]+)")) return "fail";
        String[] inTerms = STR.head(pExp, "=").split("\\+");
        String[] outTerms = STR.tail(pExp, "=").split("\\+");
        boolean isPass = true;
        for (int i=0; i<inTerms.length; i++) {
            String[] groups = REGEX.groups(inTerms[i], "(\\d+)(\\w+)");
            double coef = Double.parseDouble(groups[0]);
            String var  = groups[1];
            double now  = varMap.getDouble(var);
            if (now < coef)    isPass = false;
        }
        if (!isPass) return "fail";
        for (int i=0; i<inTerms.length; i++) {
            String[] groups = REGEX.groups(inTerms[i], "(\\d+)(\\w+)");
            double coef = Double.parseDouble(groups[0]);
            String var  = groups[1];
            varMap.add(var, new Double(-1*coef));
        }
        for (int i=0; i<outTerms.length; i++) {
            String[] groups = REGEX.groups(outTerms[i], "(\\d+)(\\w+)");
            double coef = Double.parseDouble(groups[0]);
            String var  = groups[1];
            double now  = varMap.getDouble(var);
            System.out.println("out:"+var+"("+now+"+"+coef+")");
            varMap.add(var, new Double(coef));
        }
        return toString();
    }
 
    public String toString() {    return varMap.getStrs(vars); }
}

PetriNet 3

package ccc;
import java.util.*;
 
public class PetriNet {
    public static void main(String[] args) throws Exception {
        AgentWorld world = new AgentWorld();
        world.setVars("h=10,o=8,h2o=0,s=20,so2=0");
        world.addAgent(new PetriRule("2h+1o=1h2o"));
        world.addAgent(new PetriRule("1s+2o=1so2"));
        for (int i=0; i<10; i++)
            world.run();
    }
}
 
class PetriRule extends Agent {
    String[] inVars, outVars;
    double[] inWeights, outWeights;
 
    PetriRule(String pRule) throws Exception {
        super(pRule);
        if (!pRule.matches("([\\w+\\+\\-]+)=([\\w+\\+\\-]+)")) 
            throw new Exception("PetriRule:format error");
        String[] inTerms = STR.head(pRule, "=").split("\\+");
        inVars = new String[inTerms.length];
        inWeights = new double[inTerms.length];
        parseExp(inTerms, inVars, inWeights);
 
        String[] outTerms = STR.tail(pRule, "=").split("\\+");        
        outVars = new String[outTerms.length];
        outWeights = new double[outTerms.length];
        parseExp(outTerms, outVars, outWeights);
    }
 
    public void parseExp(String[] terms, String[] vars, double[] weights) {
        for (int i=0; i<terms.length; i++) {
            String[] groups = REGEX.groups(terms[i], "(\\d+)(\\w+)");
            weights[i] = Double.parseDouble(groups[0]);
            vars[i]  = groups[1];
        }        
    }
 
    public String act(VarMap senseMap) {
        boolean isPass = true;
        for (int i=0; i<inVars.length; i++) {
            double now  = varMap.getDouble(inVars[i]);
            if (now < inWeights[i])    isPass = false;
        }
        if (!isPass) return "fail";
        for (int i=0; i<inVars.length; i++)
            varMap.add(inVars[i], new Double(-1*inWeights[i]));
        for (int i=0; i<outVars.length; i++) {
            double now  = varMap.getDouble(outVars[i]);
            varMap.add(outVars[i], new Double(outWeights[i]));
        }
        return senseMap.toString();
    }
}

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License