我有一个(理论上)网络,有N个节点,每个节点都有自己的固定位置.每个节点每个周期发送一条消息,需要直接或通过其他节点到达根节点.
从节点A向节点B发送消息的能量成本是它们之间的距离,平方.
挑战在于如何以树形格式链接这些节点以产生最节能的网络.
例如,有两种可能的方式来链接这些节点,左边的节点更节能.
我正在研究遗传算法来解决这个问题,但我想知道是否有人有任何其他想法,或者知道任何相关的开源代码.
编辑:网络的另一个方面,我忘了提到,每个节点都是电池供电的.因此,如果我们通过同一节点路由太多消息,那么该节点的电池将耗尽,导致网络出现故障.网络的能效是通过在任何节点电池耗尽之前可以从每个节点成功传输到根节点的消息来衡量的.
编辑#2:对于问题原始文本中的遗漏,我很抱歉.不管怎么说,你之前的一些答案并不是我想要的,但我不熟悉MST算法,所以感谢你告诉我它们.
为了让事情更清楚,让我补充一点:
所有节点每个周期发送一个自己的消息,包括内部节点.内部节点还负责中继它们收到的任何消息.这增加了电池的压力,如果他们发送了他们自己的附加信息.目标是在任何节点电池耗尽之前最大化循环次数.
我正在使用以下代码舍入到2dp:
sprintf(temp,"%.2f",coef[i]); //coef[i] returns a double
Run Code Online (Sandbox Code Playgroud)
它成功地将6.666舍入到6.67,但在舍入5.555时它无法正常工作.它返回5.55,而它应该(至少在我看来)返回5.56.
当下一个数字是5时,我怎样才能将它弄圆?即返回5.56.
编辑:我现在意识到这种情况正在发生,因为当我用cin输入5.555时它会被保存为5.554999997.
我将尝试分两个阶段 - 首先是3dp然后是2dp.还有其他(更优雅)的想法吗?
如何以更好的运行时间计算功率?
例如2 ^ 13.
我记得在某个地方看到它与以下计算有关:
2 ^ 13 = 2 ^ 8*2 ^ 4*2 ^ 1
但我看不出如何计算等式右边的每个分量然后乘以它们会对我有所帮助.
有任何想法吗?
编辑:我的意思是任何基础.您在下面提到的算法,特别是"通过平方展示",如何改善运行时/复杂度?
我试图理解静态分配对象的指针是如何工作的以及它们可能出错的地方.
我写了这段代码:
int* pinf = NULL;
for (int i = 0; i<1;i++) {
int inf = 4;
pinf = &inf;
}
cout<<"inf"<< (*pinf)<<endl;
Run Code Online (Sandbox Code Playgroud)
我感到很惊讶,因为我认为inf当程序离开块并指针指向不再存在的东西时会消失.我想在尝试访问时出现分段错误pinf.在程序的哪个阶段会inf死?
我试图找出一种算法来找到数字列表中最高的2个数字.
最高的数字可以在n-1阶段找到,也许是通过冒泡排序的第一步或沿着那些线的东西.对我而言,似乎找到次高的数字也可以在平均总共1.5n的比较中找到.
我的教授给我们做了一个功课,写了一个算法,在n + log(n)比较中找到最高的2个数字.这甚至可能吗?有什么想法,建议吗?
编辑:当我说n + log(n)时,我不是指O(n + log n),而是指n + log n
我正在尝试计算两个字符串之间存在的最长可能子序列的数量。
例如字符串 X =“efgefg”;字符串 Y =“efegf”;
输出:最长公共序列的数量为:3(即:efeg、efef、efgf - 这不需要由算法计算,仅在此处显示以进行演示)
我已经根据这里的一般思想使用动态规划在 O(|X|*|Y|) 中成功做到了这一点:最便宜的路径算法。
任何人都可以想出一种方法来以更好的运行时间有效地进行这种计算吗?
——针对杰森的评论进行编辑。
我对声明与定义的规则有点模糊.
我在funcs.h中有以下声明:
void sumTotalEnrgyAndClush(Protein &A,Protein &B,double ans[2],double enrgyA[18][18],double enrgyB[18][18]);
Run Code Online (Sandbox Code Playgroud)
请注意,ans [2]在enrgyA和B之前.
在funcs.cpp文件中,定义如下所示:
void sumTotalEnrgyAndClush(Protein &A,Protein &B,double enrgyA[18][18],double enrgyB[18][18],double ans[2])
Run Code Online (Sandbox Code Playgroud)
它编译(通过makefile)并正常工作.
我还注意到,如果我删除声明,编译器似乎管理得很好.
为什么参数顺序的变化不重要?难道最后3个项目都是指针,所以顺序的差异无关紧要吗?
我有一个带有文本框的表单,该表单只能接受1980 - 2011年间的4位数年份值.我确信应该有一个简单的c#验证控件来实现这个验证检查,但我似乎无法找到它.
有什么建议?
我有以下代码:
Some functions:
A::A(int i_a) {cout<<"int Ctor\n";} //conversion constructor
void h(double d) {cout<<"double param\n";} //f1
void h(A a) {cout<<"A param\n";} //f2
Run Code Online (Sandbox Code Playgroud)
在主要功能:
h(1);
Run Code Online (Sandbox Code Playgroud)
h(1)调用的函数是f1.
我的问题是它为什么选择这样称呼它.1是一个int,因此需要隐式转换为double.它可以使用上面定义的转换构造函数轻松地将int转换为A.为什么我没有收到错误?什么是铸造的优先规则?
Nb我已经发布了我认为有必要回答这个问题的代码,但是下面我发布了整个代码:
#include <iostream>
using namespace std;
class B;
class A {
public:
explicit A(const B&) {cout<<"Ctor through B\n";}
A() {cout<<"Default Ctor\n";}
A(int i_a) {cout<<"int Ctor\n";}
operator int() {cout<<"A => int\n"; return 2;}
};
class B {
public:
operator A() const {cout<<"B => A\n"; A a; return a;}
};
void h(double d) {cout<<"double param\n";}
void h(A …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一些谓词来解决以下任务(learnprolognow.com)
假设我们具有以下事实的知识库:
tran(eins,one).
tran(zwei,two).
tran(drei,three).
tran(vier,four).
tran(fuenf,five).
tran(sechs,six).
tran(sieben,seven).
tran(acht,eight).
tran(neun,nine).
Run Code Online (Sandbox Code Playgroud)
写一个谓词listtran(G,E),它将德语数字单词列表转换为相应的英语数字单词列表。例如:
listtran([eins,neun,zwei],X).
Run Code Online (Sandbox Code Playgroud)
应该给:
X = [one,nine,two].
Run Code Online (Sandbox Code Playgroud)
我写过:
listtran(G,E):- G=[], E=[].
listtran(G,E):- G=[First|T], tran(First, Mean), listtran(T, Eng), E = [Mean|Eng).
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误:编译时出现“非法开学”。有什么建议么?
algorithm ×4
c++ ×4
c# ×1
declaration ×1
energy ×1
exponent ×1
graph-theory ×1
lcs ×1
pointers ×1
printf ×1
prolog ×1
rounding ×1
treenode ×1
validation ×1
winforms ×1