diff --git a/lib/dole_nn_base.js b/lib/dole_nn_base.js index 52fae744..ba00188c 100644 --- a/lib/dole_nn_base.js +++ b/lib/dole_nn_base.js @@ -33,12 +33,14 @@ function sigmoid3(x) //carry - carry for item X slave Y //prev_req - Numreq for previous request for item X slave Y //* doleinfo_last - Object with 2 values for last "tick period": numreq - total number or requests for item, numslave - number of slaves requesting that item +//debt - debt for item X slave Y //Returns: Array of 3 elements //0.Number of items to give in that dose //1.New dole for item X //2.New carry for item X slave Y -function Dose(numreq,instore,store_last_tick,dole,carry,prev_req,numreq_total_adj) +//3.New debt +function Dose(numreq,instore,store_last_tick,dole,carry,prev_req,numreq_total_adj,debt) { numreq=Number(numreq); instore=Number(instore); @@ -47,77 +49,37 @@ function Dose(numreq,instore,store_last_tick,dole,carry,prev_req,numreq_total_ad var b=Math.trunc(prev_req/instore_adj*numreq); var inp1=[numreq,instore_adj,store_last_tick/numreq,dole,carry];//0..4 - var inp2=[prev_req/numreq,numreq/numreq_total_adj,store_last_tick/numreq_total_adj,prev_req/instore_adj,b,numreq_total_adj,store_last_tick];//5..11 + var inp2=[prev_req/numreq,numreq/numreq_total_adj,store_last_tick/numreq_total_adj,prev_req/instore_adj,b,numreq_total_adj,store_last_tick,debt];//5..12 var inputs=inp1.concat(inp2); var internal=new Array(20).fill(0); var outputs=[0,0,0,0]; //NN: Please don't touch :), code is generated -internal[2]=internal[6]*7.267292023; -internal[2]=internal[2]+inputs[6]*-0.5385144949; -internal[2]=internal[2]+inputs[4]*7.982471466; -internal[2]=internal[2]+inputs[7]*-4.120764256; -internal[2]=internal[2]+internal[8]*0.6542916298; -internal[2]=internal[2]+internal[10]*1.781727672; -internal[2]=internal[2]+internal[12]*-0.3893937171; -internal[2]=sigmoid0(internal[2]); -internal[6]=inputs[7]*-1.472857833; -internal[6]=internal[6]+inputs[2]*0.8619997501; -internal[6]=internal[6]+inputs[9]*1.951734781; -internal[6]=internal[6]+inputs[3]*-1.689901233; -internal[6]=internal[6]+internal[9]*3.475469828; -internal[6]=sigmoid0(internal[6]); -internal[8]=sigmoid0(internal[8]); -internal[9]=inputs[10]*-1.441205978; -internal[9]=internal[9]+inputs[1]*5.842033863; -internal[9]=internal[9]+inputs[9]*2.132386684; -internal[9]=internal[9]+inputs[5]*0.9830219746; -internal[9]=sigmoid0(internal[9]); -internal[10]=internal[14]*1.186838627; -internal[10]=internal[10]+inputs[4]*2.864197493; -internal[10]=internal[10]+inputs[2]*1.245233774; -internal[10]=internal[10]+inputs[7]*-3.596544981; -internal[10]=internal[10]+inputs[5]*0.2605635822; -internal[10]=internal[10]+inputs[6]*0.4522094429; -internal[10]=internal[10]+inputs[0]*-0.9868286252; -internal[10]=internal[10]+1.0*0.9270827174; -internal[10]=sigmoid0(internal[10]); -internal[12]=inputs[11]*-0.7495238185; -internal[12]=internal[12]+inputs[10]*-0.2499841005; -internal[12]=internal[12]+inputs[7]*-1.974439263; -internal[12]=internal[12]+1.0*1.85799706; -internal[12]=internal[12]+inputs[0]*0.413690418; -internal[12]=internal[12]+inputs[9]*1.894246459; -internal[12]=internal[12]+inputs[4]*-2.371104717; -internal[12]=sigmoid0(internal[12]); -internal[14]=inputs[9]*-1.812304616; -internal[14]=internal[14]+inputs[10]*-0.3029920459; -internal[14]=internal[14]+inputs[5]*-0.3064728975; -internal[14]=internal[14]+inputs[1]*0.5113605857; -internal[14]=internal[14]+inputs[6]*-0.3487350941; -internal[14]=internal[14]+inputs[0]*0.701588273; -internal[14]=internal[14]+1.0*0.693169713; -internal[14]=internal[14]+inputs[4]*-1.443944097; -internal[14]=internal[14]+inputs[2]*-2.836822033; -internal[14]=internal[14]+inputs[11]*-0.6553236842; -internal[14]=internal[14]+inputs[3]*-1.075786948; -internal[14]=internal[14]+inputs[8]*0.2613089979; -internal[14]=sigmoid0(internal[14]); -outputs[0]=inputs[1]*1.726672769; -outputs[0]=sigmoid0(outputs[0]); +outputs[0]=inputs[7]*0.8058582544; +outputs[0]=sigmoid2(outputs[0]); outputs[1]=sigmoid0(outputs[1]); outputs[2]=sigmoid0(outputs[2]); -outputs[3]=internal[2]*-2.092440128; +outputs[3]=inputs[6]*0.2294657379; outputs[3]=sigmoid0(outputs[3]); - var res1=Math.round(Number(outputs[0])*numreq)+Math.round(outputs[3]); + debt=debt || 0; + if (outputs[0]>0.99) outputs[0]=1.0; + + var res1=Number(outputs[0])*numreq+outputs[3]+debt; + var res_capped=Math.round(res1); + + if (res_capped>numreq) res_capped=numreq; + if (res_capped>instore) res_capped=instore; + if (res_capped<0) res_capped=0; + + res1=res1 || 0; + res_capped=res_capped || 0;//Safeguard against wrong values + debt=res1-res_capped; + debt_cap=Math.round(numreq*1.5)+5; + if (debt>debt_cap) debt=debt_cap; - if (res1>numreq) res1=numreq; - if (res1>instore) res1=instore; - if (res1<0) res1=0; - res1=res1 || 0;//Safeguard against wrong values carry=sigmoid0(outputs[2]*carry+outputs[0]) || 0; - return [res1,sigmoid0(outputs[1]),carry]; + return [res_capped,dole+outputs[1],carry,debt]; } //TICK - Updates values for item X, should be called once for each item for each round of all slaves requesting that item @@ -135,26 +97,16 @@ function Tick(instore,dole,store_last_tick,numreq_total_adj) { var instore_adj=instore; if (instore_adj==0) instore_adj=0.1; - var inputs=[instore,dole,store_last_tick/instore_adj,store_last_tick/numreq_total_adj]; + var inputs=[instore,dole,store_last_tick/instore_adj,store_last_tick/numreq_total_adj,store_last_tick,numreq_total_adj]; var internal=new Array(10).fill(0); var outputs=[0,0]; //NN: Please don't touch :), code is generated -internal[2]=inputs[3]*-0.3051533401; -internal[2]=internal[2]+1.0*1.657034278; -internal[2]=sigmoid0(internal[2]); -internal[5]=inputs[1]*1.691301703; -internal[5]=internal[5]+inputs[0]*1.238131285; -internal[5]=sigmoid0(internal[5]); -outputs[0]=1.0*0.309109062; -outputs[0]=outputs[0]*inputs[0]*1.836197853; -outputs[0]=sigmoid1(outputs[0]); -outputs[1]=inputs[3]*1.100017905; -outputs[1]=outputs[1]+internal[5]*0.9273151159; -outputs[1]=outputs[1]+1.0*-2.498474121; -outputs[1]=outputs[1]+inputs[0]*1.087127209; -outputs[1]=outputs[1]+internal[2]*-0.896425426; -outputs[1]=sigmoid0(outputs[1]); +outputs[0]=inputs[3]*0.9364774823; +outputs[0]=outputs[0]*1.0*0.4590721726; +outputs[0]=sigmoid2(outputs[0]); +outputs[1]=outputs[0]*1.828422785; +outputs[1]=sigmoid3(outputs[1]); avg=outputs[1]; if (numreq_total_adj<0.11) avg=1;//When no item's are requested, result is 0.1 ; In that case there is no deficit, so return 1 = 100% demand fulfilled @@ -164,4 +116,4 @@ outputs[1]=sigmoid0(outputs[1]); return [sigmoid0(outputs[0]),avg]; } -module.exports = {Dose,Tick} +module.exports = {Dose,Tick} \ No newline at end of file diff --git a/routes/api/remove.js b/routes/api/remove.js index 18feabb1..a29d1165 100644 --- a/routes/api/remove.js +++ b/routes/api/remove.js @@ -33,6 +33,7 @@ class neuralDole { this.carry = {} this.lastRequest = {} this.stats=[] + this.debt= {} setInterval(()=>{ for(let name in this.items){ @@ -71,7 +72,8 @@ class neuralDole { this.dole[object.name], this.carry[object.name+" "+object.instanceID] || 0, this.lastRequest[object.name+"_"+object.instanceID+"_"+object.instanceName] || 0, - this.getRequestStats(object.name,5) + this.getRequestStats(object.name,5), + this.debt[object.name+" "+object.instanceID] || 0 ) if ((this.stats[object.name] || []).length>0) { @@ -84,6 +86,7 @@ class neuralDole { //2.New carry for item X slave Y this.dole[object.name] = magicData[1] this.carry[object.name+" "+object.instanceID] = magicData[2] + this.debt[object.name+" "+object.instanceID] = magicData[3] // Remove item from DB and send it if(this.items.removeItem({count: magicData[0], name: object.name})){ @@ -177,4 +180,4 @@ function doleDivider({ module.exports = { doleDivider, neuralDole -} +} \ No newline at end of file