我试图在优化问题中找到两个数组的无支配值。
我有两个数组,lost_bars_array
和prices_array
。我想要做的是最小化丢失的条形,并最大限度地降低价格。我想获得一个名为no_dominated
的最终数组,其中包含两个数组的非支配值的索引。这很容易理解。让我用一个例子解释一下。
我们有两个阵列:
理论过程如下:
1。获取第一个值
2。获取第二个(索引#1)并查看它是否比第一个更好的解决方案。这意味着我们要看第二个是否有丢失的杠杆和更大的价格。事实并非如此,它有很少的酒吧,而且价格也很低,所以我们不能说这是一个更好的解决方案。我们将其保存为可行的解决方案
3。现在是下一个,索引#2,这个改进了索引#1的解决方案,因为它有少量丢失的brs和更大的价格。但它并没有改善索引#0,因为它的LESS损失很少但价格也很低。因此,我们将索引#0和索引#2保存为可能的解决方案
4。索引#3和#4有更多丢失的条形和更低的价格,因此请将它们作为可能的解决方案拒绝。
5。最后,索引#5比索引#0有更少的条形和更多的价格,因此,索引#0的解决方案被拒绝,最终的无支配值将是索引#2和索引#5中的索引。
这是我到目前为止所尝试过的。
#include <stdio.h>
int main(int argc, char** argv)
{
int lost_bars_array[] = {15, 10, 8, 15, 17, 9};
int prices_array[] = {35, 25, 30, 10, 15, 36};
int no_dominated[6];
int cont = 6;
for (int actual_pos = 0; actual_pos < cont; actual_pos++)
{
if (actual_pos == 0)
{
no_dominated[actual_pos] = actual_pos;
}
else
{
// Here's where I've the problems, I dont know how to handle the arrays
for (int p = 0; p < actual_pos; p++)
{
if (lost_bars_array[p] > lost_bars_array[p + 1] &&
prices_array[p] < prices_array[p + 1])
{
no_dominated[p] = p;
}
}
}
}
printf("\nThe non-dominated solutions index are: %d");
for (int i = 0; i < 6; i++)
{
printf(" %d ", no_dominated[i]);
}
printf("\n");
return 0;
}
代码应输出索引2 5
作为解决方案。
我希望我能正确解释问题。
任何帮助表示赞赏。提前谢谢。
答案 0 :(得分:1)
下面的程序可以得到你想要的,但我只针对你的具体情况进行了测试;如果只有一个主导解决方案,或者在其他一些特殊情况下,它可能会失败。但是你可以从中做到这一点。
两个注释:
你忘了包含潜在的解决方案;布尔&&
只会保存保证更好的解决方案
最后一个双循环是一个黑客攻击;哈希会更容易(解决方案索引将是哈希),但我认为这需要c ++或额外的库。
代码:
#include <stdio.h>
int main()
{
int lost_bars_array[] = {15,10,8,15,17,9};
int prices_array[] = {35,25,30,10,15,36};
int no_dominated[6];
int cont = 6;
int ndom = 0;
no_dominated[ndom] = 0;
ndom++;
for (int actual_pos = 1; actual_pos < cont; actual_pos++) {
int ntmp = ndom;
for(int p = 0; p < ntmp; p++) {
if (lost_bars_array[no_dominated[p]] > lost_bars_array[actual_pos] &&
prices_array[no_dominated[p]] < prices_array[actual_pos]) {
// Replace with a better solution
no_dominated[p] = actual_pos;
} else if (lost_bars_array[no_dominated[p]] > lost_bars_array[actual_pos] ||
prices_array[no_dominated[p]] < prices_array[actual_pos]) {
// Save as potential solution
no_dominated[ndom] = actual_pos;
ndom++;
}
}
}
// Remove double solutions
for (int i = 0; i < ndom; i++) {
for (int j = i; j < ndom; j++) {
if (no_dominated[i] == no_dominated[j]) {
ndom--;
}
}
}
printf("\nThe non-dominated solutions index are:");
for(int i = 0; i < ndom; i++)
printf(" %d ", no_dominated[i]);
printf("\n");
return 0;
}
答案 1 :(得分:1)
如果您有n个指标来比较您的数据(在您的实现中,n = 2个数组与数据最大化/最小化),您最多可以有n(2)个非支配元素。
因此,您可以在每个数组中找到max / min元素和索引,这些将是您的解决方案(如果两个索引相同,只添加其中一个)。
你根本不必担心统治,no_dominated
不必具有输入的大小。它的大小将介于1和您的度量/数据阵列数之间(在示例中为1或2)