使用 java 或 excel 的组合和模拟
combination and simulation using java or excel
我的项目遇到了问题。我有不同类型的控制器,它们提供不同的输入和输出端口。我有所需的分数。我需要一些代码来生成控制器的数量和类型,具体取决于所需的点 + 一些应该分配为最便宜组合的备用点。
例如,我有一个系统需要:
- 数字输出点=8
- 模拟输出点=2
- 数字输入点=15
- 模拟输入点数=4
我需要的是每个 input/output 节省 15% :
我有的是:
- 控制器 1 提供:
- 3 个数字输入
- 2 个模拟输出
- 10 个数字输出
- 4 个模拟输入
- 控制器 2 提供:
- 2 个数字输入
- 1 个模拟输出
- 3 个数字输出
- 3 个模拟输入
控制器1的价格是200$,控制器2的价格是120$。
如何在 excel 或使用 javascript 开始编写此代码?
首先,您可以考虑一种数据结构,它使所有数据都具有可比性和可迭代性。
Raw data
requirement controller 1 controller 2
cost minimum 200 120
digital output 8 10 3
analog output 2 2 1
digital input 15 3 2
analog input 4 4 3
该代码为您提供了一个数组,其中包含两个控制器和最佳组合的所有可能组合。
function getCount() {
function check(count, constraint) { return function (b, i) { return b <= count * constraint[i]; }; }
function getCost(item, count) { return constraints.items[item].cost * count; }
var i = 0, count, data, o, result = [];
do {
count = 0;
data = constraints.requirements.data.map(function (a, j) {
return a - i * constraints.items[0].data[j];
});
while (!data.every(check(count, constraints.items[1].data))) {
count++;
}
o = { count: [i, count], cost: [getCost(0, i), getCost(1, count)] };
o.total = o.cost.reduce(function (a, b) { return a + b; }, 0);
result.push(o);
i++;
} while (count);
return result;
}
var constraints = {
requirements: { data: [8, 2, 15, 4], optimum: 'min' },
items: [
{ data: [10, 2, 3, 4], cost: 200 },
{ data: [3, 1, 2, 3], cost: 120 }
]
},
result = getCount(),
optimum = result.reduce(function (r, a, i) {
if (!i || a.total === Math[constraints.requirements.optimum](r[0].total, a.total)) {
return [a];
}
r[0].total === a.total && r.push(a);
return r;
}, []);
document.write("<pre>optimum: " + JSON.stringify(optimum, 0, 4) + "</pre>");
document.write("<pre>result: " + JSON.stringify(result, 0, 4) + "</pre>");
更新超过两个controllers/items
function getResult() {
function add(a, b) { return a + b; }
function check(count, constraint) {
return function (b, i) {
return !b || b <= count * constraint[i];
};
}
function iter(data, count, level) {
var temp;
count[level] = count[level] || 0;
count = count.slice();
if (level + 1 === constraints.items.length) {
while (!data.every(check(count[level], constraints.items[level].data))) {
count[level]++;
}
temp = {
count: count,
cost: count.map(function (a, i) {
return a * constraints.items[i].cost;
})
};
temp.total = temp.cost.reduce(add, 0);
result.push(temp);
return;
}
do {
iter(data, count, level + 1);
if (!data.reduce(add, 0)) {
break;
}
data = data.map(function (a, j) {
return Math.max(0, a - constraints.items[level].data[j]);
});
count[level]++;
} while (true);
}
var result = [];
iter(constraints.requirements.data.slice(), [], 0);
return result;
}
var constraints = {
requirements: { data: [8, 2, 15, 4], optimum: 'min' },
items: [
{ data: [10, 2, 3, 4], cost: 200 },
{ data: [3, 1, 2, 3], cost: 120 },
{ data: [1, 1, 1, 1], cost: 75 }
]
},
result = getResult(),
optimum = result.reduce(function (r, a, i) {
if (!i || a.total === Math[constraints.requirements.optimum](r[0].total, a.total)) {
return [a];
}
r[0].total === a.total && r.push(a);
return r;
}, []);
document.write("<pre>optimum: " + JSON.stringify(optimum, 0, 4) + "</pre>");
document.write("<pre>result: " + JSON.stringify(result, 0, 4) + "</pre>");
我的项目遇到了问题。我有不同类型的控制器,它们提供不同的输入和输出端口。我有所需的分数。我需要一些代码来生成控制器的数量和类型,具体取决于所需的点 + 一些应该分配为最便宜组合的备用点。
例如,我有一个系统需要:
- 数字输出点=8
- 模拟输出点=2
- 数字输入点=15
- 模拟输入点数=4
我需要的是每个 input/output 节省 15% :
我有的是:
- 控制器 1 提供:
- 3 个数字输入
- 2 个模拟输出
- 10 个数字输出
- 4 个模拟输入
- 控制器 2 提供:
- 2 个数字输入
- 1 个模拟输出
- 3 个数字输出
- 3 个模拟输入
控制器1的价格是200$,控制器2的价格是120$。
如何在 excel 或使用 javascript 开始编写此代码?
首先,您可以考虑一种数据结构,它使所有数据都具有可比性和可迭代性。
Raw data
requirement controller 1 controller 2 cost minimum 200 120 digital output 8 10 3 analog output 2 2 1 digital input 15 3 2 analog input 4 4 3
该代码为您提供了一个数组,其中包含两个控制器和最佳组合的所有可能组合。
function getCount() {
function check(count, constraint) { return function (b, i) { return b <= count * constraint[i]; }; }
function getCost(item, count) { return constraints.items[item].cost * count; }
var i = 0, count, data, o, result = [];
do {
count = 0;
data = constraints.requirements.data.map(function (a, j) {
return a - i * constraints.items[0].data[j];
});
while (!data.every(check(count, constraints.items[1].data))) {
count++;
}
o = { count: [i, count], cost: [getCost(0, i), getCost(1, count)] };
o.total = o.cost.reduce(function (a, b) { return a + b; }, 0);
result.push(o);
i++;
} while (count);
return result;
}
var constraints = {
requirements: { data: [8, 2, 15, 4], optimum: 'min' },
items: [
{ data: [10, 2, 3, 4], cost: 200 },
{ data: [3, 1, 2, 3], cost: 120 }
]
},
result = getCount(),
optimum = result.reduce(function (r, a, i) {
if (!i || a.total === Math[constraints.requirements.optimum](r[0].total, a.total)) {
return [a];
}
r[0].total === a.total && r.push(a);
return r;
}, []);
document.write("<pre>optimum: " + JSON.stringify(optimum, 0, 4) + "</pre>");
document.write("<pre>result: " + JSON.stringify(result, 0, 4) + "</pre>");
更新超过两个controllers/items
function getResult() {
function add(a, b) { return a + b; }
function check(count, constraint) {
return function (b, i) {
return !b || b <= count * constraint[i];
};
}
function iter(data, count, level) {
var temp;
count[level] = count[level] || 0;
count = count.slice();
if (level + 1 === constraints.items.length) {
while (!data.every(check(count[level], constraints.items[level].data))) {
count[level]++;
}
temp = {
count: count,
cost: count.map(function (a, i) {
return a * constraints.items[i].cost;
})
};
temp.total = temp.cost.reduce(add, 0);
result.push(temp);
return;
}
do {
iter(data, count, level + 1);
if (!data.reduce(add, 0)) {
break;
}
data = data.map(function (a, j) {
return Math.max(0, a - constraints.items[level].data[j]);
});
count[level]++;
} while (true);
}
var result = [];
iter(constraints.requirements.data.slice(), [], 0);
return result;
}
var constraints = {
requirements: { data: [8, 2, 15, 4], optimum: 'min' },
items: [
{ data: [10, 2, 3, 4], cost: 200 },
{ data: [3, 1, 2, 3], cost: 120 },
{ data: [1, 1, 1, 1], cost: 75 }
]
},
result = getResult(),
optimum = result.reduce(function (r, a, i) {
if (!i || a.total === Math[constraints.requirements.optimum](r[0].total, a.total)) {
return [a];
}
r[0].total === a.total && r.push(a);
return r;
}, []);
document.write("<pre>optimum: " + JSON.stringify(optimum, 0, 4) + "</pre>");
document.write("<pre>result: " + JSON.stringify(result, 0, 4) + "</pre>");