• 沒有找到結果。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<META http-equiv="Content-Type" content="text/html; charset=utf-8" />

<META NAME="robots" CONTENT="noindex,nofollow">

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">

<META HTTP-EQUIV="EXPIRES" CONTENT="0">

<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">

<!-- jQuery & Plug-in -->

<script type="text/javascript" src="./jquery-1.4.2.min.js"></script>

<link rel="stylesheet" href="main.css" type="text/css">

<script type="text/javascript">

/*Basic Function Start-->*/

function explode (delimiter, string, limit) {

/* Splits a string on string separator and return array of components. If limit is positive only limit number of components is returned. If limit is negative all components except the last abs(limit) are returned. */

/* version: 909.322 */

/* discuss at: http://phpjs.org/functions/explode // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) */

/* + improved by: kenneth */

/* + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) */

/* + improved by: d3x */

/* + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // * example 1: explode(' ', 'Kevin van Zonneveld'); */

/* * returns 1: {0: 'Kevin', 1: 'van', 2: 'Zonneveld'} */

/* * example 2: explode('=', 'a=bc=d', 2); */

/* * returns 2: ['a', 'bc=d'] */

var emptyArray = { 0: '' };

/* third argument is not required */

if ( arguments.length < 2 ||

typeof arguments[0] == 'undefined' || typeof arguments[1] == 'undefined' ) {

return null;

}

if ( delimiter === '' ||

delimiter === false ||

delimiter === null ) {

return false; }

if ( typeof delimiter == 'function' ||

typeof delimiter == 'object' ||

typeof string == 'function' || typeof string == 'object' ) {

return emptyArray;

}

if ( delimiter === true ) { delimiter = '1';

}

if (!limit) { return string.toString().split(delimiter.toString());

} else {

// support for limit argument

var splitted = string.toString().split(delimiter.toString());

var partA = splitted.splice(0, limit - 1); var partB = splitted.join(delimiter.toString());

partA.push(partB);

return partA;

} }

function sortNumber(a,b) {

return b - a;

}

function statMsg(m){

var q = $("label#stat")[0].innerHTML;

q += m + "</br>";

$("label#stat").html(q);

return;

}

function reset(){

for(var i in SELECT){

for(var j in SELECT[i]){

SELECT[i][j] = 0;

} }

$("#LBudget").hide();

return;

}

/*<--Basic Function End*/

/*Global variable Start-->*/

var maxproj=0;

/* the structre of DATA:

DATA[x]: Fileds, x=0 no used.

DATA[x][y]: Plans, y=0 no used.

DATA[x][y][z]: 0: own resource 1: request funding

2: implicit output value

3: explicit output value 4:a1

5:a2 6:b1 7:b2 8:s1 9:s2 10:s3 11:s4 12:Nabla(1) 13:Nabla(2) 14:Nabla(3) 15:Nabla(4) 16:Zeta*/

var DATA = new Array();

/* the structure of EFF:

EFF[x]: field, x=0 no used.

EFF[x][y]: each projects, y=0 no used. */

var EFF = new Array();

/* the structure of SELECT:

SELECT[x]: field, x=0 no used.

SELECT[x][y]: each projects, y=0 no used. */

var SELECT = new Array();

var MAX_PROJ_NUM = 0;

var TOTAL_BUDGET = 0;

var BUDGET_LEFT = 0;

var EFF_REQ = 0;

var TOTAL_OUTPUT = 0;

var SAT = new Array(); /*Satisfaction of each field*/

var QFUN = new Array(); /*Qualified funding for each field*/

var AFUN = new Array(); /*Actual received funding for each field*/

/*<--Global variable End*/

/*Initial Data Start-->*/

function LoadData(){

$.ajax({

type: "POST", url: "data.txt", datatype: "text",

success: function(data, status){

var raw_data = explode("\n", data);

for(i in raw_data){

if (raw_data[i] != "") var sec_data = explode("\t", raw_data[i]);

if (sec_data[0] == "Field") continue;

/*fill into DATA*/

var p = parseInt(sec_data[0]);

var q = parseInt(sec_data[1]);

if(DATA[p] == null) DATA[p] = new Array();

if(DATA[p][q] == null) DATA[p][q] = new Array();

DATA[p][q][0] = Number(sec_data[2]); /*own resource*/

DATA[p][q][1] = Number(sec_data[3]); /*request funding*/

DATA[p][q][2] = Number(sec_data[4]); /*implicit output value*/

DATA[p][q][3] = Number(sec_data[5]); /*explicit output value*/

DATA[p][q][4] = Number(sec_data[6]); /*a1*/

DATA[p][q][5] = Number(sec_data[7]); /*a2*/

DATA[p][q][6] = Number(sec_data[8]); /*b1*/

DATA[p][q][7] = Number(sec_data[9]); /*b2*/

/*create select information*/

if(SELECT[p] == null) SELECT[p] = new Array();

if(SELECT[p][q] == null) SELECT[p][q] = new Array();

SELECT[p][q] = 0;

/*create efficiency information*/

if(EFF[p] == null) EFF[p] = new Array();

if(EFF[p][q] == null) EFF[p][q] = new Array();

var r = (Number(sec_data[4])*Number(sec_data[8]) +

Number(sec_data[5])*Number(sec_data[9]))/(Number(sec_data[2])*Number(sec_data[6]) + Number(sec_data[3])*Number(sec_data[7]));

EFF[p][q] = Math.round(r*1000)/1000;

}

/*check max project number*/

for(var i in DATA){

if(DATA[i].length > MAX_PROJ_NUM) MAX_PROJ_NUM = DATA[i].length-1;

} },

complete: function(){

DATATab();

EfficiencyTab();

} });

}

function DATATab(){

/*Header row*/

var tar = document.getElementById("inputTab");

var newRow = tar.insertRow(tar.rows.length);

var cell = tar.rows[tar.rows.length-1].insertCell(0);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "Field";

var cell = tar.rows[tar.rows.length-1].insertCell(1);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "Project";

var cell = tar.rows[tar.rows.length-1].insertCell(2);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "own resource";

var cell = tar.rows[tar.rows.length-1].insertCell(3);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "request funding";

var cell = tar.rows[tar.rows.length-1].insertCell(4);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "implicit output value";

var cell = tar.rows[tar.rows.length-1].insertCell(5);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "explicit output value";

var cell = tar.rows[tar.rows.length-1].insertCell(6);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "Selection results";

/* contain rows*/

for(var i in DATA){

var FCol = 0;

if(DATA[i] == "Field") continue;

for(var j in DATA[i]){

var newRow = tar.insertRow(tar.rows.length);

if (FCol == 0){

var cellfix = 0;

var cell = tar.rows[tar.rows.length-1].insertCell(0);

cell.rowSpan = DATA[i].length-1;

cell.align = "center";

cell.innerHTML = "F(" + i + ")";

}else cellfix = -1;

var cell = tar.rows[tar.rows.length-1].insertCell(cellfix+1);

cell.align = "center";

cell.innerHTML = "P(" + j + ")";

var cell = tar.rows[tar.rows.length-1].insertCell(cellfix+2);

cell.align = "center";

cell.innerHTML = DATA[i][j][0];

var cell = tar.rows[tar.rows.length-1].insertCell(cellfix+3);

cell.align = "center";

cell.innerHTML = DATA[i][j][1];

var cell = tar.rows[tar.rows.length-1].insertCell(cellfix+4);

cell.align = "center";

cell.innerHTML = DATA[i][j][2];

var cell = tar.rows[tar.rows.length-1].insertCell(cellfix+5);

cell.align = "center";

cell.innerHTML = DATA[i][j][3];

var cell = tar.rows[tar.rows.length-1].insertCell(cellfix+6);

cell.align = "center";

if(SELECT[i][j] == 0) cell.innerHTML = "--";

else if(SELECT[i][j] == "N"){

cell.style.background = "black";

cell.innerHTML = "<font color=white>Disqualified</font>";

}else{

cell.style.background = "green";

cell.innerHTML = SELECT[i][j];

}

FCol = null;

cellfix = null;

} } }

function EfficiencyTab(){

var tar = document.getElementById("effTab");

var newRow = tar.insertRow(tar.rows.length);

var cell = tar.rows[tar.rows.length-1].insertCell(0);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "Fields";

for(var i=0; i < MAX_PROJ_NUM; i++){

var cell = tar.rows[tar.rows.length-1].insertCell(i+1);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "Project " + (i+1);

}

for(var i in EFF){

var newRow = tar.insertRow(tar.rows.length);

var cell = tar.rows[tar.rows.length-1].insertCell(0);

cell.align = "center";

cell.innerHTML = "F(" + i +")";

for(var j=1; j <= MAX_PROJ_NUM; j++){

var cell = tar.rows[tar.rows.length-1].insertCell(j);

if(EFF[i][j]==null){

cell.align = "center";

cell.style.background = "black";

cell.style.color = "white"

cell.innerHTML = "---";

}else{

cell.align = "right";

cell.innerHTML = parseInt(EFF[i][j]*10000, 10)/10000;

} } } }

/*<-- Initial Data End*/

/*Caculation Function Start-->*/

function Run(){

$("#RUN").hide();

reset();

statMsg("Caculation start...");

var p = $("input#MBudget")[0].value;

if(isNaN(p)) {

alert("Invalid Budget!");

$("input#MBudget")[0].value = 0;

statMsg("Invalid Budget! Please check Total Budget.");

statMsg("Caculation terminated.");

return;

}else{

TOTAL_BUDGET = Number(p);

BUDGET_LEFT = Number(p);

}

p = $("input#EffReq")[0].value;

if(isNaN(p)) {

alert("Invalid Efficiency!");

$("input#MBudget")[0].value = 0;

statMsg("Invalid Efficiency! Please check Efficiency Required.");

statMsg("Caculation terminated.");

return;

}else{

EFF_REQ = Number(p)/100;

}

p = null;

/*Filter unqualified projects*/

for(var i in EFF){

for(var j in EFF[i]){

if( EFF[i][j] < EFF_REQ){

SELECT[i][j] = "N";

statMsg("Field " +i+ " Project " +j+" is disqualified");

/*Update Efficiency Table*/

var tar = document.getElementById("effTab").rows[i].cells[j];

tar.style.background = "black";

tar.style.color = "white"

} } }

/*Update DATA Table*/

var rowcount = 1;

for(var i in DATA){

if(DATA[i] == "Field") continue;

var tar = document.getElementById("inputTab");

for(var j in DATA[i]){

if (j==1) var cell = tar.rows[rowcount].cells[6];

else var cell = tar.rows[rowcount].cells[5];

cell.align = "center";

if(SELECT[i][j] == 0) cell.innerHTML = "--";

else if(SELECT[i][j] == "N"){

cell.style.background = "black";

cell.innerHTML = "<font color=white>Disqualified</font>";

}else{

cell.style.background = "green";

cell.innerHTML = SELECT[i][j];

}

rowcount += 1;

} }

/*Calculate Grey Relational Degree of each proposal*/

/*Calculate Sj(1),Sj(2),Sj(3),Sj(4)*/

for(var i in DATA){

for(var j in DATA[i]){

DATA[i][j][8] = DATA[i][j][0]/DATA[i][j][0]; /*Sj(1)*/

DATA[i][j][9] = DATA[i][j][1]/DATA[i][j][0]; /*Sj(2)*/

DATA[i][j][10] = DATA[i][j][2]/DATA[i][j][0];/*Sj(3)*/

DATA[i][j][11] = DATA[i][j][3]/DATA[i][j][0];/*Sj(4)*/

} }

for(var i in DATA){

/*find the most efficient project of each field as reference sequence*/

var Meff = 0, Mj = null;

for (var j in EFF[i]){

if(EFF[i][j] > Meff){

Meff = EFF[i][j];

Mj = j;

} }

statMsg("</br>Field "+i+", choose "+Mj+" as reference sequence.");

/*Calculate nabla*/

for(var j in DATA[i]){

DATA[i][j][12] = Math.round((Math.abs(DATA[i][Mj][8]-DATA[i][j][8]))*100)/100;

/*nabla(1)*/

DATA[i][j][13] = Math.round((Math.abs(DATA[i][Mj][9]-DATA[i][j][9]))*100)/100;

/*nabla(2)*/

DATA[i][j][14] = Math.round((Math.abs(DATA[i][Mj][10]-DATA[i][j][10]))*100)/100;

/*nabla(3)*/

DATA[i][j][15] = Math.round((Math.abs(DATA[i][Mj][11]-DATA[i][j][11]))*100)/100;

/*nabla(4)*/

statMsg("&nabla;"+Mj+j+"=("+DATA[i][j][12]+","+DATA[i][j][13]+","+DATA[i][j][14]+",

"+DATA[i][j][15]+")");

}

/*find the Max and min nabla of each field*/

var Maxnab = 0, minbab=65535;

for(var j in DATA[i]){

for(var k = 12; k<=15; k++){

if(DATA[i][j][k] > Maxnab){

Maxnab = DATA[i][j][k];

}

if(DATA[i][j][k] < minbab){

minbab = DATA[i][j][k];

} } }

statMsg("MAX&nabla;"+Mj+j+"="+Maxnab+"; min&nabla;"+Mj+j+"="+minbab);

/*Let distinguishing coefficient ζ=0.5*/

var zeta = 0.5;

for(var j in DATA[i]){

DATA[i][j][16] =

((Math.round(((zeta*(minbab+Maxnab))/(DATA[i][j][12]+(zeta*Maxnab)))*100))+

(Math.round(((zeta*(minbab+Maxnab))/(DATA[i][j][13]+(zeta*Maxnab)))*100))+

(Math.round(((zeta*(minbab+Maxnab))/(DATA[i][j][14]+(zeta*Maxnab)))*100))+

(Math.round(((zeta*(minbab+Maxnab))/(DATA[i][j][15]+(zeta*Maxnab)))*100)))/400;

/*Zeta*/

DATA[i][j][17] = Number(DATA[i][j][3] * DATA[i][j][16]); /* ve(i)*z(i) */

DATA[i][j][18] = Math.round((DATA[i][j][2] + DATA[i][j][17])*10000)/10000; /* vi + ve(i)*z(i) */

} }

/*create GRD Table*/

statMsg("Let distinguishing coefficient ζ=0.5");

statMsg("Come out Grey Relational Degree of each Proposal. See the table above.");

$("#GRD").show();

var tar = document.getElementById("GRDTab");

var newRow = tar.insertRow(tar.rows.length);

var cell = tar.rows[tar.rows.length-1].insertCell(0);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "Fields";

for(var i=0; i < MAX_PROJ_NUM; i++){

var cell = tar.rows[tar.rows.length-1].insertCell(i+1);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "Project " + (i+1);

}

for(var i in DATA){

var newRow = tar.insertRow(tar.rows.length);

var cell = tar.rows[tar.rows.length-1].insertCell(0);

cell.align = "center";

cell.innerHTML = "F(" + i +")";

for(var j=1; j <= MAX_PROJ_NUM; j++){

var cell = tar.rows[tar.rows.length-1].insertCell(j);

cell.align = "center";

if(DATA[i][j]==null){

cell.style.background = "black";

cell.style.color = "white"

cell.innerHTML = "---";

}else cell.innerHTML = DATA[i][j][16];

if(SELECT[i][j] == "N"){

tar.rows[i].cells[j].style.background = "black";

tar.rows[i].cells[j].style.color = "white"

tar.rows[i].cells[j].innerHTML = "Disqualified"

} } }

/*Calculate external/internal efficiency and explicitly value*/

for(var i in DATA){

for(var j in DATA[i]){

DATA[i][j][19] = DATA[i][j][2]/(DATA[i][j][0]+DATA[i][j][1]); /*internal efficiency*/

DATA[i][j][20] = DATA[i][j][3]/(DATA[i][j][0]+DATA[i][j][1]); /*external efficiency*/

} }

/*internal efficiency Table*/

statMsg("Come out Internal Efficiencies for each Project of Dvisions. See the table above.");

$("#IET").show();

var tar = document.getElementById("IETab");

var newRow = tar.insertRow(tar.rows.length);

var cell = tar.rows[tar.rows.length-1].insertCell(0);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "Fields";

var cell = tar.rows[tar.rows.length-1].insertCell(1);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "P";

for(var i=0; i < MAX_PROJ_NUM; i++){

var cell = tar.rows[tar.rows.length-1].insertCell(i+2);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "Project " + (i+1);

}

for(var i in DATA){

var newRow = tar.insertRow(tar.rows.length);

var cell = tar.rows[tar.rows.length-1].insertCell(0);

cell.rowSpan = 3;

cell.align = "center";

cell.innerHTML = "F(" + i +")";

var cell = tar.rows[tar.rows.length-1].insertCell(1);

cell.align = "center";

cell.innerHTML = "vi<sub>"+i+"</sub>";

for(var j=1; j <= MAX_PROJ_NUM; j++){

var cell = tar.rows[tar.rows.length-1].insertCell(j+1);

cell.align = "center";

if(DATA[i][j]==null){

cell.style.background = "black";

cell.style.color = "white"

cell.innerHTML = "---";

}else cell.innerHTML = DATA[i][j][2];

}

var newRow = tar.insertRow(tar.rows.length);

var cell = tar.rows[tar.rows.length-1].insertCell(0);

cell.align = "center";

cell.innerHTML = "I<sub>"+i+"</sub>";

for(var j=1; j <= MAX_PROJ_NUM; j++){

var cell = tar.rows[tar.rows.length-1].insertCell(j);

cell.align = "center";

if(DATA[i][j]==null){

cell.style.background = "black";

cell.style.color = "white"

cell.innerHTML = "---";

}else cell.innerHTML = (DATA[i][j][0]+DATA[i][j][1]);

}

var newRow = tar.insertRow(tar.rows.length);

var cell = tar.rows[tar.rows.length-1].insertCell(0);

cell.align = "center";

cell.innerHTML = "e<sub>"+i+"</sub>";

for(var j=1; j <= MAX_PROJ_NUM; j++){

var cell = tar.rows[tar.rows.length-1].insertCell(j);

cell.align = "center";

if(DATA[i][j]==null){

cell.style.background = "black";

cell.style.color = "white"

cell.innerHTML = "---";

}else cell.innerHTML = Math.round(DATA[i][j][19]*10000)/10000;

} }

/*external efficiency Table*/

statMsg("Come out External Efficiencies for each Project of Dvisions. See the table above.");

$("#EET").show();

var tar = document.getElementById("EETab");

var newRow = tar.insertRow(tar.rows.length);

var cell = tar.rows[tar.rows.length-1].insertCell(0);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "Fields";

var cell = tar.rows[tar.rows.length-1].insertCell(1);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "P";

for(var i=0; i < MAX_PROJ_NUM; i++){

var cell = tar.rows[tar.rows.length-1].insertCell(i+2);

cell.align = "center";

cell.style.minWidth = "70px";

cell.innerHTML = "Project " + (i+1);

}

for(var i in DATA){

var newRow = tar.insertRow(tar.rows.length);

var cell = tar.rows[tar.rows.length-1].insertCell(0);

cell.rowSpan = 3;

cell.align = "center";

cell.innerHTML = "F(" + i +")";

var cell = tar.rows[tar.rows.length-1].insertCell(1);

cell.align = "center";

cell.innerHTML = "ve<sub>"+i+"</sub>";

for(var j=1; j <= MAX_PROJ_NUM; j++){

var cell = tar.rows[tar.rows.length-1].insertCell(j+1);

cell.align = "center";

if(DATA[i][j]==null){

cell.style.background = "black";

cell.style.color = "white"

cell.innerHTML = "---";

}else cell.innerHTML = DATA[i][j][3];

}

var newRow = tar.insertRow(tar.rows.length);

var cell = tar.rows[tar.rows.length-1].insertCell(0);

cell.align = "center";

cell.innerHTML = "I<sub>"+i+"</sub>";

for(var j=1; j <= MAX_PROJ_NUM; j++){

var cell = tar.rows[tar.rows.length-1].insertCell(j);

cell.align = "center";

if(DATA[i][j]==null){

cell.style.background = "black";

cell.style.color = "white"

cell.innerHTML = "---";

}else cell.innerHTML = (DATA[i][j][0]+DATA[i][j][1]);

}

var newRow = tar.insertRow(tar.rows.length);

var cell = tar.rows[tar.rows.length-1].insertCell(0);

cell.align = "center";

cell.innerHTML = "w<sub>"+i+"</sub>";

for(var j=1; j <= MAX_PROJ_NUM; j++){

var cell = tar.rows[tar.rows.length-1].insertCell(j);

cell.align = "center";

if(DATA[i][j]==null){

cell.style.background = "black";

cell.style.color = "white"

cell.innerHTML = "---";

}else cell.innerHTML = Math.round(DATA[i][j][20]*10000)/10000;

} }

var OE = new Array(); /*Efficiency*/

for(var i in DATA){

for(var j in DATA[i]){

if(OE[i] == null) OE[i] = new Array();

OE[i][j] = Math.round((DATA[i][j][18] / DATA[i][j][1])*10000)/10000;

} }

/*Sum all qualified project funding requirement*/

var totalFun = 0;

var bFun = new Array(); /*Optimal received funding quota for each field*/

var bFunLeft = new Array(); /*left received funding quota for each field*/

for(var i in DATA){

if(DATA[i] == "Field") continue;

AFUN[i] = 0;

bFun[i] = 0;

QFUN[i] = 0;

for(var j in DATA[i]){

if(SELECT[i][j] != "N"){

totalFun += DATA[i][j][1];

QFUN[i] += DATA[i][j][1];

} }

statMsg("The qualified funding requirement for field #"+i+" is: $" + QFUN[i]);

}

statMsg("Total funding requirement for all qualified projects is: $" + totalFun);

var RD = Math.round((TOTAL_BUDGET/totalFun)*10000)/100;

var lim = parseInt($("#satset")[0].value)/2;

var AdjustedRD = Math.round((RD-lim)*100)/100;

if (AdjustedRD < 0) AdjustedRD =0;

statMsg("The best satisfied percentage of each field is " + RD +"%:");

$("#LBudget").show();

$("#LBudget").html("Budget Left:" + BUDGET_LEFT +", Total Output:" + TOTAL_OUTPUT);

/*1st run, Choose the candidate project independently from each field */

statMsg("</br></br>***** 1st run -- Choose the project based on optimal satisfaction. Each Field cannot exceed " + RD + "% - " + lim + "% = " + AdjustedRD +"%. *****");

for (var i in bFun){

bFun[i] = Math.round((Number(QFUN[i]) * Number(AdjustedRD))/100);

bFunLeft[i] = bFun[i];

statMsg("Field " + i + " cannot exceed $" + bFun[i]);

}

for(var i in DATA){

statMsg("<br>===Choose the project from Field "+i+". ===");

var fin = 0;

var step = 1;

while( bFunLeft[i] > 0 && fin != 1){

/* find the most internal/external-efficient one*/

var Mieff = 0, Meeff = 0, Mii = null, Mei = null;

for (j in DATA[i]){

if(DATA[i][j][19] > Mieff && SELECT[i][j] == 0){

Mieff = DATA[i][j][19];

Mii = j;

}

if(DATA[i][j][20] > Meeff && SELECT[i][j] == 0){

Meeff = DATA[i][j][20];

Mei = j;

} }

if (Mii == null && Mei == null) fin = 1;

else{

/*Compare both options. Choose better one. If budget not sufficient, choose reachable one.*/

statMsg("<br>Step "+step+":");

statMsg("Option 1: project "+Mii+" - Output = "+DATA[i][Mii][2]+" + "+

DATA[i][Mii][17]+" = "+DATA[i][Mii][18]);

statMsg("Option 2: project "+Mei+" - Output = "+DATA[i][Mei][2]+" + "+

DATA[i][Mei][17]+" = "+DATA[i][Mei][18]);

if(DATA[i][Mii][18] == DATA[i][Mei][18]){

if (bFunLeft[i] > DATA[i][Mii][1]) Mj = Mii;

else{

statMsg("Budget quota is not sufficient to choose project "+Mii+"!");

fin = 1;

continue;

}

}else if(DATA[i][Mii][18] > DATA[i][Mei][18]){

if (bFunLeft[i] > DATA[i][Mii][1]) Mj = Mii;

else{

statMsg("Budget quota is not sufficient to choose project "+Mii+"!");

if(bFunLeft[i] > DATA[i][Mei][1]) Mj = Mei;

else{

statMsg("Budget quota is not sufficient to choose project "+Mei+"!");

fin = 1;

continue;

} }

}else if(DATA[i][Mii][18] < DATA[i][Mei][18]){

if (bFunLeft[i] > DATA[i][Mei][1]) Mj = Mei;

else{

statMsg("Budget quota is not sufficient to choose project "+Mei+"!");

if(bFunLeft[i] > DATA[i][Mii][1]) Mj = Mii;

else{

statMsg("Budget quota is not sufficient to choose project "+Mii+"!");

fin = 1;

continue;

} } }

/*Check OK, reveice the project*/

BUDGET_LEFT -= DATA[i][Mj][1];

bFunLeft[i] -= DATA[i][Mj][1];

AFUN[i] += DATA[i][Mj][1];

SAT[i] = Math.round(AFUN[i]/QFUN[i] * 100);

SELECT[i][Mj] = "PASS";

TOTAL_OUTPUT += DATA[i][Mj][18];

statMsg("Choose Project "+ (parseInt(Mj)) + ", which cost $" +DATA[i][Mj][1]+ ". Field

"+i+" Budget Left: $"+bFunLeft[i]+". Satisfcation: "+

Math.round((AFUN[i]/QFUN[i])*10000)/100+"%.");

$("#LBudget").html("Total investment: $"+ (TOTAL_BUDGET-BUDGET_LEFT) +", Budget Left:" + BUDGET_LEFT +", Total Output:" +

Math.round(TOTAL_OUTPUT*100)/100);

/*Update Efficiency Table*/

var tar = document.getElementById("effTab").rows[i].cells[Mj];

/*Update DATA Table*/

var rowcount = 1;

for(var k in DATA){

if(DATA[k] == "Field") continue;

var tar = document.getElementById("inputTab");

for(var j in DATA[k]){

if (j==1) var cell = tar.rows[rowcount].cells[6];

else var cell = tar.rows[rowcount].cells[5];

cell.align = "center";

if(SELECT[k][j] == 0) cell.innerHTML = "--";

else if(SELECT[k][j] == "N"){

cell.style.background = "black";

cell.innerHTML = "<font color=white>Disqualified</font>";

}else{

cell.style.background = "green";

cell.innerHTML = SELECT[k][j];

}

rowcount += 1;

} }

step += 1;

} } }

statMsg("<br>===1st run Caculation complete.===");

statMsg("Each field received (satisfaction):");

for(var i in AFUN){ statMsg("Field "+i+": $"+AFUN[i]+"/$"+QFUN[i]+"

("+SAT[i]+"%)");}

var SMax = 0, Smin = 100;

for(var i in SAT){

if(SAT[i] >= SMax) SMax = SAT[i];

if(SAT[i] <= Smin) Smin = SAT[i];

}

statMsg("Satisfaction level:"+ (Number(SMax) - Number(Smin)) +"%");

statMsg("Budget left: $"+ BUDGET_LEFT);

fin = 0;

/*2nd run, Choose the candidate project from all field. */

var AdjustedRD = Math.round((RD+lim)*100)/100;

if (AdjustedRD > 100) AdjustedRD = 100;

statMsg("<br><br>***** 2nd run Pick-Up -- Choose the candidate project from all field.

The satisfaction of each field shall not exceed " + RD + "% + " + lim + "% = " + AdjustedRD +"%. *****");

for (var i in bFun){

bFun[i] = Math.round((Number(QFUN[i]) * Number(AdjustedRD))/100);

statMsg("Field " + i + " cannot exceed $" + bFun[i] +".");

}

statMsg("</br>");

var fieldSkip = new Array();

while( BUDGET_LEFT > 0 && fin != 1){

var Meff = 0, Mi = null, Mj = null;

/*Find the Field with min Satisfy*/

var Smin = 100, MF;

for(var i in SAT){

if(fieldSkip[i] == null) fieldSkip[i] = 0;

else if(fieldSkip[i] == 1) continue;

if(SAT[i] <= Smin) { Smin = SAT[i];

MF = i;

} }

statMsg("Check is there any feasible project in Field " + MF + "...");

for (j in OE[MF]){

if(OE[MF][j] > Meff){

if( BUDGET_LEFT > DATA[MF][j][1] && SELECT[MF][j] == 0){

if (ChkSatSec(MF, j, AdjustedRD)){

Meff = OE[MF][j];

Mi = MF;

Mj = j;

} } } }

if (Mi == null && Mj == null){

statMsg("Cannot find any more feasible projects in Field " + MF + ".</br>");

fieldSkip[MF] = 1;

}else{

BUDGET_LEFT -= DATA[Mi][Mj][1];

AFUN[Mi] += DATA[Mi][Mj][1];

SAT[Mi] = Math.round(AFUN[Mi]/QFUN[Mi] * 100);

SELECT[Mi][Mj] = "PASS";

TOTAL_OUTPUT += DATA[Mi][Mj][18];

statMsg("</br>Choose Field "+Mi+" Project "+ (parseInt(Mj)) + ", which cost $"

+DATA[Mi][Mj][1]+ ". Then each field received (satisfaction):");

$("#LBudget").html("Total investment: $"+ (TOTAL_BUDGET-BUDGET_LEFT) +", Budget Left:" + BUDGET_LEFT +", Total Output:" +

Math.round(TOTAL_OUTPUT*100)/100);

var SMax = 0, Smin = 100;

for(var i in SAT){

if(SAT[i] >= SMax) SMax = SAT[i];

if(SAT[i] <= Smin) Smin = SAT[i];

}

for(var i in AFUN){ statMsg("Field "+i+": $"+AFUN[i]+"/$"+QFUN[i]+"

("+SAT[i]+"%)");}

statMsg("Satisfaction level:"+ (Number(SMax) - Number(Smin)) +"%</br>");

} fin = 1;

for(var i in fieldSkip){

if (fieldSkip[i] == 0) fin = 0;

} }

var SMax = 0, Smin = 100;

for(var i in SAT){

if(SAT[i] >= SMax) SMax = SAT[i];

if(SAT[i] <= Smin) Smin = SAT[i];

}

statMsg("<br><br>*****Caculation complete.*****");

var SDIFF = parseInt($("#satset")[0].value);

if ((Number(SMax) - Number(Smin)) > SDIFF){

statMsg("(!) This result cannot meet the satisfaction requirement!! Please double check your data and configuration!!");

$("#CANTS").html("<font color=red size=+2>Satification Level cannot meet the

requirement ("+SDIFF+"%).<br> Please double check the configuration.<br><br></font>");

$("#CANTS").show();

$("#CANTS2").html("<font color=red size=+2>Satification Level cannot meet the

requirement ("+SDIFF+"%).<br> Please double check the configuration.<br><br></font>");

$("#CANTS2").show();

}

statMsg("Each field received (satisfaction):");

for(var i in AFUN){ statMsg("Field "+i+": $"+AFUN[i]+"/$"+QFUN[i]+"

("+SAT[i]+"%)");}

statMsg("Satisfaction level:"+ (Number(SMax) - Number(Smin)) +"%");

statMsg("Budget left: $"+ BUDGET_LEFT);

statMsg("Total investment: $"+ (TOTAL_BUDGET-BUDGET_LEFT));

statMsg("Total Output: $"+ Math.round(TOTAL_OUTPUT*100)/100);

statMsg("Total efficiency obtained: "+

parseInt(TOTAL_OUTPUT/(TOTAL_BUDGET-BUDGET_LEFT)*10000)/100 + "%");

statMsg("****************************");

$("#TETF").show();

$("#TETF").html("Total efficiency obtained: " +

parseInt(TOTAL_OUTPUT/(TOTAL_BUDGET-BUDGET_LEFT)*10000)/100 + "% </br>"

+"Satisfaction level:"+ (Number(SMax) - Number(Smin)) +"%");

}

function ChkSatSec( p, q , x){

var r = parseInt($("#satset")[0].value);

var itotal = new Array();

var updatedSat = new Array();

for(var i in AFUN){

itotal[i] = AFUN[i];

if( i == p ) itotal[i] += DATA[p][q][1]

updatedSat[i] = Math.round(itotal[i]*100/ QFUN[i]);

}

var MaxSat = 0, minSat = 100;

var MaxUnit, minUnit;

for(var i in updatedSat){

if(updatedSat[i] >= MaxSat) MaxSat = updatedSat[i];

if(updatedSat[i] <= minSat) minSat = updatedSat[i];

}

var SatDiff = MaxSat - minSat;

/*if(SatDiff > r) return false;*/

if(updatedSat[p] > x) return false;

else if(updatedSat[p] < (x-r)) return false;

else return true;

}

/*<-- Caculation Function End*/

$(document).ready(function(){

LoadData();

});

</script>

</head>

<body>

<b>Input and Output Table</b>

<table id="inputTab" background="#000000">

</table>

</br>

<div id="caluse">

<b>Efficiency</b>

<table id="effTab">

</table>

</br>

</div>

<div id="GRD" style="display:none;">

<b>Grey Relational Degree of each Proposal</b>

<table id="GRDTab">

</table>

<br>

</div>

<div id="IET" style="display:none;">

<b>Internal Efficiencies for each Project of Dvisions</b>

<table id="IETab">

</table>

<br>

</div>

<div id="EET" style="display:none;">

<b>External Efficiencies for each Project of Dvisions</b>

<table id="EETab">

</table>

<br>

</div>

<label id="SDiff"></label>

</br></br>

Total Budget:<input id="MBudget" type="text" value="0"></br>

Efficiency Required:<input id="EffReq" type="text" value="0" size=2>%</br>

Max Satisfaction Gap:

<select id="satset"><script>

for(var i = 1; i <=100; i++){

document.write("<option value=" + i + ">" + i + "% </option>");}

</script></select></br>

<input id="RUN" type="button" value="RUN" onClick="Run();"><input type="button"

value="Reset" onClick="window.location.reload();"></br>

<label id="LBudget" style="display:none;"></label></br>

<label id="TETF" style="display:none;"></label></br>

<label id="CANTS" style="display:none;"></label></br>

<label id="stat" class="msg"></label></br>

<label id="CANTS2" style="display:none;"></label></br>

</body>

</html>